4

My Aktivität anfordert Layout als Vollbild:fitsSystemWindows auf API16 Gerät nicht funktioniert

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
|View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 

und in dem XML-Layout setzt die fitsSystemWindows Eigenschaft die statusbar Höhe padding:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true"> 

<!-- The main content view --> 

     <android.support.design.widget.CoordinatorLayout 
      xmlns:app="http://schemas.android.com/apk/res-auto" 
      android:id="@+id/main_content" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:fitsSystemWindows="true"> 

      <android.support.design.widget.AppBarLayout 
       android:id="@+id/appbar" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:fitsSystemWindows="true"> 

       <android.support.design.widget.CollapsingToolbarLayout 
        android:id="@+id/collapsing_toolbar" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        app:layout_scrollFlags="scroll|exitUntilCollapsed|snap" 
        app:contentScrim="@color/actionbar_title_color" 
        android:fitsSystemWindows="true"> 

Compiled mit appcompat-v7:23.2.1 , funktioniert es gut auf API21-Gerät, aber auf API16 Gerät die Auffüllung wird nicht angewendet. Irgendwelche Hinweise?

UPDATE

Bounty on: warum auf API16 Gerät die Polsterung nicht angewendet wird?

Antwort

-1

Von offiziellen Dokument Android development pattern

Auf KitKat und unter könnte Ihre benutzerdefinierte Ansicht außer Kraft setzen fitSystemWindows() und bieten jede Funktionalität, die Sie wollten - nur return true, wenn Sie die Einsätze oder falsch, wenn Sie verbraucht haben‘ d mag geben Sie anderen Ansichten eine Chance.

jedoch auf Lollipop und höher Geräte, bieten wir einige neue APIs um dieses Verhalten für Ansichten viel einfacher und im Einklang mit anderen Verhaltensweisen machen anpassen. Sie werden stattdessen überschreiben onApplyWindowInsets(), die die Ansicht so viel konsumieren können oder wie wenig von den Einsätzen, wie Sie benötigen und in der Lage sein dispatchApplyWindowInsets() über Kinder Ansichten aufrufen je nach Bedarf.

Sie brauchen nicht einmal Ihre Ansichten zu Unterklasse, wenn Sie Verhalten benutzerdefinierte müssen auf Lollipop und höher können Sie ViewCompat.setOnApplyWindowInsetsListener() verwenden, die den Vorzug gegenüber der onApplyWindowInsets() anzeigen gegeben wird. ViewCompat auch bietet Hilfsmethoden für den Aufruf onApplyWindowInsets() und dispatchApplyWindowInsets() ohne Versionsüberprüfung.

Nun müssen Sie mit der Bedingung prüfen, ob die api Ebene verwendet wird, und dass nach Bedingung gelten wie

if(API < Kitkat){ 
    fitSystemWindows() 
}else if(API > Lollipop){ 
    onApplyWindowInsets() 
} 

Bitte überprüfen this answer für weitere Details.

Lesen Sie auch http://developer.android.com/reference/android/view/View.html#fitSystemWindows%28android.graphics.Rect%29

+0

somit auf API16 sollte ich fitSystemWindows() überschreiben? Ich verstehe nicht warum, wie die Standardimplementierung funktionieren sollte, um die erforderliche Auffüllung hinzuzufügen. – GPack

+0

wenn das nicht funktioniert, müssen Sie condion anwenden, wenn api dies ist (KitKat oder niedriger), der Code für den anderen Code für api level Lollipop –

+0

danke, ich kenne alle diese Posts, aber das Problem hier ist, wie man arbeitet auf API 16 die 'android: fitsSystemWindows = "true"' wie Docs sagt. – GPack

Verwandte Themen