Android материал: цвет строки состояния не изменится
Я разрабатываю простое приложение для тестирования материалов. Я использую com.android.support:appcompat-v7:21.0.0 и моя деятельность выглядит так:
public class MyActivity extends ActionBarActivity {
...
}
макет определяется как:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MyActivity">
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="128dp"
android:minHeight="?attr/actionBarSize"
android:background="?attr/colorPrimaryDark"/>
</LinearLayout>
теперь я определил свою тему следующие материальные рекомендации:
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
<item name="colorPrimary">@color/colorPrimary500</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark700</item>
</style>
Я хотел бы изменить цвет строки состояния в pre Android 5 и установить его в colorPrimaryDark но я не могу найти дорогу. Я пробовал использовать:
getWindow().setStatusBarColor(..)
но setStatusBar цвет доступен с уровня 21.
Почему если я определяю colorPrimaryDark в моей теме и использовать appcompact строка состояния не меняет цвет?
Кто может помочь?
9 ответов:
строка состояния-это системное окно, принадлежащее операционной системе. На устройствах Android до 5.0 приложения не имеют разрешения на изменение своего цвета, поэтому это не то, что библиотека AppCompat может поддерживать для более старых версий платформы. Лучший AppCompat может сделать, это обеспечить поддержку окраски
ActionBarи другие общие виджеты пользовательского интерфейса в приложении.
хотя окраска строки состояния не поддерживается
сделать строку состояния полупрозрачной
<item name="android:windowTranslucentStatus">true</item>затем используйте панель инструментов AppCompat для Панели приложений, убедившись, что она подходит для системных окон:
<android.support.v7.widget.Toolbar android:id="@+id/toolbar" ... android:fitsSystemWindows="true"/>не забудьте установить панель инструментов в качестве панели инструментов вашей деятельности:
protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ... toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar);панель инструментов растягивается под строкой состояния, и полупрозрачность строки состояния кажется, что это более темный вторичный цвет. Если это не тот цвет, который вы хотите, эта комбинация позволяет вам разместить вид под вашей строкой состояния, используя цвет фона по вашему выбору (хотя он все еще окрашен темнее в строке состояния).
своего рода крайний случай обходной путь из-за 4.4 только, но там я иду.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); getWindow().setStatusBarColor(getResources().getColor(R.color.actionbar)); }поместите этот код в свою активность
onCreateметод. Это мне помогло.
как другие также упоминали, это можно легко решить, добавив следующее в onCreate () действия:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); getWindow().setStatusBarColor(ContextCompat.getColor(this, R.color.primary_dark)); }однако, важный момент, который я хочу добавить здесь, что в некоторых случаях, даже выше не меняет цвет строки состояния. Например, при использовании библиотеки MikePenz для навигационного ящика она неявно переопределяет цвет строки состояния, поэтому вам необходимо вручную добавить для нее следующее работа:
.withStatusBarColorRes (R. color.status_bar_color)
раскраска строки состояния не поддерживается в AppCompat v7: 21.0.0.
на старых платформах AppCompat эмулирует цветовую тематику, где это возможно. На данный момент это ограничивается окраской панели действий и некоторых виджетов.
Это означает, что AppCompat lib будет окрашивать только строки состояния на Lollipop и выше.
переключитесь на AppCompatActivity и добавьте 25 dp paddingTop на панели инструментов и включите
<item name="android:windowTranslucentStatus">true</item>затем панель инструментов будет идти вверх по вершине
Это решение устанавливает цвет строки состояния Lollipop, Kitkat и некоторых устройств pre Lollipop (Samsung и Sony). Элемент SystemBarTintManager управляет устройствами Kitkat;)
@Override protected void onCreate( Bundle savedInstanceState ) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); hackStatusBarColor(this, R.color.primary_dark); } @SuppressLint("NewApi") @SuppressWarnings("deprecation") public static View hackStatusBarColor( final Activity act, final int colorResID ) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { try { if (act.getWindow() != null) { final ViewGroup vg = (ViewGroup) act.getWindow().getDecorView(); if (vg.getParent() == null && applyColoredStatusBar(act, colorResID)) { final View statusBar = new View(act); vg.post(new Runnable() { @Override public void run() { int statusBarHeight = (int) Math.ceil(25 * vg.getContext().getResources().getDisplayMetrics().density); statusBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, statusBarHeight)); statusBar.setBackgroundColor(act.getResources().getColor(colorResID)); statusBar.setId(13371337); vg.addView(statusBar, 0); } }); return statusBar; } } } catch (Exception e) { e.printStackTrace(); } } else if (act.getWindow() != null) { act.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); act.getWindow().setStatusBarColor(act.getResources().getColor(colorResID)); } return null; } private static boolean applyColoredStatusBar( Activity act, int colorResID ) { final Window window = act.getWindow(); final int flag; if (window != null) { View decor = window.getDecorView(); if (decor != null) { flag = resolveTransparentStatusBarFlag(act); if (flag != 0) { decor.setSystemUiVisibility(flag); return true; } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) { act.findViewById(android.R.id.content).setFitsSystemWindows(false); setTranslucentStatus(window, true); final SystemBarTintManager tintManager = new SystemBarTintManager(act); tintManager.setStatusBarTintEnabled(true); tintManager.setStatusBarTintColor(colorResID); } } } return false; } public static int resolveTransparentStatusBarFlag( Context ctx ) { String[] libs = ctx.getPackageManager().getSystemSharedLibraryNames(); String reflect = null; if (libs == null) return 0; final String SAMSUNG = "touchwiz"; final String SONY = "com.sonyericsson.navigationbar"; for (String lib : libs) { if (lib.equals(SAMSUNG)) { reflect = "SYSTEM_UI_FLAG_TRANSPARENT_BACKGROUND"; } else if (lib.startsWith(SONY)) { reflect = "SYSTEM_UI_FLAG_TRANSPARENT"; } } if (reflect == null) return 0; try { Field field = View.class.getField(reflect); if (field.getType() == Integer.TYPE) { return field.getInt(null); } } catch (Exception e) { } return 0; } @TargetApi(Build.VERSION_CODES.KITKAT) public static void setTranslucentStatus( Window win, boolean on ) { WindowManager.LayoutParams winParams = win.getAttributes(); final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS; if (on) { winParams.flags |= bits; } else { winParams.flags &= ~bits; } win.setAttributes(winParams); }
сделать тема.AppCompa t style parent
<style name="AppTheme" parent="Theme.AppCompat"> <item name="android:colorPrimary">#005555</item> <item name="android:colorPrimaryDark">#003333</item> </style>и поставить
getSupportActionBar().getThemedContext()наonCreate().protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); getSupportActionBar().getThemedContext(); }
Я знаю, что это не ответ на вопрос, но с Material Design (API 21+) мы можем изменить цвет строки состояния, добавив эту строку в объявление темы в
styles.xml:<!-- MAIN THEME --> <style name="AppTheme" parent="@android:style/Theme.Material.Light"> <item name="android:actionBarStyle">@style/actionBarCustomization</item> <item name="android:spinnerDropDownItemStyle">@style/mySpinnerDropDownItemStyle</item> <item name="android:spinnerItemStyle">@style/mySpinnerItemStyle</item> <item name="android:colorButtonNormal">@color/myDarkBlue</item> <item name="android:statusBarColor">@color/black</item> </style>обратите внимание на
android:statusBarColor, где мы можем определить цвет, в противном случае используется значение по умолчанию.
Comments