studio preferencias preferencefragmentcompat medium create android preferenceactivity

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>