Подтвердить что ты не робот

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()

4b9b3361

Ответ 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>