web-dev-qa-db-fra.com

Android Lollipop, la vue personnalisée AppCompat ActionBar ne prend pas toute la largeur de l'écran

Donc, je viens de mettre à jour ma base de code vers 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 n’occupe plus toute la largeur de l’écran, laissant une mince bande à gauche.

Building with 19 Comme il avait l'air

Building with 21 Il en a l'air maintenant

C'est le code que j'utilise pour configurer la barre d'actions. 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.string.youtube);
    ImageView back = (ImageView) actionBar.getCustomView().findViewById(R.id.action_bar_back);
    back.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
        }
    });
}

Modifier

La suppression de la vue personnalisée et la modification de l'arrière-plan occupent désormais toute la largeur. Le problème est donc: comment pouvons-nous faire en sorte qu'un CustomView occupe toute la largeur du ActionBar?

96
Stevie Kideckel

Cela semble dû aux dernières modifications apportées à la ActionBar dans la récente mise à jour du appcompat-v7 . Il semble y avoir d'importants changements dans la façon dont vous devriez gérer les barres d'action.

J'ai fait face au même problème et après avoir lu la documentation ActionBar , et surtout la citation suivante, j'ai trouvé une solution.

À partir de Android L (API niveau 21), la barre d’action peut être représentée par n’importe quel widget Barre d’outils de la présentation de l’application. L'application peut indiquer à l'activité quelle 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'attribut 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 rompre avec un certain nombre de choses, mais offraient beaucoup plus de flexibilité de l’autre .

  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 mise en page d'activité
  3. Définissez l'attribut app:contentInsetStart="0dp". C'est le principal problème avec la marge que vous décrivez dans votre question
<Android.support.v7.widget.Toolbar xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/actionBar"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    app:contentInsetEnd="0dp"
    app:contentInsetStart="0dp" >
</Android.support.v7.widget.Toolbar>

Il est généralement recommandé de le faire dans un fichier de présentation séparé et d'utiliser include dans la présentation de votre activité. Vous ne devez donc personnaliser la barre d'outils qu'à un seul emplacement si vous l'utilisez dans plusieurs activités

<include layout="@layout/view_action_bar" />
  1. Utilisez findViewById et setSupportActionBar dans votre activité onCreate à 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 avez fait cela, toutes les actions ajoutées dans onCreateOptionsMenu seront ajoutées à la barre d’outils et elles seront traitées comme la barre d’activités.
  2. Personnalisez davantage la barre d’outils selon vos besoins (Ajouter des vues enfants, etc.)
109
Muzikant

Au lieu de faire le travail mentionné par Muzikant et aimez 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 ajouter 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.

UPDATE: Après quelques recherches, j'ai constaté que cette solution ne fonctionnerait pas dans certains cas. L’espace latéral gauche (HOME ou BACK) sera supprimé, mais l’espace latéral droit (MENU) restera 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 de droite soit également supprimé de la barre d’action de support. 

51
Amrut Bidri

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

<style name="AppTheme" parent="Theme.AppCompat">
  <item name="toolbarStyle">@style/AppThemeToolbar</item>
</style>

<style name="AppThemeToolbar" parent="Widget.AppCompat.Toolbar" >
  <item name="contentInsetStart">0dp</item>
</style>
30
GDA

Aucune des autres réponses n’a fonctionné pour moi, j’ai donc jeté un coup d’œil aux styles actuels d’AppCompat v7, trouvés ici .

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

<item name="contentInsetStart">@dimen/abc_action_bar_content_inset_material</item>
<item name="contentInsetEnd">@dimen/abc_action_bar_content_inset_material</item>

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

<style name="ActionBar" parent="@style/Base.Widget.AppCompat.ActionBar">
        <item name="contentInsetStart">0dp</item>
        <item name="contentInsetEnd">0dp</item>
</style>

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

8
Justin

Après avoir beaucoup frappé 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 le tour

1
user330844

Écrivez ces deux lignes en plus de votre code

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

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;

0
Salman Anjum