web-dev-qa-db-fra.com

getActionBar () renvoie null dans PreferenceActivity (AppCompat-v7 21)

J'ai implémenté DoneBar (deux boutons dans la barre d'action) dans PreferenceActivity comme indiqué dans les exemples v20 sdk, mais après avoir mis à jour le SDK et AppCompat à la version 21, mon application se bloque à

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

En effet, getActionBar() renvoie null. Et il n'y a pas de getSupportActionBar() comme dans ActionBarActivity.

Donc, ma question est de savoir comment obtenir cet objet de barre d'action dans PreferenceActivity afin que je puisse lui appliquer une vue personnalisée?

RESOLU

Après quelques recherches, j'ai réussi à résoudre ce problème en utilisant PreferenceFragment avec ActionBarActivity pour pouvoir appeler getSupportActionBar()

24
Olegas Gončarovas

comme xXx l'a demandé, je donne un exemple de la façon dont j'ai fait:

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);
        }
    }

}
15
Olegas Gončarovas

J'ai réussi à résoudre ce problème en spécifiant un thème personnalisé pour mon activité de paramètres,

<style name="SettingsTheme" parent="style/Theme.AppCompat.Light">
    <item name="Android:windowNoTitle">false</item>
    <item name="Android:windowActionBar">true</item>
</style>

et : Android:theme="@style/SettingsTheme" en manifeste pour l'activité

la barre d'action s'affiche à nouveau sur KitKat et LOLIPOP et (ne l'a pas testée) de retour à l'api v11. Je l'ai testé et cela fonctionne (sans barre d'action comme prévu) sur l'api 10.

Du débogage sur lolipop, FEATURE_NO_TITLE était défini dans PhoneWindow.Java:3243:

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

ce qui supprime FEATURE_ACTION_BAR

[Éditer]

mais cette barre d'action n'est pas du thème matériel, donc ce n'est pas parfait

[edit2]

J'ai abandonné les en-têtes, maintenant j'utilise le backport PreferenceFragment de github. Maintenant, toutes mes barres d'action sont les mêmes après la mise à niveau vers appcompact 21.

17
marcinj

getActionBar() renvoie null dans l'API 5.0 lorsque j'utilise Activity ou FragmentActivity.

J'ai résolu cette extension à ActionBarActivity

public class MainActivity extends ActionBarActivity {

Vous devez utiliser getSupportActionBar() lorsque vous utilisez ActionBarActivity (appcompat-v7).

7
Jorgesys

Problème résolu en faisant cela, votre style xml devrait ressembler à ceci.

res/values ​​/ 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/values-v11/style.xml

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

res/values-v14/style.xml

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