Android应用使用导航栏时如何解决Java空指针异常
这个空指针问题我在项目里碰过好多次,核心就是调用ActionBar.setDisplayHomeAsUpEnabled(true)时,ActionBar对象本身是空的。下面是几个按优先级排序的解决办法,你一步步试:
检查Activity的主题是否支持ActionBar
首先确认你的drawerActivity使用的主题是包含ActionBar的,比如Theme.AppCompat.Light.DarkActionBar,绝对不能用Theme.AppCompat.Light.NoActionBar或者Theme.Material.NoActionBar这类隐藏ActionBar的主题。你可以在AndroidManifest.xml里对应Activity的android:theme属性查看,或者在styles.xml里检查应用的默认主题配置。改用AppCompat兼容库的方式获取ActionBar(如果用AppCompatActivity)
如果你继承的是AppCompatActivity,别用getActionBar(),一定要用getSupportActionBar()——前者在兼容库环境下大概率会返回null。修改后的代码应该是这样:@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_drawer); // 用getSupportActionBar()替代getActionBar() ActionBar actionBar = getSupportActionBar(); // 必须加null判断,防止极端情况 if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); } }确保调用顺序正确
绝对不能在setContentView()之前调用ActionBar相关方法!必须先加载Activity的布局,确保系统已经初始化了ActionBar组件。正确的顺序永远是:super.onCreate()→setContentView()→ 操作ActionBar。如果用自定义Toolbar替代系统ActionBar
如果你在布局里用了自定义Toolbar来代替系统ActionBar,那得先把Toolbar设置为Activity的ActionBar,再去调用相关方法:@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_drawer); // 先找到自定义Toolbar Toolbar toolbar = findViewById(R.id.your_toolbar_id); // 设置为Activity的ActionBar setSupportActionBar(toolbar); // 再获取并配置ActionBar属性 ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); } }这种情况下,记得把主题改成不带ActionBar的(比如
Theme.AppCompat.Light.NoActionBar),避免系统ActionBar和自定义Toolbar冲突。
内容的提问来源于stack exchange,提问作者Abhishek Bagdare

