ActionBar en PreferenceActivity

Ejemplo: Android Market

En mi aplicación estoy usando la nueva barra de acción de compatibilidad de la muestra de Google (que se encuentra en <sdk>/samples/android-<version>/ActionBarCompat ) que funciona muy bien. El único problema que tengo es aplicar esto a mi PreferenceActivity con el fin de obtener una pantalla como la configuración en el Android Market (ver foto).

Para llenar el ActionBar con iconos, cada Activity debe extender la clase ActionBarActivity . El problema es que mi Activity ya amplía PreferenceActivity y en las clases Java no se puede extender más de una clase.

Debe haber una forma de obtener la ActionBar junto con una PreferenceScreen . Me alegraría que alguien pudiera ofrecer una solución para este problema común.

PS: Una solución como en Cómo agregar un botón a PreferenceScreen no encaja porque el ActionBar es en realidad la barra de título y por lo que este es más un Java que una cosa de diseño.

Editar: Mi respuesta a continuación es bastante hacky y parece que ya está obsoleta (para pre Android 3.0) Echa un vistazo a las otras respuestas para soluciones menos hacky y más actuales ~ pyko 2014-09-01


Me las arreglé para conseguir que funcionaba – no estoy seguro si esta es la mejor / más limpia solución, pero funciona.

Tuvo que hacer los siguientes cambios:

  1. Haga una copia de ActionBarActivity y ActionBarActivity que la nueva clase extienda PreferenceActivity

     public abstract class ActionBarPreferenceActivity extends PreferenceActivity { // contents exactly the same as 'ActionBarActivity' } 
  2. Modifique onCreate() en ActionBarHelperBase.java ligeramente – haga un caso especial para las clases de PreferenceActivity

     @Override public void onCreate(Bundle savedInstanceState) { // If the activity is a PreferenceActivity, don't make the request if (!(mActivity instanceof PreferenceActivity)) { mActivity.requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); } 
  3. Haga que su PreferenceActivity amplíe esta clase y añada solicitud de FEATURE_CUSTOM_TITLE antes de llamar a super.onCreate()

     public class MyPreferenceActivity extends ActionBarPreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); // add this line super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); // etc etc } // etc etc } 

Por lo que puedo decir, los cambios 2 y 3 son necesarios porque para PreferenceActivity :

"Tan pronto como llame a super.onCreate (), el ViewGroup se configurará y por lo tanto, no se le permite cambiar los parámetros de la ventana." ( Véase el comentario de Oliver a la respuesta )

Supongo que el orden de cómo se crean los componentes en las actividades de PreferenceActivity es diferente a las actividades de Activity .

Si desea probar una implementación de PreferenceFragment basada en soporte-v4 Fragmento:

https://github.com/kolavar/android-support-v4-preferencefragment

Lo estoy utilizando por mí mismo y no es mucho trabajo convirtiendo PreferenceActivity en PreferenceFragment.

¿Puedes clonar el código de ActionBarActivity y cambiar "extends Activity" a "extends PreferenceActivity"? A continuación, extienda su nueva clase en lugar de ActionBarActivity.

De todos los apps de Google que he visto, sin embargo, parece inusual poner los botones en la barra de la acción de un PreferenceActivity. Si no está poniendo botones en él, podría usar un recurso de estilo alternativo de values-v11 para mostrar el tema holo y establecer ese estilo en el manifiesto para su PreferenceActivity.

He utilizado en mi aplicación esta barra de acción https://github.com/johannilsson/android-actionbar y su trabajo genial con este hilo Cómo agregar un botón a PreferenceScreen

Me gustaría dar las gracias a @pyko proporcionando una gran respuesta, pero tiene un problema que no funcionará bien en HoneyComb y arriba. Así que usted puede tener una forma de hack para conseguir que alrededor como @AndroidDev dijo; Pero @pyko va a contaminar la clase ActionBarHelperBase, y @AndroidDev no es muy transparente. La mejor manera es crear ActionBarActivityPreferences que se extiende desde PreferenceActivity; Y en el método onCreate, cambie el orden del método padre llamante:

 @Override protected void onCreate(Bundle savedInstanceState) { //IMPORTATNT: MAKE SURE actionBarHelper called before super; //as super oncreate of prefenceactivity is actuallying setting the content view mActionBarHelper.onCreate(savedInstanceState); super.onCreate(savedInstanceState); } 

Por qué llama a 'mActionBarHelper.onCreate (savedInstanceState);' Antes de 'super.onCreate (savedInstanceState);' , Es decir, porque super (es decir, PreferenceActivity) es realmente la configuración de la vista de contenido en su método onCreate, lo que causaría accidente ("requestFeature () debe ser llamado antes de añadir el contenido"). Así que lo que necesita hacer es cambiar el orden, Seguro 'mActionBarHelper.onCreate (savedInstanceState);' De esta manera, no necesitamos contaminar el 'ActionBarHelperBase', pero mantenemos SettingActivity muy limpio porque encapsulamos el complicado detalle en 'ActionBarActivityPreferences' y bang!

Puede agregar fácilmente barra de acción en la actividad de preferencia mediante los siguientes cambios:

En AndroidManifest.xml :

 <activity android:name=".activity.SettingsActivity" android:theme="@style/SettingsTheme" android:label="Settings"/> 

En v21 / styles.xml

 <style name="SettingsTheme" parent="@android:style/Theme.Material.Light.DarkActionBar"> <item name="android:colorPrimary">@color/colorPrimary</item> <item name="android:colorPrimaryDark">@color/colorPrimaryDark</item> </style> 

En v14 / styles.xml para la compatibilidad con la API posterior:

 <style name="SettingsTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar"> <item name="android:actionBarStyle">@style/ActionBar.V14.Movie.NoTitle</item> </style> 

Gracias, sólo una actualización, es necesario agregar una declaración antes de la línea de título personalizado para apoyar HoneyComb y superior.

 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 

Usted puede obtener una lib de ActionBarSherlock y dejar que el código extiende SherlockPreference;

  • Convertir de String a BigDecimal para hacer matemáticas en moneda
  • Ant no puede encontrar javac, JAVA_HOME no se establecerá en Ubuntu
  • Enviar una base de datos a través de ftp - Obtener un archivo diferente
  • Cómo encontrar tamaño de matriz bidimensional en JNI
  • Problema de autenticación de LinkedIn en eclipse
  • AudioTrack sólo reproducirá audio una vez
  • Haciendo que DependsOn funcione en RoboBinding
  • GetHeight devuelve 0 para todos los objetos de IU de Android
  • ¿Cuál es la forma correcta de hacer inserciones / actualizaciones / eliminaciones en Android SQLiteDatabase utilizando una cadena de consulta?
  • Play Servicios de ubicación getLastLocation devuelve null
  • Lanzamiento de actividades dentro de una pestaña en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.