16

enter image description hereAnwendungsinhalt geht hinter der Navigationsleiste in android L

Wie Sie mein sehen "Got It" Button hinter der Navigation ist bar.Not der Lage, es zu beheben !!! Ich habe versucht

<item name="android:fitsSystemWindows">true</item> 

sowie Einstellung in Layout-Datei.

mein Thema Wert-21 ist:

<style name="AppTheme" parent="android:Theme.Material.Light.NoActionBar"> 
     <item name="android:windowNoTitle">true</item> 
     <item name="android:windowActionBar">false</item> 
     <item name="android:windowFullscreen">false</item> 
     <item name="android:windowContentOverlay">@null</item> 
     <item name="android:fitsSystemWindows">true</item> 
    </style> 

Sein der gleiche Fall mit allen Bildschirmen in der gesamten Anwendung.

Bitte Hilfe.

+1

Versuchen: View.bringToFront(); –

+0

@ user863873: Layout sollte diesen Raum nicht verwenden. Er sollte über diesen Schaltflächen liegen. –

+0

Konnten Sie den Button "Got it" vor der Navigationsleiste platzieren? Ich kann einfach nicht scheinen, dass es passiert ist. Kannst du mir helfen?Welche anderen Flags hast du zum Fenster hinzugefügt? Ich habe alle deine Flaggen hinzugefügt, aber die Navigationsleiste ist immer vor meiner Aktivität. – user3632055

Antwort

24

Hier ist die Lösung.

Die meisten der Layouts durch das Hinzufügen dieser Eigenschaften in Wert-21 style.xml

<item name="android:windowTranslucentStatus">true</item> 
     <item name="android:windowTranslucentNavigation">true</item> 
     <item name="android:fitsSystemWindows">true</item> 

für andere gelöst bekommen, ich habe die Höhe der Navigationsleiste und fügen Sie Rand meiner Ansicht berechnet.

public static int getSoftButtonsBarSizePort(Activity activity) { 
    // getRealMetrics is only available with API 17 and + 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
     DisplayMetrics metrics = new DisplayMetrics(); 
     activity.getWindowManager().getDefaultDisplay().getMetrics(metrics); 
     int usableHeight = metrics.heightPixels; 
     activity.getWindowManager().getDefaultDisplay().getRealMetrics(metrics); 
     int realHeight = metrics.heightPixels; 
     if (realHeight > usableHeight) 
      return realHeight - usableHeight; 
     else 
      return 0; 
    } 
    return 0; 
} 

Hinweis: Durch die oben genannten Lösungen alles Arbeit mit, aber ich war auch PopupWindow in meinem app.The Layout der PopupWindow mit Get in Android L. für die Ausgabe Schauen vermasselt und die Lösung here

+6

Ich habe folgendes mein Stil true true Es funktioniert! Hinter der Navigationsleiste wird kein Inhalt angezeigt. Außer jetzt ist meine Navigationsleiste dunkelgrau statt schwarz. Wenn TranslucentNavigation auf "false" gesetzt wird, wird die Leiste schwarz, aber der Inhalt wird dahinter angezeigt. Können Sie erklären, warum diese Attribute funktionieren und wie Sie die Navigationsleiste schwarz halten? – klong15

+0

Sie haben die Methode definiert, aber Sie haben uns nicht gesagt, wie Sie sie verwenden oder aufrufen sollen. Können Sie uns bitte sagen, woher wir diese Methode nennen und wie wir sie benutzen können? – Neri

+0

Dies hilft aber Wie kann man erkennen, wenn der Benutzer die Soft-Navigation-Tastenleiste öffnet oder schließt? Damit wir die Polsterung verändern könnten? –

0

Die Einstellung von softInputMode von popupWindow auf "SOFT_INPUT_ADJUST_RESIZE" behebt das Problem.

0

Setzen Sie einfach diese in Ihrer Aktivität des onCreate(), während Inhalt die Einrichtung von:

int mScreenWidth = getWindowManager().getDefaultDisplay().getWidth(); 
int mScreenHeight = getWindowManager().getDefaultDisplay().getHeight(); 
View view = getLayoutInflater().inflate(R.layout.activity_main, null); 
setContentView(view, new ViewGroup.LayoutParams(mScreenWidth, mScreenHeight)); 
2

Sie sollten nicht Navigationstasten Bereich mit android:windowTranslucentNavigation

eher hier Für nette User Experience müssen blockieren wird die bessere Lösung, wenn Sie ResideMenu Bibliothek verwenden, dann fügen Sie einfach diese Methode in ResideMenu.java

@Override 
protected boolean fitSystemWindows(Rect insets) { 
    int bottomPadding = insets.bottom; 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     Resources resources = getResources(); 
     int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android"); 
     if (resourceId > 0) { 
      bottomPadding += resources.getDimensionPixelSize(resourceId); 
     } 
    } 
    this.setPadding(viewActivity.getPaddingLeft() + insets.left, viewActivity.getPaddingTop() + insets.top, 
      viewActivity.getPaddingRight() + insets.right, viewActivity.getPaddingBottom() + bottomPadding); 
    insets.left = insets.top = insets.right = insets.bottom = 0; 
    return true; 
} 

und wenn Sie 0 verwendenBibliothek dann mod SLIDING_CONTENT von ändern:

menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT); 

Hoffe, dass es Ihre Zeit

+0

+1 Ich hatte dasselbe Problem wegen ResideMenu und diese Antwort hat mir geholfen, nachdem ich so viel Zeit verschwendet habe. Vielen Dank! – WonderSoftwares

0

Verwenden Sie diesen Code in Ihre onCreate Methode Ihrer Activity sparen (Wenn Sie BaseActivity haben Sie dies dort tun können, so dass alle Aktivitäten gelten dieses):

ViewCompat.setOnApplyWindowInsetsListener(
      findViewById(android.R.id.content), (v, insets) -> { 
       ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) v.getLayoutParams(); 
       params.bottomMargin = insets.getSystemWindowInsetBottom(); 
       return insets.consumeSystemWindowInsets(); 
      }); 

wenn ein Layout dieses flag hat, bedeutet dies, dass dieses Layout, das System fragt angewendet Fenstereinsätze sein. In unserem Fall würde das bedeuten, dass FrameLayout ein Padding angewendet werden soll, das der Höhe des Statusbalkens entspricht.

+0

Für Pre-Lambda: '.setOnApplyWindowInsetsListener (findViewById (android.R.id.content), neue OnApplyWindowInsetsListener() { @Override öffentliche WindowInsetsCompat onApplyWindowInsets (Blick v, WindowInsetsCompat Einschübe) { // .. } } ); ' – gnB