ActionBar en PreferenceFragment no volver a calcular la altura y el tamaño de fuente

Utilizando la última AppCompat-v21 , utilicé ActionBarActivity para crear y rellenar el PreferenceFragment . Sin embargo, la ActionBar no parece cambiar la altura y el tamaño del texto cuando se altera la orientación o el tamaño de la pantalla. Prueba de esto en otras actividades también, este comportamiento sólo parece estar sucediendo en PreferenceActivity (en contra de esta pregunta aquí: capacidad de ActionBar / overflow no cambia en el cambio de orientación ).

En primer lugar, para manejar cambios de orientación, agregué android:configChanges="keyboard|keyboardHidden|orientation|screenSize" al Manifiesto. Sospecho que esta es la principal razón de este problema, pero como he mencionado anteriormente, esto funciona en otras Activity .

Aquí hay algunas capturas de pantalla que explican el problema:

Lanzado PreferenceActivity en modo vertical:

Inicio retrato

Rotated to Landscape from Portrait:

Girar al paisaje

Lanzado PreferenceActivity en modo horizontal:

paisaje

Rotated to Retrato de paisaje:

Girar a retrato

Información Adicional

Aquí está la clase PreferenceActivity :

 import android.os.Bundle; import android.support.v7.app.ActionBarActivity; public class PrefsActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefsFragment()).commit(); } } 

¿Es este comportamiento un error? Si no, ¿hay una solución o una solución?


EDITAR I

He intentado usar el nuevo widget ToolBar , pero no hay suerte.

 import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.support.v7.widget.Toolbar; public class PrefsActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_preference); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_pref); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getFragmentManager().beginTransaction().replace(R.id.pref_frame, new PrefsFragment()).commit(); } } 

android:configChanges no se recomienda porque la orientación, el teclado no son las únicas causas de recreación de la actividad.

Por lo tanto, el mejor enfoque es eliminar esto del manifiesto, y establecer setRetainInstance(true); En la clase Fragment . Esto evitará este ciclo de destruir y recrear el Fragmento, mientras refresca la Actividad.

Dado que la Toolbar se incluye en la actividad y no en el fragmento, se actualizará la barra de herramientas mientras se mantiene el fragmento.

En el caso de los Diálogos, el uso del Ciclo de Vida del Fragmento para cerrarlos / reabrirlos funcionará.

Fuente: http://developer.android.com/guide/topics/resources/runtime-changes.html

Puedo ofrecer esta solución.

Funciona con el sistema ActionBar, con la barra de herramientas de Lollipop y la barra de herramientas de AppCompat.

 public static void fixActionBar(Activity activity, View toolbar) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (toolbar == null) { int id = activity.getResources().getIdentifier("action_bar", "id", "android"); if (id != 0) toolbar = (Toolbar) activity.findViewById(id); } if (toolbar != null) { Context context = toolbar.getContext(); TypedArray typedArray = context.obtainStyledAttributes(new int[] {android.R.attr.actionBarStyle, android.R.attr.actionBarSize}); int actionStyle = typedArray.getResourceId(0, 0); int actionHeight = typedArray.getDimensionPixelSize(1, 0); typedArray.recycle(); try { View container = (View) toolbar.getParent(); Field field = container.getClass().getDeclaredField("mHeight"); field.setAccessible(true); field.setInt(container, actionHeight); View overlay = (View) container.getParent(); field = overlay.getClass().getDeclaredField("mActionBarHeight"); field.setAccessible(true); field.setInt(overlay, actionHeight); } catch (Exception e) { } toolbar.getLayoutParams().height = actionHeight; toolbar.setMinimumHeight(actionHeight); typedArray = context.obtainStyledAttributes(actionStyle, new int [] {android.R.attr.titleTextStyle}); ((Toolbar) toolbar).setTitleTextAppearance(context, typedArray.getResourceId(0, 0)); typedArray.recycle(); } } } 

Llame a este método desde onConfigurationChanged de su actividad.

¿Las otras actividades que android:configChanges también tienen android:configChanges declaradas en el manifiesto?

Como usted dijo, el problema es que

 android:configChanges="keyboard|keyboardHidden|orientation|screenSize" 

No maneja la rotación. En realidad detiene la actividad y las vistas de ser recreado, haciendo que las vistas no leer los valores correspondientes después de un cambio de configuración.

Teniendo en cuenta el hecho de que está utilizando fragmentos, me gustaría quitar el atributo android:configChanges y tener el PrefsFragment retener su instancia.

  • ¿Cómo manejar texto largo en las preferencias de Android?
  • Cómo setOnTouchListener () en un ListPreference?
  • Ejemplo de MultiSelectListPreference
  • Iniciar nueva actividad de PreferenceActivity
  • Cambiar el color de texto PreferenceActivity
  • Compatibilidad para SwitchPreference (pre ICS)?
  • El botón de retroceso de Android no vuelve a la actividad anterior
  • Cómo configurar el diseño personalizado para PreferenceActivity en Android 3.0?
  • ¿Es posible combinar un EditTextPreference con un CheckBoxPreference?
  • Agregar barra de acción con botón de retroceso en la actividad de preferencia
  • PreferenciaActividad: guardar valor como entero
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.