2016-07-20 4 views
1

Цвет строки состояния для уровня API 21 или выше изменяется в соответствии с моим требованием, но как изменить цвет для уровня API ниже 21. Ниже приведены скриншоты для обоих API, API level 21API level 19Цвет строки состояния для API Уровень ниже 21 не меняется

colors.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <color name="colorPrimary">#3F51B5</color> 
    <color name="colorPrimaryDark">#303F9F</color> 
    <color name="colorAccent">#FFFFFF</color> 
    <item name="b" type="color">#FF33B5E5</item> 

    <item name="p" type="color">#FFAA66CC</item> 

    <item name="g" type="color">#FF99CC00</item> 

    <item name="o" type="color">#FFFFBB33</item> 
</resources> 

Style.xml

<resources> 

<!-- Base application theme. --> 
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
    <!-- Customize your theme here. --> 

    <item name="colorPrimary">@color/colorPrimary</item> 
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
    <item name="colorAccent">@color/colorAccent</item> 
    <item name="windowActionBarOverlay">false</item> 
    <item name="windowNoTitle">true</item> 
    <item name="windowActionBar">false</item> 
</style> 

<style name="AppTheme.NoActionBar"> 
    <item name="colorPrimary">@color/colorPrimary</item> 
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
    <item name="colorAccent">@color/colorAccent</item> 
    <item name="windowActionBar">false</item> 
    <item name="windowNoTitle">true</item> 
</style> 

<style name="MyCustomTabLayout" parent="Widget.Design.TabLayout"> 
    <item name="tabSelectedTextColor">@color/colorAccent</item> 
</style> 

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" /> 

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" /> 

Это то, что происходит, когда я выполняю изменения after the changes

ответ

1

, потому что под API 21, изменение строки состояния цвета не поддерживается

+0

, но как изменить цвет на уровне API 19.Is Есть ли решение? –

+0

да, вы можете это сделать, но он приходит на затраты. Вам нужно вручную создать свой собственный вид для строки состояния и выполнить расчет размера, чтобы отобразить его в соответствующем месте. Отметьте эту ссылку [строка состояния] (http://stackoverflow.com/questions/22192291/how-to-change-the-status-bar-color-in-android) –

0

попытаться использовать

<item name="android:statusBarColor">@color/color_name</item> 

внутри вы стиль.

+0

Я пробовал это раньше, но он показывает, что минимальный уровень api должен быть 21 .. И минимум для мой проект API уровня 14 –

+0

он должен работать на уровне api 19 или выше. Невозможно изменить цвет строки состояния на уровне api менее 19. – Konstantin

2

Строка состояния окраски не поддерживается ниже уровня API 21. Однако вы можете использовать несколько методов, с помощью которых вы можете сделать это ДО уровня API 19.

Добавьте это в файл build.gradle:

compile 'com.readystatesoftware.systembartint:systembartint:1.0.3' 

в вашей деятельности до метода setContentView вызвать этот метод:

private void initStatusBar() { 
    Window window = getWindow(); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { 
     window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 
     SystemBarTintManager tintManager = new SystemBarTintManager(this); 
     tintManager.setStatusBarTintEnabled(true); 
     tintManager.setTintColor(ContextCompat.getColor(this, R.color.primaryDark)); 
    } 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 
     window.setStatusBarColor(Color.TRANSPARENT); 
    } 


} 

После этого в файле activity_layout.xml добавить этот атрибут макета верхнего уровня:

android:fitsSystemWindows="true" 

Это, как он появляется на леденец и выше:

enter image description here

и это на KitKat:

enter image description here

+0

этот трюк заставил мою панель инструментов сдвинуться выше строки состояния. –

+0

Да, это случилось со мной. android: fitsSystemWindows = "true" исправляет это. У меня есть скриншоты для одного и того же. – Embydextrous

+0

Я добавил команду. Не работаю. Я разместил снимок экрана выше для эффекта изменений. –

0

Для вашей информации не будет классов по умолчанию не или способы изменения цвета строки состояния в соответствии с API 21.

Еще вы хотите реализовать свое требование, тогда вы можете применить игру с макетом и стилем.

значение папки Make для апи версии т.е. значения-v19

<!-- Base application theme. --> 
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
    <!-- Customize your theme here. --> 
    <item name="colorPrimary">@color/colorPrimary</item> 
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
    <item name="colorAccent">@color/colorAccent</item> 
    <item name="android:windowTranslucentNavigation">false</item> 
    <item name="android:windowTranslucentStatus">true</item> 
    <item name="android:windowNoTitle">true</item> 
</style> 

Теперь нужно изменить в макете.

<?xml version="1.0" encoding="utf-8"?> 
<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" 
    android:orientation="vertical" 
    tools:context="moon.testwithold.MainActivity"> 
    <RelativeLayout 
     android:id="@+id/statusbar" 
     android:layout_width="match_parent" 
     android:layout_height="25dp" 
     android:layout_alignParentTop="true" 
     android:background="@color/colorPrimaryDark" > 
    </RelativeLayout> 
    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Hello World!" /> 
</LinearLayout> 

Теперь нужно изменить в главном классе

public class MainActivity extends AppCompatActivity { 
    RelativeLayout statusbar; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     statusbar=(RelativeLayout)findViewById(R.id.statusbar); 
     if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) 
     { 
      int titleBarHeight= getStatusBarHeight(); 
      Log.e("TAG"," titleBarHeight "+titleBarHeight); 
      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,titleBarHeight); 
      statusbar.setLayoutParams(params); 
      statusbar.setVisibility(View.VISIBLE); 
     } 
     else 
     { 
      statusbar.setVisibility(View.GONE); 
     } 
    } 
    public int getStatusBarHeight() { 
     int result = 0; 
     int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); 
     if (resourceId > 0) { 
      result = getResources().getDimensionPixelSize(resourceId); 
     } 
     return result; 
    } 
} 

Примечание:

Если вы хотите сделать умный работу, пожалуйста, сделать глобальный класс активности (Base деятельности) и реализации выше метода в том, что класса и расширить этот класс при любой активности, чтобы вы могли делать умную работу и сокращать кодирование.

0

является изменение статуса бар цвета для уровня апи ниже 21

public void setStatusBarColor(Activity activity, int RecColor) { 
     Window window = activity.getWindow(); 
     // clear FLAG_TRANSLUCENT_STATUS flag: 
     window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 
     // add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window 
     window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 
     // finally change the color 
     window.setStatusBarColor(ContextCompat.getColor(activity, RecColor)); 
    } 
Смежные вопросы