tutorial studio setsupportactionbar example custom create bar java android android-layout android-actionbar android-preferences

java - studio - toolbar android example



ActionBar en PreferenceActivity (8)

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

Para llenar los iconos de ActionBar , cada Activity debe extender la clase ActionBarActivity . El problema es que mi Activity ya extiende PreferenceActivity y en Java las clases no pueden extender más de una clase.

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

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


¿Puedes clonar el código de ActionBarActivity y cambiar "extends Activity" a "extends PreferenceActivity"? Luego amplíe su nueva clase en lugar de ActionBarActivity.

Sin embargo, de todas las aplicaciones de Google que he visto, parece inusual poner botones en la barra de acción de una actividad de preferencia. Si no le está poniendo botones, puede usar un recurso de estilo alternativo values-v11 para mostrar el tema holo, y establecer ese estilo en el manifiesto para su actividad de preferencia.


Me gustaría dar las gracias a @pyko por brindarme una excelente respuesta, pero tiene el problema de que no funcionará bien en HoneyComb y en versiones posteriores. bueno, puede tener una forma de hackear para hacerlo funcionar como dijo @AndroidDev; Pero @pyko va a contaminar la clase ActionBarHelperBase, y @AndroidDev no es muy transparente. La mejor manera es crear ActionBarActivityPreferences que se extienda desde PreferenceActivity; y en el método onCreate, cambie el orden del método principal de llamada:

@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é se llama a ''mActionBarHelper.onCreate (savedInstanceState);'' antes de ''super.onCreate (savedInstanceState);'' , porque Super (es decir, PreferenceActivity) está configurando la vista de contenido en su método onCreate, lo que provocaría un bloqueo (se debe llamar a "requestFeature () antes de agregar contenido"). Entonces, lo que necesita hacer es cambiar el orden, hacer sure ''mActionBarHelper.onCreate (savedInstanceState);'' se llama before super. De esta forma, no necesitamos contaminar el ''ActionBarHelperBase'', pero mantenemos SettingActivity muy limpio porque encapsulamos los detalles complejos en ''ActionBarActivityPreferences'' y bang!



Gracias, solo una actualización, debe agregar una declaración if antes de la línea Título personalizado para admitir HoneyComb y versiones posteriores.

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


Puede agregar fácilmente una barra de acciones 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 compatibilidad con Back API:

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



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

Me las arreglé para ponerlo en funcionamiento, no estoy seguro si esta es la solución más bonita / limpia, 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 agregue la 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 (), se configurará ViewGroup y, por lo tanto, no podrá cambiar los parámetros de la ventana". ( ver 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 de las Activity simples de la actividad.


Puede obtener una lib ActionBarSherlock y dejar que el código amplíe SherlockPreference;