Android findViewById空指针问题:按钮正常但EditText获取为null
为什么按钮能正常获取,但EditText会出现NullPointerException?
嗨,我来帮你揪出这个问题的根源!你遇到的空指针异常,完全是因为获取EditText的方式错了。
看你点击事件里的这段代码:
EditText txt = (EditText) view.findViewById(R.id.editText);
这里的view是触发点击事件的按钮本身啊!你的EditText和按钮是同一个布局里的同级控件,EditText并不是按钮的子View,所以从按钮这个View里根本找不到EditText,返回的自然是null,调用getText()的时候就会炸出空指针异常了。
那怎么改呢?有两种靠谱的方式:
方式一:提前在Activity里获取EditText(推荐)
直接在onCreate里就把EditText找出来,不用每次点击都去查找,既高效又避免上下文错误:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_settings); // 提前获取EditText,存在局部变量里(也可以定义成Activity的成员变量) final EditText txt = findViewById(R.id.editText); this.findViewById(R.id.button).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(view.getContext(), txt.getText(), Toast.LENGTH_SHORT).show(); } }); ... }
方式二:通过根View查找
如果不想提前获取,也可以在点击事件里获取整个布局的根View,再从根View里找EditText:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_settings); this.findViewById(R.id.button).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { // 获取根布局View再查找EditText EditText txt = (EditText) view.getRootView().findViewById(R.id.editText); Toast.makeText(view.getContext(), txt.getText(), Toast.LENGTH_SHORT).show(); } }); ... }
记住哦,findViewById只会在当前View的子View树里查找控件,所以一定要搞清楚你调用这个方法的View是不是包含目标控件的父容器或者根容器~
内容的提问来源于stack exchange,提问作者Aiden Nox
相关产品推荐
相关产品推荐

