2017-04-11 4 views
0

Ich versuche, ein Layout zu erstellen, in dem meine Stammansicht den gesamten Bildschirm einnimmt und unter den Status/Navigationsleisten gezeichnet wird. Alles funktioniert gut, bis ich ein großes Popup-Fenster habe (das im Bild hat 60 Elemente). Das Fenster erstreckt sich weit unter dem Fenster und kann nicht gescrollt werden. Wie kann ich mein Layout unter der Navigationsleiste erweitern, ohne zuzulassen, dass sich Popup-Fenster über den Bildschirm hinaus erstrecken?Bild unter Android Navigationsleiste zeichnen

Der Täter ist

getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); 

Das Problem ist, dass ohne diese Flagge, ich kann nicht scheinen, meiner Meinung nach unter der Navigationsleiste zu ziehen. Stattdessen kann ich nur die android:windowBackground (als grün) setzen.

Hier ist das Layout ich benutze:

<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/colorAccent" 
    android:fitsSystemWindows="false" 
    tools:context="com.example.fullscreendemo.MainActivity"> 

    <TextView 
     android:id="@+id/text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Hello World!" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toTopOf="parent"/> 

    <android.support.v7.widget.AppCompatSpinner 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:entries="@array/spinner_values" 
     android:clipChildren="true" 
     app:layout_constraintTop_toBottomOf="@+id/text" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent"/> 

    <View 
     android:layout_width="0dp" 
     android:layout_height="48dp" 
     android:background="@drawable/bg_nav_bar" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent"/> 

</android.support.constraint.ConstraintLayout> 

Die Haupttätigkeit:

class MainActivity extends AppCompatActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getWindow().getDecoreView().setSystemUiVisibility(
       View.SYSTEM_UI_FLAG_LAYOUT_STABLE | 
       View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); 
     setContentView(R.layout.activity_main); 
    } 
} 

No limits setWith limits

+0

Hallo welche Art von Stil verwenden Sie für die Aktivität? Sie können die transparente Leiste ohne diese Flagge erreichen, gibt es einen Grund, warum Sie nicht sind? –

+0

Ich benutze 'Theme.AppCompat.Light.NoActionBar' Die Leiste ist auch ohne die Flagge transparent, das Problem ist, dass ich nur mit einer Farbe darunter zeichnen oder mit' android: windowBackground' zeichnen konnte. Sie können aus dem Bild sehen, dass die Farbe unter dem Balken grün ist, was der Fensterhintergrund und nicht der Hintergrund der Navigationsleiste ist. – TheHebrewHammer

+0

Ich benutze dies als ein Stil von Android 19 und es hat die gleiche Wirkung, wenn Sie es versuchen wollen und gute Sache, die Sie es behoben –

Antwort

0

OK, klar so richtig nach diesem Posting ich herausfinden, was los ist . Die Dokumentation für Window.setFlags besagt, dass FLAG_LAYOUT_IN_SCREEN und FLAG_LAYOUT_INSET_DECOR beim Aufruf setContentView oder getDecoreView verwendet werden. Es waren die Einfügungen, die den Boden meiner Aktivität "heben" ließen. Ich war in der Lage, dies alles zu vermeiden, indem sie einfach die meisten des Code in meiner Tätigkeit zu entfernen und nur in

getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); 

EDIT verlassen Die oben ist nicht genug, wenn ein Gerät ohne weiche Navigationsleiste verwenden, um alle unterzubringen Geräte verwenden:

private void setFullScreenFlags() { 
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR); 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); 
    if (!hasSoftNavigationBar()) { 
     getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | 
       View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 
    } 
    AndroidBug5497Workaround.assistActivity(this); 
} 

private boolean hasSoftNavigationBar() { 
    Display display = getWindowManager().getDefaultDisplay(); 
    Point realSize = new Point(); 
    Point displaySize = new Point(); 

    display.getRealSize(realSize); 
    display.getSize(displaySize); 
    return !realSize.equals(displaySize); 
}