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.
Comme il avait l'air
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?
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 .
.NoActionBar
dans votre activité, comme décrit dans la citation ci-dessus.Android.support.v7.widget.Toolbar
à votre mise en page d'activité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" />
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);
onCreateOptionsMenu
seront ajoutées à la barre d’outils et elles seront traitées comme la barre d’activités.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.
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>
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.
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
Écrivez ces deux lignes en plus de votre code
Toolbar toolbar=(Toolbar)viewActionBar.getParent();
toolbar.setContentInsetsAbsolute(0,0);
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;