Je développe une application dans laquelle je dois ajouter une mise en page personnalisée dans la barre d'actions. L'ajout de la disposition personnalisée est terminé, mais lorsque j'ajoute les éléments de menu de la barre d'actions, celle-ci change de position à droite de la barre d'actions et se centre au centre de la barre d'actions. Vous trouverez ci-dessous l'image de ce que j'ai réalisé jusqu'à présent.
Je veux quelque chose comme ça sur la barre d'action.
Disposition personnalisée (bouton jaune) à l'extrême droite de la barre d'actions et des éléments de menu au milieu.
Ajouter mon code pour réaliser cette mise en page personnalisée à l'aide de la barre d'action Android native:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
actionBar = getActionBar();
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setDisplayHomeAsUpEnabled(false);
actionBar.setDisplayShowCustomEnabled(true);
cView = getLayoutInflater().inflate(R.layout.header, null);
actionBar.setCustomView(cView);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.websearch_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case Android.R.id.home:
finish();
default:
return super.onOptionsItemSelected(item);
}
}
Comment cela peut il etre accompli?
Toute aide sera appréciée.
Je suppose que vous définissez votre vue personnalisée en tant que vue personnalisée dans la barre d'actions. Si vous utilisez ActionbarSherlock, vous pouvez plutôt ajouter la vue personnalisée en tant qu'élément de menu normal et définir une vue d'action à l'aide de .setActionView(yourCustomView or yourCustomLayoutId)
. Vous pouvez ensuite définir .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS)
pour afficher la vue. Assurez-vous simplement que votre vue personnalisée est définie sur width wrap_content
ou sinon, elle repoussera les autres éléments de menu hors de l'écran. Cela pourrait aussi fonctionner sans ActionbarSherlock, mais je ne l’ai pas encore essayé.
EDIT: Essayez de modifier votre méthode onCreateOptionsMenu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.websearch_menu, menu);
// add this
menu.add(Menu.NONE, 0, Menu.NONE, "custom")
.setActionView(R.layout.header)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
return true;
}
et supprimez cela de votre méthode onCreate
actionBar.setDisplayShowCustomEnabled(true);
cView = getLayoutInflater().inflate(R.layout.header, null);
actionBar.setCustomView(cView);
MODIFIER:
Si vous avez besoin de référencer les vues depuis votre mise en page personnalisée, vous pouvez le faire dans votre méthode onCreateOptionsMenu
comme suit (note: j'ai écrit ce code dans le navigateur, donc rien ne garantit que je n'ai pas fait de faute de frappe ou quelque chose)
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// inflate the menu and add the item with id viewId,
// which has your layout as actionview
View actionView = menu.getItem(viewId).getActionView();
View viewFromMyLayout = actionView.findViewById(R.id.viewFromMyLayout);
// here you can set listeners to your view or store a reference
// to it somewhere, so you can use it later
return true;
}
Utilisez simplement orderInCategory
dans votre fichier xml et il passera de nombre inférieur à supérieur (du côté gauche de votre barre d’action). Tel que:
<item
Android:id="@+id/Refresh"
Android:icon="@drawable/ic_action_refresh"
Android:showAsAction="ifRoom"
Android:title="@string/refresh"
Android:orderInCategory="2"/>
<item
Android:id="@+id/Search"
Android:icon="@drawable/ic_action_action_search"
Android:showAsAction="ifRoom|collapseActionView"
Android:title="@string/search"
Android:orderInCategory="1"/>
Même si, Refresh item arrive en premier dans un fichier xml, ce ne sera pas le premier. Mais Rechercher L’icône de gauche à droite dans votre barre d’action sera la première en fonction de son attribut orderInCategory.
L'ordre des éléments de menu sera défini en fonction de leur ordre dans le fichier XML où ils sont gonflés.
Par conséquent, il vous suffit de modifier l'ordre du fichier XML à votre guise.
Une façon d'y parvenir consiste à appeler invalidateOptionMenu et dans la méthode onCreateOptionsMenu , placez les éléments en fonction de l'ordre dans lequel vous souhaitez les placer.
En passant, si vous utilisez ActionBarSherlock, cette méthode est disponible, alors ignorez les avertissements Lint à ce sujet.