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