我已经在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()
答案 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>