web-dev-qa-db-fra.com

Android Lollipop, ajouter un menu contextuel à partir du titre dans la barre d'outils

Je ne vois pas comment l'ajout d'un menu contextuel à partir du titre est effectué comme le montrent de nombreux exemples de conception matérielle. Toute aide serait très appréciée.

Toolbar Popup From Title

45
Matt Wear

Vous allez avoir besoin d'ajouter un spinner à la barre d'outils:

<Android.support.v7.widget.Toolbar
        Android:id="@+id/toolbar"
        Android:layout_height="?attr/actionBarSize"
        Android:layout_width="match_parent"
        Android:background="?attr/colorPrimary">

    <Spinner
            Android:id="@+id/spinner_nav"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content" />

</Android.support.v7.widget.Toolbar>

Vous devrez ensuite désactiver le titre par défaut:

Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);

Vous pouvez ensuite récupérer et configurer le Spinner si nécessaire dans votre activité/fragment.

96
Chris Banes

Je suis tombé sur cette question alors que je cherchais une solution pour empêcher le popup de superposer le disque et je voudrais laisser ici une solution alternative à cette question, car il est possible d’ajouter le disque à la barre d’outils en utilisant le menu.xml bien

activity_main.xml

<LinearLayout 
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"

Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">

<Android.support.design.widget.AppBarLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:fitsSystemWindows="true">

    <Android.support.v7.widget.Toolbar
        Android:id="@+id/toolbar"
        Android:layout_width="match_parent"
        Android:layout_height="?attr/actionBarSize"
        Android:background="?attr/colorAccent" />

</Android.support.design.widget.AppBarLayout>

 <!-- Other layout widgets -->

</LinearLayout>

menu_main.xml

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">

<item
    Android:id="@+id/spinner"
    Android:title="Spinning"
    app:actionViewClass="Android.widget.Spinner"
    app:showAsAction="always" />

<!-- Other items -->

</menu>

Votre activité

Il sera nécessaire de remplacer la méthode onCreateOptionMenu () , puis utilisez getMenuInflater () pour gonfler le fichier de menu créé précédemment. 

Vous aurez également besoin d’obtenir l’objet Spinner et de lui régler un adaptateur comme vous le feriez normalement.

   @Override
public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.menu_main, menu);

    //Get Spinner item from menu

    MenuItem spinnerMenuItem = menu.findItem(R.id.spinner);
    final Spinner spinner = (Spinner) MenuItemCompat.getActionView(spinnerMenuItem);

    //Set adapter whichever way you prefer (from the resource or manually)

    final ArrayAdapter<CharSequence> spinnerAdapter = ArrayAdapter
            .createFromResource(this, R.array.items_array, Android.R.layout.simple_spinner_dropdown_item);
    spinnerAdapter.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(spinnerAdapter);

    return true;

}

Style.xml

Enfin, si vous voulez personnaliser votre spinner

<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="Android:spinnerStyle">@style/spinner_style</item>
</style>

<style name="spinner_style" parent="Widget.AppCompat.Spinner">
    <item name="Android:dropDownVerticalOffset">40dip</item>
    <!--<item name="Android:dropDownHorizontalOffset">0dip</item>-->
    <item name="overlapAnchor">false</item>

    <!--Other customizations-->

</style>

0
Ruan_Lopes