2015-09-07 12 views
6

In meiner Anwendung manifest ich hinzufügen, habe android: configChanges Aktivität reload/restart auf drehenAndroid - ActionBar Ändern der Größe nicht mit onConfigurationChanged (AppCompat)

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

es funktioniert zu verhindern, aber supportActionBar (ich bin mit AppCompat) bewahrt seine Höhe mit kleiner Schriftgröße.

ActionBar sollte im Hoch- und kleiner in der Landschaft größer sein, aber es hält den Anfangswert:

  • , wenn ich in der Landschaft beginnen, die ActionBar bleiben dünn im Portrait
  • wenn ich im Portrait beginnen, die ActionBar bleiben groß in Landschaft

Entfernen android: configChanges = „Orientierung | keyboardHidden | Bildschirmgröße“ ist die einzige Lösung, die ich gefunden habe, aber die App Neustart auf drehen, und ich muss preser Anwendung ve Inhalt

im Portrait-Start enter image description here

in Ausgangs Landschaft enter image description here

im Quer Starten und rotierenden Bildschirm Portrait (kleine Aktionsleiste und kleine Schrifthöhe) enter image description here

Antwort

2

Nach Einstellung android:configChanges="orientation|keyboardHidden|screenSize"

Sie erklären, dass Sie diese Konfigurationsänderungen selbst vornehmen werden. Im Normalfall sollten Sie das nicht einstellen und Android Ihre Aktivität neu erstellen lassen.

Edit:

Wenn Sie die Zeile android:configChanges behalten möchten, können Sie onConfigChanged() außer Kraft setzen müssen, und alles selbst Bedarf zu ändern, zum Beispiel die Größe der ActionBar/ToolBar.

+0

Ja, aber ich muss meine Inhalte erhalten .. Was soll ich tun? –

+1

Welchen Inhalt bewahren Sie? Sie sollten onSaveInstanceState() verwenden –

+0

http://developer.android.com/training/basics/activity-lifecycle/recreating.html#SaveState überprüfen Sie diesen Link –

0

Wenn Sie android:configChanges behalten möchten, können Sie diese verwenden 56dp Symbolleiste Höhe zu zwingen, die Symbole ausrichten und kleine Text Problem zu beheben:

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" /> 

Styles XML:

+0

Vorsicht, die Standardeinstellung für sw600dp sollte '64dp' sein – 0101100101

0

Wie andere darauf hingewiesen haben, sollten Sie den Instanzstatus speichern und wiederherstellen, anstatt die Konfiguration cha zu behandeln wenn möglich, sich selbst Wenn Sie einen guten Grund haben, dies nicht zu tun, können Sie versuchen, die Höhe und das Erscheinungsbild der Symbolleiste nach der Konfigurationsänderung zu aktualisieren. Der folgende Code sollte für die Unterstützungsbibliotheksversion von Toolbar funktionieren. Die Attribute actionBarSize, titleTextAppearance und subtitleTextAppearance werden von der Support-Bibliothek bereitgestellt.

Der Code geht davon aus, dass Sie ein benutzerdefiniertes Attribut appToolbarStyle in attrs.xml deklariert haben. Wenn Sie das nicht benötigen, können Sie den Code so anpassen, dass er direkt R.style.Widget_AppCompat_Toolbar verwendet.

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