2015-09-07 18 views
6

Nel mio manifesto dell'applicazione ho aggiungere Android: configChanges per evitare che l'attività di ricarica/riavvio sulla rotazioneAndroid - ActionBar non ridimensionare con onConfigurationChanged (AppCompat)

<activity 
    android:name=".MainActivity" 
    android:label="@string/app_name" 
    android:configChanges="orientation|keyboardHidden|screenSize" > 

funziona, ma supportActionBar (io sono usando AppCompat) conserva la sua altezza con caratteri piccoli.

ActionBar dovrebbe essere più grande in verticale e più piccolo nel paesaggio, ma mantiene il valore iniziale:

  • se inizio nel paesaggio, l'ActionBar rimanere sottile ritratto
  • se mi metto in verticale, il ActionBar rimanere grande nel paesaggio

Rimozione android: configChanges = "orientamento | keyboardHidden | Screensize" è l'unica soluzione che ho trovato, ma il riavvio app su rotazione, e ho bisogno di preser ve contenuto dell'applicazione

A partire dal ritratto enter image description here

A partire dal paesaggio enter image description here

A partire dal paesaggio e schermo per ritratto (piccolo bar azione e piccola altezza dei caratteri) enter image description here rotazione

risposta

2

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

Si dichiara che si gestiranno queste modifiche di configurazione da soli. In casi normali, non dovresti impostarlo e consentire a Android di ricreare la tua attività.

Edit:

Se si vuole mantenere la linea android:configChanges, è necessario eseguire l'override onConfigChanged() e cambiare tutto il necessario da soli, per esempio la dimensione di ActionBar/ToolBar.

+0

Sì, ma ho bisogno di preservare il mio contenuto .. Cosa devo fare? –

+1

Qual è il contenuto che stai conservando? Dovresti usare onSaveInstanceState() –

+0

http://developer.android.com/training/basics/activity-lifecycle/recreating.html#SaveState controllare questo link –

0

Se si desidera mantenere android:configChanges, è possibile utilizzare questo per forzare 56dp altezza della barra degli strumenti, allineare le icone e risolvere piccolo problema di testo:

Toolbar XML:

<android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="56dp" 
     android:minHeight="56dp" 
     android:background="?attr/colorPrimary" 
     app:popupTheme="@style/AppTheme.PopupOverlay" 
     app:titleTextAppearance="@style/titleTextAppearance" /> 

Stili XML:

<style name="titleTextAppearance" parent="@style/TextAppearance.Widget.AppCompat.Toolbar.Title"> 
    <item name="android:textSize">20sp</item> 
</style> 
+0

Attenzione, il valore predefinito per sw600dp dovrebbe essere '64dp' – 0101100101

0

Come altri hanno sottolineato, è necessario salvare e ripristinare lo stato dell'istanza anziché gestire la configurazione cha se possibile, se possibile. Se hai buone ragioni per non farlo, puoi provare ad aggiornare l'altezza e l'aspetto del testo della barra dopo la modifica della configurazione.

Il seguente codice dovrebbe funzionare per la versione della libreria di supporto di Toolbar. Gli attributi actionBarSize, titleTextAppearance e subtitleTextAppearance sono forniti dalla libreria di supporto.

Il codice presuppone che si disponga di un attributo personalizzato appToolbarStyle dichiarato in attrs.xml. Se non è necessario, è possibile adattare direttamente il codice per utilizzare R.style.Widget_AppCompat_Toolbar.

import android.support.v7.widget.Toolbar; 

... 

private Toolbar toolbar; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.main_activity); 

    toolbar = findViewById(R.id.toolbar); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

    updateToolbar(); 
} 

private void updateToolbar() { 
    if (toolbar == null) 
     return; 

    final Context context = toolbar.getContext(); 

    int[] attr = new int[] { R.attr.actionBarSize, R.attr.appToolbarStyle }; 
    int idxActionBarSize = 0; 
    int idxAppToolbarStyle = 1; 
    TypedArray a = context.obtainStyledAttributes(attr); 
    int actionBarSize = a.getDimensionPixelSize(idxActionBarSize, 0); 
    int appToolbarStyle = a.getResourceId(idxAppToolbarStyle, R.style.Widget_AppCompat_Toolbar); 
    a.recycle(); 

    if (actionBarSize != 0) { 
     ViewGroup.LayoutParams layoutParams = toolbar.getLayoutParams(); 
     if (layoutParams != null) { 
      layoutParams.height = actionBarSize; 
     } 

     toolbar.setMinimumHeight(actionBarSize); 
    } 

    attr = new int[] { R.attr.titleTextAppearance, R.attr.subtitleTextAppearance }; 
    int idxTitleTextAppearance = 0; 
    int idxSubtitleTextAppearance = 1; 
    a = context.obtainStyledAttributes(appToolbarStyle, attr); 
    int titleTextAppearance = a.getResourceId(idxTitleTextAppearance, 0); 
    int subtitleTextAppearance = a.getResourceId(idxSubtitleTextAppearance, 0); 
    a.recycle(); 

    if (titleTextAppearance != 0) { 
     toolbar.setTitleTextAppearance(context, titleTextAppearance); 
    } 

    if (subtitleTextAppearance != 0) { 
     toolbar.setSubtitleTextAppearance(context, subtitleTextAppearance); 
    } 

    toolbar.requestLayout(); 
} 
Problemi correlati