Как заставить новый NavigationView играть хорошо со строкой состояния?
Я играл с новой библиотекой поддержки дизайна 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/styles:
<?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>
Я смоделировал приложение ChrisSquare от Chris Banes на github, но я не получаю такого поведения, которое я хочу.
Я попытался удалить windowDrawsSystemBarBackgrounds
и statusBarColor
из v21/styles, и я получаю правильный цвет, но строка состояния никогда не становится прозрачной:
![enter image description here]()
Помощь будет оценена по достоинству. Это новый материал, поэтому я знаю, что мы все учимся.
Спасибо за чтение!
-Джастин
Ответы
Ответ 1
После того, как вы столкнулись с этим еще несколько часов и тщательно сравнили свой код с приложением cheesesquare, я нашел следующее: DrawerLayout
должен иметь атрибут android:fitsSystemWindows="true"
и NavigationView
, а также CoordinatorLayout
не должно. Как только я сделал эти изменения, он сработал.
Спасибо всем, и, надеюсь, это кому-то поможет!
Вы можете посмотреть мой код для макета здесь.
-Джастин
Ответ 2
установите это для вашего navigationView android:fitsSystemWindows="false"
Ответ 3
Вы должны проверить новые примеры SDK.
на самом деле они используют Coordinatorlayout
в activity
, который вы хотите нарисовать под statusbar
, и иметь разную тему для этого макета, потому что если вы поместите прозрачный statusbar
для других действий, где у вас нет корневого макета Coordinatorlayout
будет отображаться белая неокрашенная statusbar
.
Ответ 4
установите это значение в navigationView
android:fitsSystemWindows="true"
, это гарантирует, что навигационная система будет находиться за statusbar
и добавит colorAccent
в ваш стиль в values .
Ответ 5
В вашем файле стиля попытайтесь использовать тему AppCompact как родительский...
<style name="AppTheme" parent="Base.Theme.AppCompat">
Надеюсь, это поможет вам.