GetActionBar() возвращает null в PreferenceActivity (AppCompat-v7 21)
Я реализовал DoneBar (две кнопки в панели действий) в PreferenceActivity
, как указано в образцах SVD s20, но после обновления 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()
Ответы
Ответ 1
как запрошен 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
Мне удалось исправить эту проблему, указав настраиваемую тему для моей активности настроек,
<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]
Я сдался с заголовками, теперь я использую backportport PreferenceFragment из github. Теперь все мои панели действий одинаковы после обновления до appcompact 21.
Ответ 3
getActionBar()
возвращает null в API 5.0, когда я использую Activity
или FragmentActivity
.
Я решил, что это расширение до ActionBarActivity
public class MainActivity extends ActionBarActivity {
Вы должны использовать getSupportActionBar()
, когда используете ActionBarActivity
(appcompat-v7
).
Ответ 4
Проблема решена, сделав это, ваши стили 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>