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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何修复getActionBar方法可能会产生java.lang.NullPointerException相关的知识,希望对你有一定的参考价值。

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

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

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

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

来自build.gradle:

dependencies {
   compile "com.android.support:appcompat-v7:22.1.0"
}

来自AndroidManifest.xml:

android:theme="@style/Theme.AppCompat.NoActionBar.FullScreen" 

来自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>

来自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();
            }
        });
    }

}
答案

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

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

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

if(getActionBar() != null){
   getActionBar().setDisplayHomeAsUpEnabled(true);
}

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

if(getSupportActionBar() != null){
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
另一答案

或者,您可以将操作栏断言为非null。在调用操作栏之前添加断言,如下所示

assert getSupportActionBar() != null;

因此,最终片段如下:

    setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
    assert getSupportActionBar() != null;
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
另一答案

试试这个 :

setSupportActionBar (toolbar);
if(getSupportActionBar () != null) {
assert getSupportActionBar () != null;
getSupportActionBar ().setDisplayHomeUpEnabled(true);
}

请注意,setSupportActionBar(工具栏)应该在getSupportActionBar()之前。

另一答案
  if(getSupportActionBar() != null){
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }
    OR

MainActivity extends AppCompatActivity替换为public class MainActivity extends AppCompatActivity

另一答案

只需检查getSupportActionBar不等于null

    setSupportActionBar(toolbar);

    if(getSupportActionBar() != null) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setTitle("Daily Shopping List");
    }
另一答案

如果您正在导入

android.app.ActionBar 

你必须使用getActionBar()

如果你是进口的话

android.support.v7.app.ActionBar

使用getSupportActionBar()

另一答案

首先,您需要将工具栏设置为支持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()
}
另一答案

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

和平,

例:

@Override
public void setTitle(CharSequence title) {
    mTitle = title;
    assert getSupportActionBar() != null;
    getSupportActionBar().setTitle(mTitle);
}
另一答案

试试这个 :

private ActionBar getActionBar() {
    return ((AppCompatActivity) getActivity()).getSupportActionBar();
}
另一答案

我所做的是覆盖我的基础Activity中的getSupportActionBar()方法并添加一个@NonNull注释。这样,我只在基本活动中得到一个lint警告,关于我如何使用@NonNull注释来获得具有@Nullable注释的东西。

    @NonNull
    @Override
    public ActionBar getSupportActionBar() {
        // Small hack here so that Lint does not warn me in every single activity about null
        // action bar
        return super.getSupportActionBar();
    }
另一答案

我创建了一个通用类,例如:

public final class Cast
{
    private Cast() {}

    /**
     * Helps to eliminate annoying NullPointerException lint warning.
     */
    @android.support.annotation.NonNull
    public static <T> T neverNull(T value)
    {
        return value;
    }
}

然后我可以将它用于任何带有NullPointerException警告的调用,我确信它永远不会发生,例如

final ActionBar actionBar = Cast.neverNull(getSupportActionBar());
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);

附:不要忘记将“com.android.support:support-annotations”添加到您的gradle文件中。

另一答案

assert getSupportActionBar() != null;之前添加getSupportActionBar().setDisplayHomeAsUpEnabled(true);

另一答案
 if(actionBar != null) {
  actionBar.setHomeButtonEnabled(true);
  actionBar.setBackgroundDrawable(ContextCompat.getDrawable(mContext,
                                  R.drawable.action_bar_gradient));
 }
另一答案

使用这个主题:android:theme="@style/Theme.AppCompat.Light.NoActionBar"

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle("Title");
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setHomeAsUpIndicator(R.drawable.ic_action_previous_item);
actionBar.setDisplayHomeAsUpEnabled(true);

以上是关于如何修复getActionBar方法可能会产生java.lang.NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

IntelliJ 检查:“方法调用可能会产生 NullPointerException”。建议的修复有意义吗?

Java -- 每日一问:什么情况下Java程序会产生死锁?如何定位修复?

getActionBar() 返回 null

如何找到并修复崩溃的原因

getActionBar()为null的解决方法总结(引用他人)

DLL是啥文件?丢失会出现啥后果和如何修复?