LIRE CE QUI SUIT
Comme cela a été dit, la "vérification manuelle" n'est que la partie émergée de l'iceberg. Le menu défile si vite les utilisateurs ne voient rien se passer et c'est très contre-intuitif, frustrant, et en fait de la merde totale. Le site REAL TASK
(donc) permet à l'événement de la case à cocher d'être digéré par l'esprit des utilisateurs.
Bonne nouvelle : cette peut être fait et ça marche et c'est comme ça qu'il faut faire. @TouchBoarder a eu le meilleur, je vais donc copier son code, puis le développer.
l'idée est de détecter si la case à cocher est cliquée, puis (et seulement si celle-ci est choisie) de supprimer légèrement la suppression du menu, d'ajouter une minuterie pendant 500 ms puis de fermer le menu, ce qui donne à l'animation "tick" de la case à cocher le temps de se dérouler et crée la bonne "sensation".
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_favorite"
android:checkable="true"
android:title="@string/action_favorite"
app:actionViewClass="android.widget.CheckBox"
app:showAsAction="ifRoom|withText" />
</menu>
puis tu fais cette méthode comme d'habitude, mais tu t'assures d'ajouter tout ce bumpf supplémentaire
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the bottom bar and the top bar (weird)
BottomAppBar bottomBar = findViewById(R.id.bottom_app_bar_help);
Menu bottomMenu = bottomBar.getMenu();
getMenuInflater().inflate(R.menu.bottom_nav_menu, bottomMenu);
for (int i = 0; i < bottomMenu.size(); i++) {
bottomMenu.getItem(i).setOnMenuItemClickListener(item -> {
if (item.getItemId()==R.id.action_favorite){
item.setChecked(!item.isChecked());
// Keep the popup menu open
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
item.setActionView(new View(frmMain.this));
item.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
final Handler handler = new Handler();
handler.postDelayed(() -> bottomMenu.close(), 500);
return false;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
final Handler handler = new Handler();
handler.postDelayed(() -> bottomMenu.close(), 500);
return false;
}
});
return false;
}
else {
return onOptionsItemSelected(item);
}
});
}
return true;
}
les autres événements du menu sont ici
public boolean onOptionsItemSelected(MenuItem item) {
// Bottom Bar item click
try {
switch (item.getItemId()) {
case R.id.mnuExit:
MenuClick(ClickType.LOGOUT);
return true;
case R.id.mnuList:
MenuClick(ClickType.LIST);
return true;
default:
return super.onOptionsItemSelected(item);
}
} catch (Exception e) {
e.printStackTrace();
}
return super.onOptionsItemSelected(item);
}
2 votes
Il suffit de définir non pas Android:checkable à "true", mais Android:checked !