Android Studio中setOnClickListener不生效报空指针异常问题
问题原因
空指针的核心诱因是声明的控件变量未被正确赋值:
你在onCreate生命周期中仅调用了findViewById()方法,但没有将方法返回的控件实例赋值给提前定义的btn1、txt1成员变量,两个变量始终为默认的null值,此时调用setOnClickListener必然触发空指针。
额外排查点:确认activity_main.xml布局文件中对应控件的android:id属性值与代码中传入findViewById的id完全一致,id拼写错误同样会导致findViewById返回null。
修复后的正确代码
public Button btn1; public TextView txt1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 将findViewById返回的控件实例赋值给对应成员变量 txt1 = (TextView) findViewById(R.id.txt1); btn1 = (Button) findViewById(R.id.btn1); btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { txt1.setText("finalyyyyyyyyyyy"); } }); }
注:如果项目compileSdkVersion ≥ 26,
findViewById支持泛型自动类型推断,可以省略手动强转,直接写txt1 = findViewById(R.id.txt1);即可,低版本必须保留强转否则会编译失败。
可选优化方案
如果不想每次重复书写findViewById代码,可以开启视图绑定功能,在模块级build.gradle中添加如下配置,编译后会自动生成对应布局的绑定类,彻底避免id写错、漏赋值导致的空指针问题:
android { ... viewBinding { enabled = true } }
开启后Activity中的写法会更简洁:
private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); binding.btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { binding.txt1.setText("finalyyyyyyyyyyy"); } }); }
内容的提问来源于stack exchange,提问作者Zaid Sh
相关产品推荐
相关产品推荐

