8

ho affinato il modello di progetto di navigazione cassetto attività di Android Studio, che utilizza Toolbar, v7.app.ActionBarDrawerToggle e NavigationView al posto del NavigationDrawerFragment (e il layout/fragment_navigation_drawer .xml).Sovrapposizione effetto ombra rimane sul di navigazione cassetto NavigationView

Navigation Drawer in immersive-sticky when the drawer is closed

E 'perfettamente funzionante. Quindi, vado oltre. Ho il mio progetto Navigation Drawer nella modalità immersiva-sticky (schermo intero).

@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; 
    } 

    ... 

} 

Un problema è aumentato. Le bande di ombreggiatura sovrapposte sul NavigationView che derivano dalla barra di stato (sul lato superiore) e dalla barra di navigazione (sul lato inferiore) rimangono ferme.

When Navigation Drawer is opened

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

Come posso liberarmi di loro?

Ho esaminato i sorgenti di v7.app.ActionBarDrawerToggle o NavigationView di Android, ma invano.


Aggiornato:

Grazie per la consulenza di @ lcw_gg, ho deciso di eliminare l'ombra della barra di stato completamente (mentre l'ombra della barra di navigazione rimane). Cioè per impostare l'attributo android:windowFullscreentrue nel layout xml.

Ma voglio farlo nel codice Java. Ho trovato un modo e probabilmente è equivalente al modo in xml:

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

E con questo modo, non hanno bisogno di più di impostare questi due bandiere - View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN e View.SYSTEM_UI_FLAG_FULLSCREEN - al decorationView.

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

Eppure, non riesco a trovare il modo per sbarazzarsi dell'ombra della barra di navigazione. Sto aspettando una soluzione.

+0

Quali livelli API significa questo problema si verifica su? È tutto di loro o solo post-lecca-lecca? – PPartisan

+0

@PPartisan Il mio dispositivo è 5.1.1 (API-22 Lollipop; Nexus7). Non ho ancora esaminato altri dispositivi. – hata

+0

Può valere la pena sperimentare con gli attributi 'android: elevation' nei file' layout' 'xml' in quel caso. Ho avuto problemi simili in passato, quando ho dimenticato l'elevazione. – PPartisan

risposta

13

Finalmente l'ho fatto.

La soluzione utilizza FLAG_LAYOUT_NO_LIMITS insieme FLAG_FULLSCREEN all'oggetto android.view.Window.

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

Questo ha eliminato perfettamente entrambe le ombre. commento

enter image description here

di lcw_gg è stato molto utile indizio per manipolare android.view.Window. Un ringraziamento speciale a lui.

+0

GRAZIE GRAZIE! - Stavo lottando per forse 20 ore intere cercando di ottenere questo funzionamento, gli attributi della vista di ricerca, cercando di capire perché questa trasparenza della barra di navigazione non andasse via sui dispositivi Lollipop +. –

0

Per quelli con lo stesso problema di cui sopra, ma vuole mantenere la barra di stato del sistema che mostra sempre (quindi non utilizzando WindowManager.LayoutParams.FLAG_FULLSCREEN), c'è qualche lavoro in più si deve fare per evitare che un creep contenuto di strano sotto la barra di stato su lecca lecca. Non ho notato il problema su kitkat quando l'ho provato.

Stavo usando due cassetti di navigazione (sinistra e destra) e stranamente avevo solo la sinistra che gettava l'ombra sul fondo. Una volta applicato WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS come mostrato nella risposta accettata, l'ombra è scomparsa, ma il contenuto si è insinuato sotto la barra di stato e il disegno del cassetto di navigazione nella parte superiore della barra di stato; fino alla mascherina del dispositivo.

per risolvere questo è necessario sovrascrivere il tema in v21 styles.xml per includere:

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

Questo sposterà il contenuto al di sotto della barra di stato e anche prevenire il cassetto di navigazione dal disegno sulla parte superiore dello stato bar.

Oltre alle voci di cui sopra nei miei stili V21, il mio codice di attività si presentava così:

// 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); 
}