8

Mam wyrafinowane szablonu projektu nawigacyjny Szuflada aktywności Android Studio, który wykorzystuje Toolbar, v7.app.ActionBarDrawerToggle i NavigationView zamiast NavigationDrawerFragment (i układ/fragment_navigation_drawer .xml).Nakładające efekt cienia pozostaje na panel nawigacji za NavigationView

Navigation Drawer in immersive-sticky when the drawer is closed

Jest doskonale działa. Potem idę dalej. Mam projekt mojej szuflady nawigacji w trybie immersive-sticky (pełny ekran).

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

    ... 

} 

Problem wzrósł. Pasma nałożonego efektu cienia na NavigationView, które pochodzą od paska stanu (na górze) i paska nawigacyjnego (w dolnej części), pozostają bez zmian.

When Navigation Drawer is opened

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

Jak mogę się ich pozbyć?

Sprawdziłem źródła v7.app.ActionBarDrawerToggle lub NavigationView of Android, ale na próżno.


Aktualizacja:

Dzięki za radę @ lcw_gg za, mam pozbyć cieniem na pasku stanu jest całkowicie (podczas gdy cień na pasku nawigacyjnym pozostaje). To jest ustawienie android:windowFullscreen atrybut true w układzie xml.

Ale chcę to zrobić w kodzie Java. Znalazłem sposób i prawdopodobnie jest to równoważne drodze xml:

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

I z ten sposób, nie trzeba nic więcej, aby ustawić te dwie flagi - View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN i View.SYSTEM_UI_FLAG_FULLSCREEN - do decorationView.

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

Nadal nie mogę znaleźć sposobu, aby pozbyć się cieniem na pasku nawigacyjnym jest. Czekam na rozwiązanie.

+0

Co API poziom ma ten problem występuje na? Czy to wszystko z nich, czy tylko po Lollipop? – PPartisan

+0

@PPartisan Moje urządzenie to 5.1.1 (API-22 Lollipop; Nexus7). Nie testowałem jeszcze innych urządzeń. – hata

+0

Może warto eksperymentować z atrybutami 'android: elewacja' w plikach' layout' 'xml'. W przeszłości doświadczyłem podobnych nieszczęść, kiedy zapomniałem o elewacji. – PPartisan

Odpowiedz

13

W końcu udało mi się.

Rozwiązaniem jest użycie FLAG_LAYOUT_NO_LIMITS wraz z FLAG_FULLSCREEN do obiektu android.view.Window.

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

To pozbyło się doskonale obu cieni. Komentarz

enter image description here

lcw_gg był bardzo użyteczną wskazówkę do manipulowania android.view.Window. Specjalne podziękowania dla niego.

+0

DZIĘKUJEMY TAK DUŻO! - Walczyłem przez około 20 godzin, próbując uzyskać te działające atrybuty widoku badawczego, próbując ustalić, dlaczego ta czarna przezroczystość paska nawigacji nie zniknie na urządzeniach Lollipop +. –

0

Dla tych, którzy mają ten sam problem co powyżej, ale chcą, aby pasek stanu systemu był zawsze wyświetlany (a więc nie był używany WindowManager.LayoutParams.FLAG_FULLSCREEN), musisz wykonać dodatkową pracę, aby zapobiec pełzaniu dziwnych treści pod paskiem stanu na Lollipop. Nie zauważyłem problemu na Kitkat, kiedy go testowałem.

Użyłem dwóch szuflad nawigacyjnych (po lewej i prawej) i dziwnie miał tylko lewy rzucający cień na dole. Po zastosowaniu WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, jak pokazano w zaakceptowanej odpowiedzi, cień zniknął, ale następnie miał pełzanie zawartości pod paskiem stanu, a także szuflada nawigacji rysująca na górze paska stanu; aż do ramki urządzenia.

Aby ustalić, że należy zastąpić swój temat w V21 styles.xml obejmuje:

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

To będzie przenieść zawartość z powrotem poniżej paska stanu, a także zapobiec szufladę nawigacji z rysunku na górze statusu bar.

Oprócz powyższych wpisów w moim stylu V21, mój kod aktywność wyglądał następująco:

// 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); 
} 
Powiązane problemy