如何在安卓系统中创建自定义的PopupMenu

13

我如何在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);
    }
}

你是否在使用AppCompact库来实现ActionBar? - Ye Lin Aung
@Ye Lin Aung 不,我不是。 - lschlessinger
你能发一下你的onCreateOptionsMenu()方法吗? - Lazy Ninja
@LazyNinja 我刚刚完成了。 - lschlessinger
我尝试了几种方法,但仍然无法做对。有趣。 - Ye Lin Aung
这并不是一项容易的任务 https://dev59.com/7mw15IYBdhLWcg3wIoRM @YeLinAung - Lazy Ninja
3个回答

18
我通过将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,您只需通过将app替换为android来摆脱XML命名空间app


xmlns:app 的作用是什么? - Malwinder Singh

12
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  
         }  
    }  

1
你的代码可以运行,但只显示标题,如何实现标题和图标一起显示?有什么想法吗? - GS Nayma

0

希望我的先前回答在这里能够帮到你。
如果你只是想要一个类似的弹出菜单,你可以使用ActionProvider。它更加强大。
如果你想要一个真正的菜单,你可以使用自定义PopupMenu。


你知道哪里有完整的示例资源可以参考吗? - lschlessinger
@lschlessinger 只需查看Android开发者指南,http://developer.android.com/guide/topics/ui/actionbar.html#ActionProvider - Allen Heavey
谢谢,我会尝试实现这个功能。非常令人沮丧的是,他们文档中提供的示例 ActionBarSettingsActionProviderActivity 并不存在。 - lschlessinger
@lschlessinger 是的,链接已经移动了,您可以查看这些示例:http://developer.android.com/samples/ActionBarCompat-Basic/index.html - Allen Heavey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接