Activity的onCreate方法出现NullPointerException问题排查
分析NullPointerException:LinearLayout.addView()空对象引用问题
兄弟,你的问题根源一目了然——你在调用setContentView()之前就执行了findViewById()!
为什么会触发空指针?
Android Activity的布局加载逻辑是这样的:只有当你调用setContentView()(不管是传入布局文件ID还是代码创建的View)之后,Activity才会把布局加载到窗口的视图树中,这时候findViewById()才能在这个视图树里找到对应的控件。
你现在的代码顺序完全搞反了:先去查找R.id.settings_linear_layout,但这时候Activity还没有加载任何布局,自然找不到这个LinearLayout,导致linearLayout变量是null,后续调用linearLayout.addView(listView)的时候,就会抛出"对空对象引用调用addView方法"的异常。
修复方案分两种情况:
情况1:你有对应的布局文件(比如activity_settings.xml,里面包含settings_linear_layout)
调整代码顺序,先加载布局,再查找控件:
public class SettingsActivity extends AppCompatActivity{ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 第一步:先加载布局文件,让Activity拥有完整的视图树 setContentView(R.layout.activity_settings); // 第二步:现在才能成功找到布局里的LinearLayout LinearLayout linearLayout = findViewById(R.id.settings_linear_layout); // 第三步:创建ListView并配置适配器 ListView listView = new ListView(this); listView.setAdapter(new ArrayAdapter<String>(this,R.layout.settings_list_items_layout,R.id.settings_text_view_id,settingsItem)); // 第四步:将ListView添加到LinearLayout中 linearLayout.addView(listView); } }
情况2:完全通过代码动态创建布局(没有xml布局文件)
如果不想用xml布局,那你需要先手动创建LinearLayout,配置好属性后再添加ListView,最后设置为Activity的内容:
public class SettingsActivity extends AppCompatActivity{ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 1. 动态创建LinearLayout并配置属性 LinearLayout linearLayout = new LinearLayout(this); linearLayout.setOrientation(LinearLayout.VERTICAL); // 设置垂直布局 // 让LinearLayout占满整个屏幕 linearLayout.setLayoutParams(new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT )); // 2. 创建ListView并配置适配器 ListView listView = new ListView(this); listView.setAdapter(new ArrayAdapter<String>(this,R.layout.settings_list_items_layout,R.id.settings_text_view_id,settingsItem)); // 给ListView设置布局参数 listView.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT )); // 3. 将ListView添加到LinearLayout linearLayout.addView(listView); // 4. 最后把LinearLayout设置为Activity的内容视图 setContentView(linearLayout); } }
额外注意事项
- 永远牢记:
findViewById()必须在布局加载完成后调用,比如Activity的onCreate()里的setContentView()之后,或者Fragment的onViewCreated()方法中。 - 顺便检查下
settingsItem变量是否已经正确初始化,如果它是null,后续ArrayAdapter也会出现问题,不过这次的空指针异常不是来自这里。
内容的提问来源于stack exchange,提问作者PAZHAMALAI M UEE14227
相关产品推荐
相关产品推荐

