15

Я играл с новой библиотекой поддержки дизайна Google, и это взрыв! Я просто немного озадачен, но на навигационном экране. Все, что я прочитал, говорит, что NavigationView достаточно умен, чтобы самостоятельно обрабатывать прозрачный холст. (Сообщение android-developers, для одного, поиск scrim). Во всяком случае, когда я пытался сделать это я получаю следующий результат:Как заставить новый навигационный экран играть хорошо со строкой состояния?

Transparent Scrim

который является большим; Именно то, что я хочу. За исключением одного. Когда ящик закрыт, холст является уродливым темно-серым, а не моим основным цветом. , ,

enter image description here

Вот мой макет:

<android.support.v4.widget.DrawerLayout 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:id="@+id/drawer_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true" > 

<android.support.design.widget.CoordinatorLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true"> 

    <LinearLayout 
     android:id="@+id/linear_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <include layout="@layout/toolbar" /> 

     <fragment 
      android:id="@+id/fragment" 
      android:name="com.gmail.rixx.justin.envelopebudget.HomeFragment" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      tools:layout="@layout/fragment_home" /> 

    </LinearLayout> 

    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/fab" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:layout_gravity="end|bottom" 
     android:layout_margin="@dimen/fab_margin" 
     app:backgroundTint="@color/accent" 
     android:src="@drawable/ic_add_white_24dp" /> 

</android.support.design.widget.CoordinatorLayout> 

<android.support.design.widget.NavigationView 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    app:headerLayout="@layout/drawer_header" 
    app:menu="@menu/drawer" /> 

</android.support.v4.widget.DrawerLayout> 

Код Активность:

public class Home extends ActionBarActivity { 

    private Toolbar mToolbar; 
    private DrawerLayout mDrawerLayout; 
    private Context mContext = this; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_home); 

     setUpToolbar(); 
     setUpNavDrawer(); 

     findViewById(R.id.fab).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       startActivity(new Intent(mContext, NewTransactionActivity.class)); 
      } 
     }); 
    } 

    private void setUpToolbar() { 
     mToolbar = (Toolbar) findViewById(R.id.toolbar); 
     if (mToolbar != null) { 
      setSupportActionBar(mToolbar); 
     } 
    } 

    private void setUpNavDrawer() { 
     if (mToolbar != null) { 
      mDrawerLayout = (DrawerLayout)  findViewById(R.id.drawer_layout); 

      getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
      mToolbar.setNavigationIcon(R.drawable.ic_menu_white_24dp); 
      mToolbar.setNavigationOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        mDrawerLayout.openDrawer(GravityCompat.START); 
       } 
      }); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_home, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

И V21/стили:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style name="AppTheme" parent="AppTheme.Base"> 
     <item name="android:colorPrimary">@color/primary</item> 
     <item name="android:colorPrimaryDark">@color/primary_dark</item> 
     <item name="android:colorAccent">@color/accent</item> 
     <item name="android:textColorPrimary">@color/primary_text</item> 
     <item name="android:textColorSecondary">@color/secondary_text</item> 

     <item name="android:windowDrawsSystemBarBackgrounds">true</item> 
     <item name="android:statusBarColor">@android:color/transparent</item> 

    </style> 
</resources> 

Я смоделированные после Криса Бэйнс s CheeseSquare на github, но я не получаю такого поведения, которое я хочу.

Я попытался удалить windowDrawsSystemBarBackgrounds и statusBarColor от v21/стилей, и я получаю правильный цвет, но строка состояния никогда не выходит прозрачна:

enter image description here

Помощь будет оценена. Это новый материал, поэтому я знаю, что мы все учимся.

Спасибо за чтение!

-Джастин

ответ

23

После борьбы с этим в течение нескольких часов, и Обильно сравнивая мой код приложения cheesesquare, я обнаружил следующее: DrawerLayout должен иметь атрибут android:fitsSystemWindows="true" и NavigationView, а также, но CoordinatorLayout не должен. Как только я сделал эти изменения, это сработало.

Спасибо всем, и, надеюсь, это полезно кому-то!

Вы можете посмотреть мой код для макета here.

-Джастин

+1

yesss !!!! Спасибо Спасибо. Я искал это часами. Документацию для библиотек поддержки и поддержки так сложно найти. Я нахожу, что многие вещи для Android плохо документированы. – Phil

0

Устанавливается в navigationViewandroid:fitsSystemWindows="true" это будет гарантировать, что навигация будет за statusbar и добавьте colorAccent в свой стиль в значений папок.

0

В файле стиля пытаются использовать AppCompact тему как родитель ...

<style name="AppTheme" parent="Base.Theme.AppCompat"> 

Я надеюсь, что это поможет вам ..

1

Вы, , должны проверить новее Примеры SDK.

на самом деле они используют Coordinatorlayout в activity, что вы хотите сделать под statusbar и имеют различные темы для этого макета, потому что если вы поставите прозрачный statusbar для других видов деятельности, где вы не имеете корневой макет Coordinatorlayout он будет показывать белый неокрашенный statusbar.

+0

Это сработало. Спасибо – diordna

+0

Этот ответ устарел, я предлагаю вам увидеть более новый пример ящика. Загрузите новые образцы SDK и просто посмотрите, как это делается. Лично мне тоже не нравится их решение, потому что это похоже на хак, но это лучше, чем мой текущий ответ. –

+0

Спасибо за предложение. Я проверю это. – diordna

10

установить это на вашу навигациюView android:fitsSystemWindows="false"

+0

спасибо, чувак, отлично работайте! –

+0

Я тестировал на Нугате, он хорошо работает для двух случаев: android: fitsSystemWindows = "true/false". но в Kitkat он должен установить android: fitsSystemWindows = "false" для NavigationView для перекрытия строки состояния – HungNM2