如何修复getActionBar方法可能会产生java.lang.NullPointerException

AJW*_*AJW 73 android toolbar android-actionbar

我正在使用工具栏作为活动中的操作栏.我正在尝试将该方法添加getActionBar().setDisplayHomeAsUpEnabled(true);到Activity.java文件中以用于较旧设备的向上导航.

该方法在Android Studio中生成以下错误消息:

方法调用可能会产生java.lang.NullPointerException

工具栏上的向上导航在较新的设备上运行良好...现在我正在试图弄清楚如何确保它适用于旧设备.请指教.

来自build.gradle:

dependencies {
   compile "com.android.support:appcompat-v7:22.1.0"
}
Run Code Online (Sandbox Code Playgroud)

来自AndroidManifest.xml:

android:theme="@style/Theme.AppCompat.NoActionBar.FullScreen" 
Run Code Online (Sandbox Code Playgroud)

来自styles.xml

<style name="Theme.AppCompat.NoActionBar.FullScreen" parent="AppTheme">
<item name="android:windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="android:windowFullscreen">true</item>
Run Code Online (Sandbox Code Playgroud)

来自Activity.java

public class CardViewActivity extends AppCompatActivity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.cardviewinput);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

    if (toolbar != null) {
        // Up navigation to the parent activity for 4.0 and earlier
        getActionBar().setDisplayHomeAsUpEnabled(true);
        toolbar.setNavigationIcon(R.drawable.ic_action_previous_item);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });
    }

}
Run Code Online (Sandbox Code Playgroud)

Ada*_*ani 126

实际上Android Studio没有向您显示"错误消息",这只是一个警告.

一些答案建议使用断言,Dalvik运行时默认关闭断言,所以你必须实际打开它才能真正做某事.在这种情况下(断言被关闭),你实际上在做的只是欺骗Android Studio而不向你显示警告.另外,我不想在生产代码中使用"断言".

在我看来,你应该做的很简单.

if(getActionBar() != null){
   getActionBar().setDisplayHomeAsUpEnabled(true);
}
Run Code Online (Sandbox Code Playgroud)

更新: 如果您正在使用Action Bar的支持库版本,则应将getActionBar()替换为getSupportActionBar().

if(getSupportActionBar() != null){
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么android studio不对其他方法给出相同的警告,比如getSupportActionBar().setTitle()? (4认同)
  • 虽然我最初使用assert来"解决"警告,但我同意你推荐的代码比assert hack更好.答案已经被赞成并被接受.请注意,我使用AppCompatActivity作为类,因此我必须在我的解决方案中使用getSupportActionBar()而不是上面显示的getActionBar(). (2认同)

Bog*_*rac 34

首先,您需要将工具栏设置为支持ActionBar.然后,如果你确定它会一直存在,那就把它断言为!= null.这将告诉编译器它不会为null,因此null检查通过.

@Override
protected void onCreate(Bundle savedInstanceState)
{
   super.onCreate(savedInstanceState);
   setContentView(R.layout.cardviewinput);

   Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
   setSupportActionBar(toolbar);

   assert getSupportActionBar() != null;
   getSupportActionBar().setDisplayHomeAsUpEnabled(true); // it's getSupportActionBar() if you're using AppCompatActivity, not getActionBar()
}
Run Code Online (Sandbox Code Playgroud)


小智 8

谢谢安德鲁的回答.如果你有一个Nav Drawer或其他使用getSupportActionBar()的东西你需要添加断言getSupportActionBar()!= null;

和平,

例:

@Override
public void setTitle(CharSequence title) {
    mTitle = title;
    assert getSupportActionBar() != null;
    getSupportActionBar().setTitle(mTitle);
}
Run Code Online (Sandbox Code Playgroud)

  • 这对生产有效,还是仅用于测试? (3认同)