8

ich die Navigationsleiste Aktivität Projektvorlage von Android Studio verfeinert, dieToolbar verwendet, v7.app.ActionBarDrawerToggle und NavigationView anstelle des NavigationDrawerFragment (und das Layout/fragment_navigation_drawer .xml).Overlapping Schatteneffekt bleibt auf Navigationsleiste des NavigationView

Navigation Drawer in immersive-sticky when the drawer is closed

Es funktioniert perfekt. Dann gehe ich weiter. Ich habe mein Navigationsschubladen-Projekt in immersive-sticky (Vollbildmodus).

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 

    if (hasFocus) { 
     View decorationView = getWindow().getDecorView(); 
     decorationView.setSystemUiVisibility(
       View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
         | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
         | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
         | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 
         | View.SYSTEM_UI_FLAG_FULLSCREEN 
         | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 
    } 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    ... 

    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    ActionBar actionBar = getSupportActionBar(); 
    actionBar.setDisplayHomeAsUpEnabled(true); 

    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    drawerToggle = new ActionBarDrawerToggle(
      this, 
      drawerLayout, 
      R.string.navigation_drawer_open, /* "open drawer" description for accessibility */ 
      R.string.navigation_drawer_close /* "close drawer" description for accessibility */ 
    ) { 
     @Override 
     public void onDrawerClosed(View drawerView) { 
      super.onDrawerClosed(drawerView); 

      invalidateOptionsMenu(); // calls onPrepareOptionsMenu() 
     } 

     @Override 
     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 

      invalidateOptionsMenu(); // calls onPrepareOptionsMenu() 
     } 
    }; 
    drawerLayout.setDrawerListener(drawerToggle); 

    navigationView = (NavigationView) findViewById(R.id.navigation_view); 
    navigationView.setNavigationItemSelectedListener(this); 
} 

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    drawerToggle.syncState(); 
} 

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

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (drawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 

    ... 

} 

Ein Problem ist gestiegen. Die überlappenden Schatten auf der Navigationsansicht, die von der Statusleiste (auf der oberen Seite) und der Navigationsleiste (auf der unteren Seite) abgeleitet sind, bleiben stehen.

When Navigation Drawer is opened

When Navigation Drawer is opened and sticky status and navigation bars are showed

Wie kann ich sie loswerden?

Ich überprüfte Quellen von v7.app.ActionBarDrawerToggle oder NavigationView von Android, aber vergeblich.


Aktualisiert:

Dank für die Beratung des @ lcw_gg, ich habe völlig von der Statusleiste des Schatten losgeworden (während der Schatten der Navigationsleiste bleibt). Das ist android:windowFullscreen Attribut true in Layout-XML festzulegen.

Aber ich möchte dies in Java-Code tun. Ich fand einen Weg, und wahrscheinlich ist es auf die xml Weise gleichwertig:

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

Und dies zu tun, brauchen Sie nicht mehr diese beiden Flags zu setzen - View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN und View.SYSTEM_UI_FLAG_FULLSCREEN - zum decorationView.

shadow of the status bar has disappeared while that of navigation bar remains

Dennoch finde ich die Art und Weise nicht von der Navigationsleiste des Schatten loszuwerden. Ich warte auf eine Lösung.

+0

Welche API-Ebenen tritt dieses Problem auftreten, auf? Ist es alles von ihnen oder nur Post-Lollipop? – PPartisan

+0

@PPartisan Mein Gerät ist 5.1.1 (API-22 Lollipop; Nexus7). Ich habe noch keine anderen Geräte untersucht. – hata

+0

Vielleicht lohnt es sich in diesem Fall mit 'android: height' Attributen in Ihren 'layout'' xml' Dateien zu experimentieren. Ich habe ähnliche Leiden in der Vergangenheit erlebt, als ich die Höhe vergessen habe. – PPartisan

Antwort

13

Endlich habe ich es geschafft.

Die Lösung FLAG_LAYOUT_NO_LIMITS zusammen mit FLAG_FULLSCREEN zum android.view.Window Objekt verwendet.

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

Dies hat die beiden Schatten perfekt beseitigt.

enter image description here

lcw_gg Kommentar war sehr nützlich Hinweis android.view.Window zu manipulieren. Besonderer Dank an ihn.

+0

DANKE SO VIEL! - Ich habe ungefähr 20 volle Stunden gekämpft, um diese funktionierenden, forschenden Ansichtsattribute zu erhalten und herauszufinden, warum diese schwarze Transparenz der Navigationsleiste nicht auf Lollipop + -Geräten verschwinden würde. –

0

Für diejenigen mit dem gleichen Problem wie oben, aber will die Systemstatusleiste halten immer zeigt (also nicht mit WindowManager.LayoutParams.FLAG_FULLSCREEN), gibt es einige zusätzliche Arbeit, die Sie tun müssen, um ein seltsamen Inhalt Kriechen unter der Statusleiste zu verhindern auf Lutscher. Ich habe das Problem auf Kitkat nicht bemerkt, als ich es getestet habe.

Ich benutzte zwei Navigationsfächer (links und rechts) und hatte seltsamerweise nur die LINKE, die den Schatten auf den Boden warf. Nach der Anwendung von WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, wie in der angenommenen Antwort gezeigt, ging der Schatten weg, aber dann wurde der Inhalt unter der Statusleiste sowie der Navigationsleiste, die über die Statusleiste zeichnete, verschoben. den ganzen Weg bis zum Gerät Lünette.

Um dies zu beheben, dass Sie Ihr Thema in v21 styles.xml überschreiben muss enthalten:

<item name="android:windowDrawsSystemBarBackgrounds">false</item> 
<item name="android:statusBarColor">@color/colorPrimaryDark</item> 

Dadurch wird den Inhalt wieder unter der Statusleiste und auch verhindern, dass die Navigationsleiste von der Zeichnung auf der Oberseite des Status bewegen Bar.

Zusätzlich zu den oben aufgeführten Einträge in meinem v21 Arten, mein Aktivitätscode sah wie folgt aus:

// Fixes bottom navbar shadows from appearing on side navigation drawers 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    WindowManager.LayoutParams attributes = getWindow().getAttributes(); 
    attributes.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; 
    getWindow().setAttributes(attributes); 
} 
Verwandte Themen