Je prévois d'utiliser un schéma d'interface utilisateur pour les actions rapides dans mon application. Modèle d'interface utilisateur des actions rapides Android . La fenêtre d'action rapide nécessite une vue pivot à laquelle s'en tenir.
quickAction.show(View pivotView);
J'ai l'intention d'utiliser l'action rapide pour l'élément de menu, je peux accéder à l'élément sur lequel vous cliquez. Mais le problème est que je dois référencer une vue à partir de l'élément de menu afin de pouvoir la transmettre à l'action rapide.
Comment puis-je obtenir une référence à une vue dans le menuItem qui est sélectionné.
Vous pouvez y parvenir en fournissant à votre élément de menu une propriété actionViewClass au format XML. Vous pourrez alors obtenir la vue pivot que vous souhaitez. Le code serait quelque chose comme ça
<item
Android:id="@+id/menu_find"
Android:showAsAction="ifRoom"
Android:actionViewClass="Android.widget.ImageButton"
/>
Faites ceci dans votre menu OnCreateOptions
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.menu_search, menu);
locButton = (ImageButton) menu.findItem(R.id.menu_find).getActionView();
locButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
createPopup();
mQuickAction.show(v);
}
});
return true;
}
Vieille question, mais j'ai rencontré quelques problèmes avec l'attribut actionViewClass
. Pour quiconque se heurte à cela plus tard ...
L'appel de findViewById(R.id.mnu_item)
dans onOptionsItemSelected
renverra une ancre View
.
QuickActions
sur la MenuItems
ne sont pas une bonne conception, mais j’ai trouvé qu’elles étaient le moyen le plus simple d’implémenter des sous-menus avec des arrière-plans personnalisés.
Afin de obtenir des vues de référence des éléments de menu nous devons le faire,
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.section, menu);
new Handler().post(new Runnable() {
@Override
public void run() {
final View menuItemView = findViewById(R.id.action_preview);
// SOME OF YOUR TASK AFTER GETTING VIEW REFERENCE
}
});
return true;
}
Une mise à jour pour quiconque veut trouver l'élément de vue de menu pour d'autres raisons (comme je voulais).
Si vous avez accès à la barre d'outils d'AppCompat et que vous l'utilisez, il existe un moyen. Ce n'est pas le moyen le plus efficace, mais c'est le moyen le plus simple que j'ai trouvé d'accéder à la vue de l'élément de menu.
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
// Find Menu
for (int toolbarChildIndex = 0; toolbarChildIndex < toolbar.getChildCount(); toolbarChildIndex++) {
View view = toolbar.getChildAt(toolbarChildIndex);
// Found Menu
if (view instanceof ActionMenuView) {
ActionMenuView menuView = (ActionMenuView) view;
// All menu items
for (int menuChildIndex = 0; menuChildIndex < menuView.getChildCount(); menuChildIndex++) {
ActionMenuItemView itemView = (ActionMenuItemView) menuView.getChildAt(menuChildIndex);
// Do something to itemView...
}
}
}
}
dans la classe d'activité principale, il est préférable de remplacer la méthode onOptionsItemSelected (...); devrait être quelque chose comme ci-dessous:
public boolean onOptionsItemSelected(MenuItem item) {
// the id is of type int
int someId = item.getItemId();
// can use an if() or switch() statement to check if id is selected
//a Toast message can be used to show item is selected
}
Vous pouvez obtenir une référence à un élément de menu comme ceci:
MenuItem btnFavorites = menu.findItem(R.id.action_favorite);
Et ensuite faites ce que vous voulez avec. Par exemple. change son icône comme ceci:
btnFavorites.setIcon(R.drawable.ic_favorite_false);