J'essaie d'utiliser Android ActionBar
dans mon application et j'ai une option cachée dans le menu de débordement.
Il y a beaucoup de documentation, mais c'est déroutant car la plupart d'entre elles ne concernent que les très anciennes versions d'Android, et lorsque vous essayez d'appliquer les mêmes concepts, ils ne fonctionnent plus ou fonctionnent différemment.
C'est dans ma mise en page Activity
<Android.support.v7.widget.Toolbar
Android:id="@+id/my_toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:titleTextColor="@Android:color/white"
Android:background="@color/colorPrimary"
Android:elevation="4dp"
Android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
Et ceci est dans la méthode onCreate()
de mon Activity
// sets up activity toolbar
Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(myToolbar);
myToolbar.showOverflowMenu();
myToolbar.setTitleTextColor(R.color.lightPrimaryText);
J'ai également essayé de gonfler un fichier xml de menu à partir de la onCreateOptionsMenu()
, mais cela ne m'a pas non plus donné les résultats que je voulais.
Définissez un Menu
pour votre Toolbar
dans le dossier de ressources res/menu , par exemple:
toolbar_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
tools:context=".activity.MainActivity">
<item
Android:id="@+id/action_sign_out"
Android:title="@string/toolbar_sign_out"
app:showAsAction="never"/>
</menu>
La définition de app:showAsAction="never"
Garantit que ce MenuItem
ne sera pas affiché dans le Toolbar
, mais placé dans le menu de débordement à la place.
Le thème de votre Activity
doit être (ou dériver de) l'un des thèmes NoActionBar
(Theme.AppCompat.NoActionBar
Par exemple, ou Theme.MaterialComponents.NoActionBar
Si vous utilisez - Composants matériels ).
Dans votre Activity
, configurez votre Toolbar
:
Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(myToolbar);
Et surchargez onCreateOptionsMenu()
pour gonfler votre ressource de menu précédemment définie:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar_menu, menu);
return true;
}
Vous pouvez remplacer onOptionsItemSelected()
pour définir le comportement onClick de vos MenuItem
(s):
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_sign_out: {
// do your sign-out stuff
break;
}
// case blocks for other MenuItems (if any)
}
return true;
}
dans le fichier manifeste déclarer
Android:theme="@style/AppTheme.NoActionBar"
comme ça :
<activity
Android:name=".ActivityName"
Android:label="@string/label"
Android:theme="@style/AppTheme.NoActionBar" />
et ajoutez ceci à votre style:
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
et appelez cela dans Activity onCreate ():
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
remplacer cette méthode dans l'activité:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.product_list, menu);
//U can find item set icon and stuff...
MenuItem item= menu.findItem(R.id.action_search);
return true;
}
et déclarez votre menu comme ceci pour le menu de débordement:
<?xml version="1.0" encoding="utf-8"?>
<menu >
<group>
<item
Android:id="@+id/sign_out"
Android:title="@string/sign_out" />
<item
Android:id="@+id/about"
Android:title="@string/about" />
</group>
</menu>
et pour la sélection de l'élément de poignée, appelez cela
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case R.id.sign_out:
//do stuff
break;
}
return super.onOptionsItemSelected(item);
}
terminé :)