android - preferencias - getActionBar() devuelve nulo en PreferenceActivity(AppCompat-v7 21)
preferencias android (4)
getActionBar()
devuelve nulo en API 5.0 cuando uso Activity
o FragmentActivity
.
Resolví esta extensión a ActionBarActivity
public class MainActivity extends ActionBarActivity {
Debe usar getSupportActionBar()
cuando está usando ActionBarActivity
( appcompat-v7
).
He implementado DoneBar (dos botones en la barra de acción) en PreferenceActivity
como se proporciona en las muestras de v20 sdk, pero después de actualizar el SDK y AppCompat a la versión 21, mi aplicación falla en
java.lang.NullPointerException: Attempt to invoke virtual method ''void android.app.ActionBar.setDisplayOptions(int, int)'' on a null object reference
Eso es porque getActionBar()
devuelve null. Y no hay getSupportActionBar()
como en ActionBarActivity
.
¿Entonces mi pregunta es cómo obtener ese objeto de la barra de acción en PreferenceActivity
para que pueda aplicar una vista personalizada en él?
Resuelto
Después de algunas investigaciones, logré resolver este problema utilizando PreferenceFragment
con ActionBarActivity
para poder llamar a getSupportActionBar()
Como xXx solicitó, estoy dando un ejemplo de cómo lo hice:
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);
}
}
}
Logré solucionar este problema especificando un tema personalizado para mi actividad de configuración,
<style name="SettingsTheme" parent="style/Theme.AppCompat.Light">
<item name="android:windowNoTitle">false</item>
<item name="android:windowActionBar">true</item>
</style>
y: android:theme="@style/SettingsTheme"
en el manifiesto para la actividad
La barra de acción se muestra de nuevo en KITKAT y LOLIPOP y (no lo he probado) de nuevo a api v11. Lo probé y funciona (sin barra de acción como se esperaba) en api 10.
Desde la depuración en lolipop, FEATURE_NO_TITLE
se estaba configurando en PhoneWindow.java:3243
:
if (a.getBoolean(R.styleable.Window_windowNoTitle, false)) {
requestFeature(FEATURE_NO_TITLE);
que elimina FEATURE_ACTION_BAR
[editar]
pero esta barra de acción no es del tema material, por lo que todavía no es perfecta
[editar2]
Me di por vencido con los encabezados, ahora estoy usando PreferenceFragment backport de github. Ahora todas mis barras de acción son iguales después de actualizar a appcompact 21.
Problema resuelto al hacer esto, su xml de estilos debería tener este aspecto.
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>