67

我正在尝试使用ActionBarSherlock库为我的 Android 应用程序中的选项卡提供向后兼容的 ActionBar 支持,因此我下载了最新版本,构建了演示并运行了它。

如果你去操作栏,然后选择标签导航,它每次都会崩溃。这是堆栈跟踪:

09-03 02:34:47.940: ERROR/AndroidRuntime(3078): FATAL EXCEPTION: main  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.actionbarsherlock.sample.demos/com.actionbarsherlock.sample.demos.app.ActionBarTabNavigation}: java.lang.NullPointerException  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1748)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1764)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at android.app.ActivityThread.access$1500(ActivityThread.java:122)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1002)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at android.os.Handler.dispatchMessage(Handler.java:99)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at android.os.Looper.loop(Looper.java:132)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at android.app.ActivityThread.main(ActivityThread.java:4025)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at java.lang.reflect.Method.invokeNative(Native Method)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at java.lang.reflect.Method.invoke(Method.java:491)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at dalvik.system.NativeStart.main(Native Method)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): Caused by: java.lang.NullPointerException  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at com.actionbarsherlock.sample.demos.app.ActionBarTabNavigation.onCreate(ActionBarTabNavigation.java:19)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1712)  
09-03 02:34:47.940: ERROR/AndroidRuntime(3078): ... 11 more  

在解决此问题之前,我无法继续使用我的应用程序。我写了一堆代码,在我的应用程序中设置了操作栏,并尝试运行它,但由于getSupportActionBar()调用时返回 null 值,它与 NPE 一起崩溃。

相关代码实际上在库的演示中:

public class ActionBarTabNavigation extends FragmentActivity implements ActionBar.TabListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getSupportFragmentManager()
            .beginTransaction()
            .add(android.R.id.content, FragmentStackSupport.CountingFragment.newInstance(0))
            .commit();

        getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        for (int i = 0; i < 3; i++) {
            ActionBar.Tab tab = getSupportActionBar().newTab();
            tab.setText("Tab " + i);
            tab.setTabListener(this);
            getSupportActionBar().addTab(tab);
        }
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        getSupportFragmentManager()
            .beginTransaction()
            .replace(android.R.id.content, FragmentStackSupport.CountingFragment.newInstance(tab.getPosition()))
            .commit();
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    }
}
4

14 回答 14

83

您应该将 Sherlock 主题添加到您的应用程序中

<application android:icon="@drawable/icon" android:label="@string/app_name"
        android:debuggable="false" android:theme="@style/Theme.Sherlock">
于 2011-09-04T17:23:00.657 回答
62

我在 Android ICS 4.0.4 上遇到了同样的问题。我requestWindowFeature(Window.FEATURE_NO_TITLE);在 FragmentActivity 上使用,但这将 ActionBar 隐藏在 ICS+ 设备上,导致它getSupportActionBar()为空。

简单地删除了:
requestWindowFeature(Window.FEATURE_NO_TITLE);

它就像一个魅力。

希望它可以帮助某人。

于 2012-04-12T13:30:35.390 回答
38

在 Honeycomb+ 设备上会发生这种情况的另一个原因是该windowNoTitle属性是按照您的样式设置的。摆脱它,因为 ActionBarSherlock 会在预蜂窝设备中为您自动删除它。

于 2011-12-12T19:05:39.593 回答
15

您可能会从中获得 null 的另一个原因getSupportActionBar()是尝试setContentView(R.layout.main)在添加片段之前或在示例中调用它。

我重构了 oncreate 并错误地放在getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);后面super.onCreate(savedInstanceState);

于 2011-11-26T16:24:17.453 回答
12

这是一个有趣的问题:不要将主题设置为 -

    android:theme="@style/Theme.NoActionbar"
于 2013-09-19T20:26:21.310 回答
6

您可能会得到 null 的另一个原因getSupportActionBar()是当活动在 Honeycomb+ 上的 TabHost 中使用时。

于 2012-07-11T09:51:24.157 回答
5

取决于您编写代码的方式。确保在调用它之前先设置了工具栏。

  mToolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(mToolbar);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
于 2015-08-08T04:10:30.340 回答
2

我只是在清单中改变了

android:theme="@style/AppTheme.NoActionBar"

到:

  android:theme="@style/AppTheme"

错误消失了

于 2016-12-08T09:31:04.193 回答
1

每当我们使用 sherlock 库设置 customview 时。只需删除此 requestWindowFeature(Window.FEATURE_NO_TITLE); 像这样我们使用sherlock bar库制作customview ..

            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 
    getSupportActionBar().setCustomView(R.layout.header_sherlock_xmllayout);
    header_tvleft = (TextView) findViewById(R.id.header_tvleft);
    header_tvleft.setText("Back");
于 2013-07-10T10:57:10.807 回答
1

在(愚蠢地)忘记打电话后我遇到了这个问题super.onCreate()

于 2014-01-24T20:41:29.280 回答
1

您在清单中被声明为 Theme.Sherlock 或 Theme.Sherlock.Light 作为您的活动或应用程序主题,或者使用继承自这两者之一的自定义主题

例子:-

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.Sherlock.Light" >

你也可以使用深色主题:-

android:theme="@style/Theme.Sherlock"
于 2014-05-21T06:57:52.430 回答
1

我在 Android Manifest 文件中添加android:theme="@android:style/Theme.Dialog"了我的活动,试图使其成为对话活动。这也将删除操作栏,因此是一个空指针。删除它或不要调用getSupportActioBar

于 2015-08-13T22:13:35.317 回答
0

在我的项目中添加了一个库后,我遇到了这个问题。如果您在清单中使用相同的主题名称,补救措施是查看库并删除任何样式名称“AppTheme”。我的 Galaxy S4 果冻豆没有冲突,而我的 Galaxy Tab 有冲突。

于 2014-01-20T17:10:20.727 回答
0

我犯了这个错误是因为我在片段 xml 文件中添加了工具栏。在片段中查找工具栏的代码是这样的:getActivity().findViewByid(id...),但是我的工具栏在片段 xml 文件中,所以没有找到工具栏,也没有工具栏蜂鸣 setSipprotActionBar() 也没有得到当 getSupportActionBar(). 所以请记住:不要将工具栏放在片段的 xml 文件中。

于 2016-09-16T13:03:26.717 回答