10

Utilizzando la più recente libreria AppCompat-v21, ho utilizzato ActionBarActivity per creare e popolare PreferenceFragment. Tuttavia, lo ActionBar non sembra cambiare altezza e dimensione del testo quando l'orientamento o le dimensioni dello schermo sono alterate. Provando questo anche su altre attività, sembra che questo comportamento stia accadendo solo in PreferenceActivity (contrario a questa domanda posta qui: ActionBar capacity/overflow not changing on orientation change).ActionBar in PreferenceFragment non ricalcolare altezza e dimensione carattere

Prima di tutto, per gestire i cambiamenti di orientamento, ho aggiunto android:configChanges="keyboard|keyboardHidden|orientation|screenSize" al Manifest. Sospetto che questa sia la ragione principale di questo problema, ma come ho detto prima, funziona su altri Activity s.

Ecco alcuni screenshot che spiegano il problema:

Lanciato PreferenceActivity in modalità Ritratto:

Portrait start

ruotato di Paesaggio dal ritratto:

rotate to landscape

Lanciato PreferenceActivity in Modalità orizzontale:

landscape

ruotato a Ritratto di Paesaggio:

rotate to portrait

Informazioni aggiuntive

Ecco la classe 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(); 
    } 

} 

Questo comportamento è un bug? In caso contrario, c'è una soluzione alternativa o una soluzione?


EDIT ho

Ho provato ad utilizzare il nuovo widget ToolBar, ma senza fortuna.

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(); 
    } 

} 
+0

Lo stesso problema qui. Ma nel mio caso la dimensione del font è semplicemente troppo piccola nel panorama, non importa come sia iniziata ... – Zordid

+0

Hai provato a definire 'textSize' in styles.xml? A volte, Android ha un bug quando non si definisce un valore determinato. Puoi leggere questo: http://stackoverflow.com/q/16189877/3922207 e http://stackoverflow.com/a/12899367/3922207 –

risposta

3

android:configChanges non è consigliato in quanto l'orientamento, la tastiera non sono le uniche cause di attività di ricreazione.

Quindi, l'approccio migliore è rimuovere questo dal manifesto e impostare setRetainInstance(true); nella classe Fragment. Questo aggirerà questo ciclo di distruggere e ricreare il frammento, mentre rinfresca l'attività.

Poiché lo Toolbar è incluso nell'attività e non nel frammento, questo aggiornerà la barra degli strumenti mantenendo il frammento.

In caso di finestre di dialogo, l'utilizzo di Fragment Lifecycle per chiuderle/riaprirle funzionerà.

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

0

fare le altre attività che si testati con anche avere android:configChanges dichiarato sul manifesto?

Come hai detto, il problema è che

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

non gestisce la rotazione. In realtà impedisce l'attività e le visualizzazioni da ricreare, facendo sì che le viste non leggano i valori corrispondenti dopo una modifica di configurazione.

Considerando il fatto che si stanno utilizzando frammenti, rimuoverei l'attributo android:configChanges e mantenere PrefsFragment nella sua istanza.

3

posso offrire questa soluzione.

Funziona con il sistema ActionBar, con Lollipop Toolbar e AppCompat Toolbar.

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(); 
     } 
    } 
} 

chiamare questo metodo dal onConfigurationChanged della vostra attività.

Problemi correlati