Je veux utiliser ToolBar
au lieu de ActionBar
, mais ne me montre pas le menu dans la barre d'outils !!! Je veux définir un menu tel que les boutons Refresh ou Setting dans ActionBar
.
Code Toolbar.xml:
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.Toolbar
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="?attr/colorPrimary"
Android:minHeight="?attr/actionBarSize"
app:navigationContentDescription="@string/abc_action_bar_up_description"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:title="Main Page"
Android:gravity="center"/>
MainPage.Java code:
public class MainPage extends AppCompatActivity {
private Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_page);
toolbar = (Toolbar) findViewById(R.id.main_toolbar);
setSupportActionBar(toolbar);
if (getSupportActionBar() != null) {
getSupportActionBar().setTitle("Main Page");
}
toolbar.setSubtitle("Test Subtitle");
toolbar.inflateMenu(R.menu.main_manu);
}
}
main_menu.xml code:
<?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">
<item
Android:id="@+id/menu_main_setting"
Android:icon="@drawable/ic_settings"
Android:orderInCategory="100"
app:showAsAction="always"
Android:actionLayout="@layout/toolbar"
Android:title="Setting" />
<item
Android:id="@+id/menu_main_setting2"
Android:icon="@drawable/ic_settings"
Android:orderInCategory="200"
app:showAsAction="always"
Android:actionLayout="@layout/toolbar"
Android:title="Setting" />
</menu>
Comment résoudre ce problème et afficher le menu dans Toolbar
? merci à tous <3
écrasez simplement onCreateOptionsMenu comme ceci dans votre MainPage.Java
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main_menu, menu);
return true;
}
Vous devez remplacer ce code dans votre activité:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu, this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main2, menu);
return true;
}
et configurez votre barre d’outils comme ceci:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Je ne sais pas pourquoi mais ça marche pour moi.
toolbar = (Toolbar) findViewById(R.id.main_toolbar);
toolbar.setSubtitle("Test Subtitle");
toolbar.inflateMenu(R.menu.main_manu);
Pour l'élément de menu, cliquez sur le faire
toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
if(item.getItemId()==R.id.item1)
{
// do something
}
else if(item.getItemId()== R.id.filter)
{
// do something
}
else{
// do something
}
return false;
}
});
Met à jour la partie 'pourquoi' de cette réponse lorsque je trouve un bonne explication.
Heureux d'aider quand même :) Paix.
Voici une réponse plus complète en tant que référence pour les futurs visiteurs. J'utilise généralement un barre d'outils de support mais cela fonctionne aussi bien dans les deux cas.
Cela va être dans res/menu/main_menu
.
res
et choisissez Nouveau> Fichier de ressources Android. main_menu
pour le nom du fichier.Collez le contenu suivant comme entrée.
<?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">
<item
Android:id="@+id/action_add"
Android:icon="@drawable/ic_add"
app:showAsAction="ifRoom"
Android:title="Add">
</item>
<item
Android:id="@+id/action_settings"
app:showAsAction="never"
Android:title="Settings">
</item>
</menu>
Vous pouvez cliquer avec le bouton droit de la souris sur res
et choisir Nouvel actif d'image pour créer l'icône ic_add
.
Dans votre activité, ajoutez la méthode suivante.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
return true;
}
Également dans votre activité, ajoutez la méthode suivante:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.action_add:
addSomething();
return true;
case R.id.action_settings:
startSettings();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
Bien que je sois d’accord avec cette réponse, elle contient moins de lignes de code et fonctionne:
Comment définir le menu sur la barre d'outils dans Android
Ma suggestion serait de toujours commencer tout projet en utilisant l'Assistant Android Studio. Dans ce code, vous trouverez quelques styles: -
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
et l'utilisation est:
<Android.support.design.widget.AppBarLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:theme="@style/AppTheme.AppBarOverlay">
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</Android.support.design.widget.AppBarLayout>
En raison de no action bar theme
déclaré dans styles.xml
, qui est appliqué au Main Activity
dans le AndroidManifest.xml
, il n'y a pas d'exception, vous devez donc le vérifier à cet endroit.
<activity Android:name=".MainActivity" Android:screenOrientation="portrait"
Android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Toolbar
n'est pas une entité indépendante, c'est toujours un enfant Voir dans AppBarLayout
qui est encore l'enfant de CoordinatorLayout
.TOUS LES DEUX:
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ET:
Comment définir le menu sur la barre d'outils dans Android
MARCHERA.
Bonne codage :-)
Aussi, vous en avez besoin pour mettre en œuvre des actions pour toutes les options du menu.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_help:
Toast.makeText(this, "This is teh option help", Toast.LENGTH_LONG).show();
break;
default:
break;
}
return true;
}
Dans votre activité, remplacez cette méthode.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
return true;
}
Cela va gonfler votre menu ci-dessous:
<?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">
<item
Android:id="@+id/menu_main_setting"
Android:icon="@drawable/ic_settings"
Android:orderInCategory="100"
app:showAsAction="always"
Android:actionLayout="@layout/toolbar"
Android:title="Setting" />
<item
Android:id="@+id/menu_main_setting2"
Android:icon="@drawable/ic_settings"
Android:orderInCategory="200"
app:showAsAction="always"
Android:actionLayout="@layout/toolbar"
Android:title="Setting" />
</menu>
Dans mon cas, j'utilise un AppBarLayout avec un CollapsingToolbarLayout et le menu défilait toujours hors de l'écran, j'ai résolu mon problème en basculant Android: actionLayout dans le code XML du menu sur l'ID de la barre d'outils. J'espère que cela peut aider les gens dans la même situation!
activity_main.xml
<Android.support.design.widget.CoordinatorLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:fab="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context=".activities.MainScreenActivity"
Android:screenOrientation="portrait">
<Android.support.design.widget.AppBarLayout
Android:layout_width="match_parent"
Android:layout_height="300dp"
app:elevation="0dp"
Android:theme="@style/AppTheme.AppBarOverlay">
<Android.support.design.widget.CollapsingToolbarLayout
Android:id="@+id/collapsingBar"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:layout_scrollFlags="exitUntilCollapsed|scroll"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginStart="48dp"
app:expandedTitleMarginEnd="48dp"
>
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="?attr/colorPrimary"
app:elevation="0dp"
app:popupTheme="@style/AppTheme.PopupOverlay"
app:layout_collapseMode="pin"/>
</Android.support.design.widget.CollapsingToolbarLayout>
</Android.support.design.widget.AppBarLayout>
</Android.support.design.widget.CoordinatorLayout>
main_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">
<item
Android:id="@+id/logoutMenu"
Android:orderInCategory="100"
Android:title="@string/log_out"
app:showAsAction="never"
Android:actionLayout="@id/toolbar"/>
<item
Android:id="@+id/sortMenu"
Android:orderInCategory="100"
Android:title="@string/sort"
app:showAsAction="never"/> </menu>
Une solution simple à ce problème a été de définir showAsAction
sur always
dans menu.xml
dans res/menu
<?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">
<item
Android:id="@+id/add_alarm"
Android:icon="@drawable/ic_action_name"
Android:orderInCategory="100"
Android:title="Add"
app:showAsAction="always"
Android:visible="true"/>
</menu>