8
votes

Android: Barre d'état transparente avec couleurs de barre d'action dynamique et tiroir

J'ai une activité avec un Drawerlayout . Notre client nécessite que nous modifions de manière dynamique la couleur de la barre d'action et la couleur de barre d'état correspondante de cette activité en fonction de l'élément sélectionné dans le drawerlayout . Ceci est facilement fait. Cependant, mon problème est que je ne suis pas capable de garder la barre d'état transparente lorsque je modifierai de manière dynamique la couleur de la barre d'état. Lorsque j'ouvre le tiroir, la barre d'état colorée couvre le haut du DrawerLayout comme ceci:

mauvaise mise en page

Cependant, je voudrais Comme mon Drawerlayout Pour ressembler à ceci:

Disposition correcte

Ce que je peux faire avec la ligne suivante: xxx

Cependant, mon problème n'est pas que je ne peux pas définir la transparence de la barre d'état. Mon problème est que le changement dynamique de la barre d'état et de la couleur de la barre d'action ne fonctionne pas avec WindowSlucentStatus . Ma couleur de barrière de statut reste le Colorprimark (la couleur jaunâtre de moutarde visible sur la barre d'état dans les images ci-dessus) même après que j'appelle getwindow (). SetStatusbarcolor () . < / p>

maintenant, j'ai suivi Ce tutoriel et Ce et Ce Stackoverflow se pose parmi beaucoup d'autres, mais n'a pas pu résoudre le problème. Tous ces articles disent que la barre d'action se déplace vers le haut, sous la barre d'état (de sorte que la barre d'état chevauche la barre d'action) une fois que j'ai défini la fenêtre Translucenttatus sur < code> vrai . Ensuite, je devrais pouvoir ajouter un peu de rembourrage à la barre d'action et simplement changer la couleur de la barre d'action entraînerait également une barre d'état plus sombre de la même couleur car la barre d'état est en réalité translucide et se chevauchant ma barre d'action. Cependant, pour une raison quelconque, cela ne se produit pas dans mon cas. La barre d'action reste où il est de savoir si je définis fitssystemwindows sur true ou false ou supprimez l'attribut. La barre d'action est toujours inférieure à la barre d'état qui est bien sûr toujours jaune si je définis la transparence.

J'ai également essayé de définir un alpha à la couleur de la barre d'état lorsque vous le modifiez par programmation. Cela rend la barre d'état quelque peu transparente, mais elle a l'air étrange car il n'est plus vraiment sombre plus. Suppression du coordinatorlayout n'est d'aucune aide, non plus. J'ai passé plusieurs heures à essayer de résoudre ce problème et je suis assez frustré maintenant. Toute aide est grandement appréciée.

mon Activity_Main : xxx

et voici le xml pour mon app_bar_main : xxx


0 commentaires

3 Réponses :


-2
votes

Je fais cela dans mon application comme ça.

String Theme;
    SaveData = getSharedPreferences(SaveFileName,0);
    Theme = SaveData.getString("Theme","Default Theme");
switch(Theme){
        case "Light Theme":
            setTheme(R.style.AppThemeLight);
            setContentView(R.layout.activity_link_manager_light);
            ListTextViewID = R.id.AppListTextViewLight;
            ListRowID = R.layout.app_list_item_light;
            break;


7 commentaires

Vous n'avez peut-être pas bien compris ma question. Je peux facilement régler la couleur de la barre d'état à l'aide de GetWindow (). SetStatusbarcolor (int Color); Vous n'avez pas besoin de redémarrer l'activité pour cet appel ni appel setContentView () Plusieurs fois. Cependant, mon objectif est de définir la barre d'état sur transparent et dessinez la barre d'action sous it. (En outre, le redémarrage d'une activité à plusieurs reprises pour une question aussi triviale est un hack très inélégant.)


O Oui, j'ai raté cela, bien que vous puissiez le faire aussi en commutant le parent thématique de "noactionbar" à ".light" qui ajoutera une barre d'action et vous pouvez définir la couleur à l'aide du thème. Cela fera tout ce que vous voulez mais je ne sais pas comment le faire sans redémarrer l'application.


Vous pouvez également ajouter une barre d'action personnalisée de manière programmative en ayant une linearlayout ou en vue où la barre d'action serait, et la masquez et l'affiche de manière programmative par: "View.setVisibilité (vue.Gone);" "View.setVisibilité (vue.visible);"


En fait, pour me corriger, je ne pense pas qu'il redémarre l'application, juste l'activité, il a une animation sans douleur et il est rapide (au moins sur MM, c'est)


Croyez-moi. Redémarrer une activité plusieurs fois n'est pas quelque chose que vous devriez faire. Vous n'avez pas besoin de changer le thème non plus. Vous semblez assez nouveau à Android. Avez-vous déjà travaillé avec un DrawerLayout ?


Vous changez beaucoup les couleurs? J'ai supposé que ce n'était pas plusieurs fois ...


Il n'y a rien de mal à ce que la pratique pour définir le thème d'une application, il ne se redémarrera que lorsque l'utilisateur modifie un thème, chaque fois qu'il chargera le thème qu'ils se distinguent avec la dernière fois, la première fois et ne pas avoir à redémarrer. D'où les économies sauvages.



0
votes

Comme doc dit ici , flag_translucent_status doit ne pas être réglé.

Pour que cela prend effet, la fenêtre doit dessiner les arrière-plans de barre système avec Flag_Draws_system_bar_backgrounds et Flag_Translucent_status ne doit pas être défini.


1 commentaires

J'avais aussi essayé cela aussi, mais cela entraîne le même comportement que dans le premier coup d'écran. Je veux que cela ressemble à la seconde, mais je puisse toujours changer la couleur de la barre d'état. Je pourrais également simplement rendre la barre d'état transparente et prolonger la barre d'action en dessous. Mais je suis incapable de faire non plus. :(



8
votes

Votre problème est causé parce que getwindow (). SeStatusbarcolor () ne fonctionne pas bien avec le DrawerLayout . Afin de conserver votre barre d'état translucide et de pouvoir changer de couleur, vous devez suivre le processus ci-dessous:

Ajouter / Modifier le thème suivant dans votre v21 / styles.xml fichier comme ci-dessous: xxx

Il s'agit du thème que le standard drawerlayout utilise (en supposant, bien sûr que vous êtes Utilisation de ce thème dans l'activité qui possède le Drawerlayout ). Cela rendra votre barre de statut translucide, comme vous le savez déjà.

suivant, supprimer Android: FitsSystemWindows = "true" à partir du coordinatorlayout dans votre < Code> app_bar_main .

Suivant, où que vous changiez la couleur de la barre d'outils / barre d'état, utilisez drawerlayout.setStatusbarbackground (Colordrawable) en utilisant la même couleur que vous utilisez pour la barre d'outils (en supposant bien sûr. , que la référence à votre dessinerlayout est appelée drawerlayout ). Notez que le drawerlayout.setstatusbarbackground () Méthode prend un objet Diomorable , contrairement à la fenêtre window.setStatusbarcolor () méthode, qui prend un int couleur, vous devrez peut-être convertir votre couleur en une fois à l'aide de quelque chose comme ceci: xxx

Cela garantira que votre barre d'état est également translucide. Afin de donner la possibilité de changer de couleurs. J'espère que vous êtes capable de faire fonctionner cela.


0 commentaires