Je développe une application simple pour tester la conception du matériau. J’utilise com.android.support:appcompat-v7:21.0.0
et mon activité ressemble à:
public class MyActivity extends ActionBarActivity { ... }
La mise en page est définie comme suit:
Maintenant, j’ai défini mon thème en suivant les directives matérielles suivantes:
@color/colorPrimary500 @color/colorPrimaryDark700
Je voudrais changer la couleur de la barre d’état dans pré Android 5 et le définir sur colorPrimaryDark
mais je ne trouve pas le chemin. J’ai essayé d’utiliser:
getWindow().setStatusBarColor(..)
mais la couleur setStatusBar est disponible à partir du niveau 21. Pourquoi, si je définis un colorPrimaryDark
dans mon thème et que j’utilise appcompact, la barre d’état ne change pas de couleur? Tout le monde peut aider?
La barre d’état est une fenêtre système appartenant au système d’exploitation. Sur les appareils Android antérieurs à la version 5.0, les applications ne sont pas autorisées à modifier leur couleur. Par conséquent, la bibliothèque AppCompat ne peut pas prendre en charge les versions de plate-forme plus anciennes. Le meilleur que AppCompat peut faire est de prendre en charge la coloration d’ ActionBar
et d’autres widgets d’interface utilisateur courants dans l’application.
Bien que la coloration de la barre d’état ne soit pas prise en charge <5.0, sur 4.4, vous pouvez utiliser un contournement pour obtenir une couleur plus sombre:
Rendre la barre d’état translucide
- true
Ensuite, utilisez la barre d’outils AppCompat pour votre appbar, en vous assurant qu’elle correspond aux fenêtres système:
Assurez-vous de définir votre barre d’outils comme la barre d’outils de votre activité:
protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ... toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar);
La barre d’outils s’étend sous la barre d’état et la semi-transparence de la barre d’état fait apparaître une couleur secondaire plus sombre. Si ce n’est pas la couleur que vous souhaitez, cette combinaison vous permet d’ajuster une vue sous votre barre d’état avec la couleur d’arrière-plan de votre choix (même si elle est encore teintée par la barre d’état).
Une sorte de solution de contournement due à 4.4 uniquement, mais voilà.
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)); }
Placez ce code dans la méthode onCreate
votre activité. Cela m’a aidé
Comme d’autres l’ont également mentionné, cela peut être facilement résolu en ajoutant ce qui suit à onCreate () de l’activité:
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)); }
Cependant, le point important que je veux append ici est que, dans certains cas, même le précédent ne change pas la couleur de la barre d’état. Par exemple, lors de l’utilisation de la bibliothèque MikePenz pour le tiroir de navigation, elle remplace implicitement la couleur de la barre d’état, de sorte que vous devez append manuellement les éléments suivants pour que cela fonctionne:
.withStatusBarColorRes (R.color.status_bar_color)
La coloration de la barre d’état n’est pas prise en charge dans AppCompat v7: 21.0.0.
Du blog post sur les développeurs Android
Sur les anciennes plates-formes, AppCompat émule le thème de la couleur dans la mesure du possible. Pour le moment, cela se limite à la coloration de la barre d’action et de certains widgets.
Cela signifie que la librairie AppCompat ne colorera que les barres d’état sur Lollipop et les versions ultérieures.
Passez à AppCompatActivity et ajoutez un paddingTop de 25 dp sur la barre d’outils et activez
- true
Ensuite, la barre d’outils va
Cette solution définit la couleur de la barre d’état de Lollipop, Kitkat et certains périphériques pré-Lollipop (Samsung et Sony). Le SystemBarTintManager gère les périphériques 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); }
Créer un parent de style Theme.AppCompa t
Et mettez getSupportActionBar().getThemedContext()
dans onCreate()
.
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); getSupportActionBar().getThemedContext(); }
Je sais que cela ne répond pas à la question, mais avec Material Design (API 21+), nous pouvons changer la couleur de la barre d’état en ajoutant cette ligne dans la déclaration du thème dans styles.xml
:
Notez l’ android:statusBarColor
, où nous pouvons définir la couleur, sinon la valeur par défaut est utilisée.