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

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

该方法在 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();
}
});
}


}
63731 次浏览

首先,您需要将工具栏设置为支持 ActionBar。 然后如果你确定它会一直在那里,就断言它是!= 无效。这将告诉编译器它不是 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();
}

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

事实上 Android Studio 并没有给你显示“错误信息”,它只是一个警告。

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

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

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

更新: 如果您使用的是 ActionBar 的支持库版本,那么您应该将 getActionBar ()替换为 getSupportActionBar ()。

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

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

    @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-annotions”。

 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);

或者,您可以将操作栏断言为非 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 (toolbar)应该位于 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 ()