web-dev-qa-db-ja.com

AndroidでカスタムPopupMenuを作成する方法

以下で作成したようなものをBalsamiqで複製するにはどうすればよいですか?

このメニューを作成しましたが、アイテムのテキストのみを表示しています(アイコンは表示していません)。 PopupMenuにタイトルとアイコンの両方を表示することは可能ですか?

これが私の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

編集

ここに私のonCreateOptionsMenuonOptionsItemSelectedメソッドがあります:

@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

アイコンがcreate_post_menuであるitem内に+を配置するだけでこの問題を解決しました。

たとえば、私は(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>

AppCompatがなければ、appappに置き換えることで、XML名前空間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

私の以前の答え ここ があなたを助けることを願っています。
同様のポップアップメニューが必要な場合は、ActionProviderを使用できます。より強力です。
真のメニューとして使用したい場合は、カスタムPopupMenuを使用できます。

0
Allen Heavey