getActionBar()在PreferenceActivity中返回null(AppCompat-v7 21)

时间:2014-10-18 11:15:37

标签: android preferenceactivity

我已经在PreferenceActivity中实现了DoneBar(操作栏中的两个按钮),如v20 sdk示例中所提供的,但在将SDK和AppCompat更新到版本21后,我的应用程序崩溃了

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setDisplayOptions(int, int)' on a null object reference

这是因为getActionBar()返回null。 getSupportActionBar()中没有ActionBarActivity

所以我的问题是如何在PreferenceActivity中获取该操作栏对象,以便我可以在其上应用自定义视图?

解决

经过一些研究后,我设法通过PreferenceFragment使用ActionBarActivity来解决此问题,因此我可以致电getSupportActionBar()

4 个答案:

答案 0 :(得分:17)

我设法通过为我的设置活动指定自定义主题

来解决此问题
<style name="SettingsTheme" parent="style/Theme.AppCompat.Light">
    <item name="android:windowNoTitle">false</item>
    <item name="android:windowActionBar">true</item>
</style>
活动清单中的

和:android:theme="@style/SettingsTheme"

动作栏再次显示在KITKAT和LOLIPOP上,并且(尚未测试过)回到api v11。我测试了它,它在api 10上工作(没有预期的动作栏)。

从lolipop调试开始,FEATURE_NO_TITLE中设置了PhoneWindow.java:3243

   if (a.getBoolean(R.styleable.Window_windowNoTitle, false)) {
        requestFeature(FEATURE_NO_TITLE);

删除FEATURE_ACTION_BAR

[编辑]

但是这个动作栏不是来自物质主题,所以仍然不完美

[EDIT2]

我放弃了Headers,现在我正在使用来自github的PreferenceFragment backport。现在升级到appcompact 21后,我的所有动作栏都是一样的。

答案 1 :(得分:15)

xXx要求我提供示例我是如何完成的:

public class SettingsActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Display the fragment as the main content.
        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, new SettingsFragment())
                .commit();

        // use action bar here
        ActionBar actionBar = getSupportActionBar();
    }

    public static class SettingsFragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle paramBundle) {
            super.onCreate(paramBundle);
            addPreferencesFromResource(R.xml.pref_settings);
        }
    }

}

答案 2 :(得分:7)

当我使用getActionBar()Activity时,

FragmentActivity在API 5.0中返回null。

我将此扩展名解析为ActionBarActivity

public class MainActivity extends ActionBarActivity {

使用getSupportActionBar()ActionBarActivity)时,您必须使用appcompat-v7

答案 3 :(得分:1)

通过这样做解决了问题,你的样式xml应该是这样的。

<强> RES /值/ style.xml

             

<!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">
    <item name="android:windowDisablePreview">true</item>
    <item name="android:windowActionBar">true</item>
    <!-- All customizations that are NOT specific to a particular API-level can go here. -->
</style>

<强> RES /值-V11 / style.xml

<style name="AppBaseTheme" parent="android:Theme.Holo.Light"> 
        <!-- API 11 theme customizations can go here. -->
    </style>

<强> RES /值-V14 / style.xml

<style name="AppBaseTheme" parent="android:Theme.Holo.Light"> 
        <!-- API 11 theme customizations can go here. -->
    </style>