Android中TextView设置setOnClickListener失效致崩溃问题
问题产生原因
核心错误是onCreate生命周期方法内的代码执行顺序错误:
findViewById()的工作逻辑是从当前Activity已经加载的视图树中匹配对应ID的控件实例,在调用setContentView()加载布局文件之前,Activity没有挂载任何视图,此时调用findViewById()查找所有控件都会返回null。- 你的代码中先执行了控件查找、绑定点击事件的逻辑,最后才调用
setContentView(R.layout.activity_main)加载布局,导致numbers等TextView变量全为null,对null对象调用setOnClickListener()方法就触发了日志中的空指针崩溃。 - 你的XML布局配置本身没有问题,完全符合课程要求的不使用XML
onClick属性的规则,不需要修改布局文件。
修复方案
调整onCreate方法内的代码执行顺序,永远先加载布局,再查找控件、绑定交互逻辑:
- 把
setContentView(R.layout.activity_main);这行代码移动到super.onCreate(savedInstanceState)之后,所有findViewById()调用之前。 - 修正后的
MainActivity.java核心代码如下:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 第一步:先加载当前页面的布局文件 setContentView(R.layout.activity_main); // 第二步:布局加载完成后,再从视图中查找对应控件实例 TextView numbers = (TextView)findViewById(R.id.numbers); TextView family = (TextView)findViewById(R.id.family); TextView colors = (TextView)findViewById(R.id.colors); TextView phrases = (TextView)findViewById(R.id.phrases); // 第三步:给非空的控件实例绑定点击事件 numbers.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, NumbersActivity.class); startActivity(intent); } }); // family、colors、phrases三个控件的点击跳转逻辑可按相同方式后续补充 } }
- 补充注意:后续给其余三个TextView绑定点击事件时,同样要保证代码在
setContentView()执行之后,否则会出现相同的空指针崩溃。
内容的提问来源于stack exchange,提问作者Maitreyi Paweria
相关产品推荐
相关产品推荐

