Android Lollipop, l’affichage personnalisé AppCompat ActionBar ne prend pas toute la largeur de l’écran

Donc, je viens de mettre à jour mon code à Lollipop, et j’ai des problèmes avec la barre d’action. J’utilise AppCompat et ActionBarActivity et gonfle une vue personnalisée. Il semble que la vue personnalisée ne prenne plus toute la largeur de l’écran, laissant une fine bande à gauche

Construire avec 19 Comme il avait l’air

Construire avec 21 Il ressemble maintenant

C’est le code que j’utilise pour configurer la barre d’action. Quelqu’un a des idées?

final ActionBar actionBar = getSupportActionBar(); if(actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(false); actionBar.setDisplayShowHomeEnabled(false); actionBar.setDisplayShowTitleEnabled(false); actionBar.setDisplayShowCustomEnabled(true); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); actionBar.setCustomView(R.layout.action_bar_content_search_custom_view); actionBar.setBackgroundDrawable(null); // actionBar.setStackedBackgroundDrawable(null); TextView title = (TextView) actionBar.getCustomView().findViewById(R.id.action_bar_title); title.setText(R.ssortingng.youtube); ImageView back = (ImageView) actionBar.getCustomView().findViewById(R.id.action_bar_back); back.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); } 

modifier

Prendre la vue personnalisée et modifier l’arrière-plan prend désormais toute la largeur. Le problème est donc de savoir comment un CustomView peut occuper toute la largeur de l’ActionBar.

Il semble que cela soit dû aux dernières modifications apscopes à ActionBar dans la récente mise à jour de appcompat-v7 . Il semble qu’il y ait des changements importants dans la façon dont vous devez gérer les barres d’action.

J’ai rencontré le même problème et après avoir lu la documentation d’ ActionBar , et en particulier la citation suivante, j’ai trouvé une solution.

À partir d’Android L (niveau 21 de l’API), la barre d’action peut être représentée par n’importe quel widget de la barre d’outils dans la présentation de l’application. L’application peut signaler à l’activité que la barre d’outils doit être traitée comme la barre d’action de l’activité. Les activités qui utilisent cette fonctionnalité doivent utiliser l’un des thèmes .NoActionBar fournis, définir l’atsortingbut windowActionBar sur false ou ne pas demander la fonctionnalité de fenêtre.

À mon avis, les thèmes AppCompat ont été modifiés et, d’une part, semblaient briser quelques points, mais apportaient beaucoup plus de souplesse. Je recommande de suivre ces étapes:

  1. Utilisez le style .NoActionBar dans votre activité comme décrit dans la citation ci-dessus
  2. Ajouter un android.support.v7.widget.Toolbar à votre disposition d’activité
  3. Définissez l’ app:contentInsetStart="0dp" . Ceci est le problème principal avec la marge que vous décrivez dans votre question
   

Il est généralement recommandé de le faire dans un fichier de mise en page distinct et d’utiliser include dans la mise en page de votre activité afin de personnaliser la barre d’outils en un seul endroit si vous l’utilisez dans plusieurs activités.

  
  1. Utilisez findViewById et setSupportActionBar dans votre activité onCreate pour signal to the Activity which Toolbar should be treated as the Activity's action bar
 Toolbar actionBar = (Toolbar) findViewById(R.id.actionBar); setSupportActionBar(actionBar); 
  1. Une fois que vous faites cela, toutes les actions ajoutées dans onCreateOptionsMenu seront ajoutées à la barre d’outils et seront traitées comme la barre d’action d’activité.
  2. Personnalisez davantage la barre d’outils comme vous le souhaitez (Ajouter des vues enfants, etc.)

Au lieu de faire beaucoup de travail comme mentionné par Muzikant et aimer cette réponse

  getSupportActionBar().setDisplayShowHomeEnabled(false); getSupportActionBar().setDisplayShowTitleEnabled(false); getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.WHITE)); LayoutInflater mInflater = LayoutInflater.from(this); View mCustomView = mInflater.inflate(R.layout.action_bar_home, null); getSupportActionBar().setCustomView(mCustomView); getSupportActionBar().setDisplayShowCustomEnabled(true); Toolbar parent =(Toolbar) mCustomView.getParent();//first get parent toolbar of current action bar parent.setContentInsetsAbsolute(0,0);// set padding programmatically to 0dp 

Vous devez append uniquement les deux dernières lignes de code pour résoudre votre problème.

J’espère que cela pourrait vous aider et aider quelqu’un d’autre.

MISE À JOUR: Après avoir fait des recherches à ce sujet, j’ai trouvé que cette solution ne fonctionnera pas dans certains cas. L’espace latéral gauche (HOME ou BACK) sera supprimé, mais l’écart latéral droit (MENU) restra tel quel. Voici la solution dans ces cas.

 View v = getSupportActionBar().getCustomView(); LayoutParams lp = v.getLayoutParams(); lp.width = LayoutParams.MATCH_PARENT; v.setLayoutParams(lp); 

Ajoutez ces quatre lignes au code ci-dessus, de sorte que l’espace latéral droit soit également supprimé de la barre d’action du support.

Je pense que vous pouvez aussi le faire dans les styles. essaye ça. testé sur kitkat

   

Aucune des autres réponses ne fonctionnait pour moi, alors j’ai jeté un coup d’œil aux styles réels d’AppCompat v7, trouvés ici .

Si vous regardez le style Base.Widget.AppCompat.ActionBar, il a:

 @dimen/abc_action_bar_content_inset_material @dimen/abc_action_bar_content_inset_material 

Il est donc évident que nous devons simplement remplacer ces propriétés dans notre propre style de barre d’action:

  

Cela a bien fonctionné pour moi, j’espère que cela aidera les autres aussi.

Je viens juste de rencontrer ce problème aujourd’hui, puis j’ai découvert que j’avais res/values-v21/styles.xml dans mon projet qui était généré automatiquement par Android Studio et c’est la cause.

Pourquoi?

Parce que le contenu de mes res/values-v21/styles.xml était:

     

Et mes res/values/styles.xml contenaient quelque chose comme:

  

Ensuite, lorsque j’ai lancé mon application sur Lollipop, le res/values-v21/styles.xml été utilisé, ce qui a causé un problème exact. Donc, je suis venu à une solution simple est de supprimer:

   

dans res/values-v21/styles.xml

Après avoir battu ma tête contre le moniteur, cela a fonctionné pour moi

  Toolbar toolbar = (Toolbar) actionBar.getCustomView().getParent(); toolbar.setContentInsetStartWithNavigation(0); toolbar.setContentInsetEndWithActions(0); toolbar.setContentInsetsAbsolute(0, 0); toolbar.setPadding(0, 0, 0, 0); 

Le getCustomView (). GetParent () est ce qui a fait l’affaire

jusqu’au point:

  ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); actionBar.setCustomView(R.layout.actionbar_layout); Toolbar toolbar = (Toolbar) actionBar.getCustomView().getParent(); toolbar.setContentInsetsAbsolute(0, 0); toolbar.setPadding(0, 0, 0, 0); 

assurez-vous d’importer la bonne barre d’outils – android.support.v7.widget.Toolbar;

Écrivez ces deux lignes en plus de votre code

 Toolbar toolbar=(Toolbar)viewActionBar.getParent(); toolbar.setContentInsetsAbsolute(0,0);