web-dev-qa-db-fra.com

Comment créer un PopupMenu personnalisé dans Android

Comment puis-je reproduire quelque chose comme je l'ai fait ci-dessous dans Balsamiq? 

J'ai fait ce menu, mais il affiche seulement le texte des éléments (pas les icônes). Est-il possible d'afficher le titre et l'icône dans un PopupMenu?

Voici mon create_post_menu.xml

<?xml version="1.0" encoding="utf-8"?>

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

    <item
        Android:id="@+id/action_photo"
        Android:icon="@drawable/ic_action_camera"
        Android:title="@string/action_photo"
        Android:showAsAction="always|withText" />

    <item
        Android:id="@+id/action_video"
        Android:icon="@drawable/ic_action_video"
        Android:title="@string/action_video"
        Android:showAsAction="always|withText" />

    <item
        Android:id="@+id/action_text"
        Android:icon="@drawable/ic_action_edit"
        Android:title="@string/action_text"
        Android:showAsAction="always|withText" />

    <item
        Android:id="@+id/action_link"
        Android:icon="@drawable/ic_action_web_site"
        Android:title="@string/action_link"
        Android:showAsAction="always|withText" />

</menu>

A

Modifier

Voici mes méthodes onCreateOptionsMenu et onOptionsItemSelected:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.action_new) {
        View menuItemView = findViewById(R.id.action_new);
        PopupMenu popupMenu = new PopupMenu(this, menuItemView);
        popupMenu.inflate(R.menu.create_post_menu);
        popupMenu.show();
        return true;
    } else if(item.getItemId() == R.id.action_search) {
        return true;
    } else if(item.getItemId() == R.id.action_settings) {
        startActivity(new Intent(MainActivity.this, SettingsActivity.class));
        return true;
    } else if(item.getItemId() == R.id.action_help) {
        return true;
    } else {
        return super.onOptionsItemSelected(item);
    }
}
13
lschlessinger

J'ai résolu ce problème en plaçant simplement le create_post_menu à l'intérieur de la item dont l'icône est un +.

Par exemple, j'ai (avec AppCompat):

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

    <item
            Android:id="@+id/action_new"
            Android:icon="@drawable/ic_action_new"
            Android:title="@string/action_new"
            app:showAsAction="always">

            <menu>

                <item
                    Android:id="@+id/action_photo"
                    Android:icon="@drawable/ic_action_camera"
                    Android:title="@string/action_photo"
                    app:showAsAction="always|withText" />
                <item
                    Android:id="@+id/action_video"
                    Android:icon="@drawable/ic_action_video"
                    Android:title="@string/action_video"
                    app:showAsAction="always|withText" />
                <item
                    Android:id="@+id/action_text"
                    Android:icon="@drawable/ic_action_text"
                    Android:title="@string/action_text"
                    app:showAsAction="always|withText" />
                <item
                    Android:id="@+id/action_place"
                    Android:icon="@drawable/ic_action_place"
                    Android:title="@string/action_place"
                    app:showAsAction="always|withText" />
                <item
                    Android:id="@+id/action_more"
                    Android:title="@string/action_more"
                    Android:visible="false"
                    app:showAsAction="always|withText" />

            </menu>
        </item>
        ...(more menu items here)
</menu>

Sans AppCompat, vous pouvez simplement vous débarrasser de l'espace de noms XML app en remplaçant app par Android.

15
lschlessinger
import Android.os.Bundle;  
import Android.app.Activity;  
import Android.view.Menu;  
import Android.view.MenuItem;  
import Android.view.View;  
import Android.view.View.OnClickListener;  
import Android.widget.Button;  
import Android.widget.PopupMenu;  
import Android.widget.Toast;  
public class MainActivity extends Activity {  
Button button1;  

         @Override  
         protected void onCreate(Bundle savedInstanceState) {  
          super.onCreate(savedInstanceState);  
          setContentView(R.layout.activity_main);  

          button1 = (Button) findViewById(R.id.button1);//your created butto
          button1.setOnClickListener(new OnClickListener() {  

           @Override  
           public void onClick(View v) {  
            //Creating the instance of PopupMenu  
            PopupMenu popup = new PopupMenu(MainActivity.this, button1);  
            //Inflating the Popup using xml file  
            popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu());  

            //registering popup with OnMenuItemClickListener  
            popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {  
             public boolean onMenuItemClick(MenuItem item) {  
              Toast.makeText(MainActivity.this,"You Clicked : " + item.getTitle(),Toast.LENGTH_SHORT).show();  
              return true;  
             }  
            });  

            popup.show();//showing popup menu  
           }  
          });//closing the setOnClickListener method  
         }  
    }  
12
user3585662

J'espère que ma réponse précédente Ici peut vous aider.
Si vous souhaitez simplement un menu contextuel similaire, vous pouvez utiliser ActionProvider. C'est plus puissant.
Si vous le voulez comme un vrai menu, vous pouvez utiliser le PopupMenu personnalisé.

0
Allen Heavey