NullPointerException:尝试调用虚方法 'void android.support.v7.app.ActionBar

NullPointerException: Attempt to invoke virtual method 'void android.support.v7.app.ActionBar

有许多问题处理此错误。这些问题的解决方案是:
- 让 MainActivity class 扩展 AppCompatActivity
- 调用 getSupportActionBar(),而不是 getActionBar()

我已经在做这些了。

我发现 appcompat-v7 22.1.1 和 appcompat-v7 23.1.1 有所不同。 我在 23 中收到错误。在 22 中它工作正常。

单步执行调试器中的代码,我在 AppCompatDelegateImplV7.intWindowDecorActionBar() 中看到, mHasActionBar为false,导致mActionBar没有被实例化

单步执行 22.1.1 中的代码,代码略有不同,但最终,我看到 mHasActionBar 为真,因此代码有效。

我该如何处理?

import android.support.v7.app.ActionBar;
...
public class MainActivity extends AppCompatActivity  implements ...

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...    
    ActionBar actionBar = getSupportActionBar();

    actionBar.setDisplayHomeAsUpEnabled(true);
    actionBar.setHomeAsUpIndicator(R.drawable.ic_drawer);
    ....
}

您可能想尝试将 NoActionBar 主题应用到清单中的应用程序,并在布局 xml 文件中使用工具栏而不是操作栏。

Theme.AppCompat.Light.NoActionBar
  1. 将工具栏添加到布局 xml 文件

    <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar_player"
            android:layout_width="match_parent"
            android:layout_height="?android:attr/actionBarSize"
            style="@style/Topeka.TextAppearance.Title"
            android:background="@color/topeka_primary"
            android:elevation="@dimen/elevation_header">

然后在Java代码中,将其设置为Actionbar

 private void setUpToolbar(Player player) {
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_player);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
    ((TextView) toolbar.findViewById(R.id.title)).setText(getDisplayName(player));
}