带图标的Android弹出菜单(类似于Google Map app 6)

时间:2011-11-30 11:57:13

标签: android menu popup

有人知道Android版Google地图官方应用的新版本6中的菜单使用了哪些组件?

我正在尝试构建一个类似于此的菜单,在官方开发页面中找不到任何内容(注意:我的目标是Gingerbread API,可能具有高达1.6的向后兼容性。)

这是我在这个菜单中找到的唯一图片(这是在ICS上,但姜饼上显示的内容类似)。请在此处查看左侧屏幕截图(来自Gizmodo网站):

from Gizmodo http://media.gizmodo.co.uk/wp-content/uploads/2011/11/GoogleMaps6.0.jpg

如果没有内置组件,您会采用什么方法来构建一个组件?

最糟糕的是,如果Android 2.x不存在此类组件,您是否知道Google Map应用程序本身是否是开源的,以及在哪里可以找到它的来源?

4 个答案:

答案 0 :(得分:11)

这应该适用于API 4(但未经过测试,YMMV)。例如:

An example

如果您使用的是ActionBarSherlock,则可以使用IcsListPopupWindow类。在onCreate上设置一些属性。您还需要子类化ArrayAdapter。

onCreate()中的

mPopupMenu = new IcsListPopupWindow(getContext());
mAdapter = new PopupMenuAdapter(this, android.R.layout.simple_list_item_1, yourArrayOfPopupMenuItems);
mPopupMenu.setAdapter(mAdapter);
mPopupMenu.setModal(true);
mPopupMenu.setOnItemClickListener(this);
mPopupMenu.setOnDismissListener(this); // only if you need it

片段/活动中的内部类:

private class PopupMenuAdapter extends ArrayAdapter<PopupMenuItem> {

    Context context;
    int layoutResourceId;
    PopupMenuItem data[] = null;

    public PopupMenuAdapter(Context context, int layoutResourceId, PopupMenuItem[] data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;

        // initialize a view first
        if (view == null) {
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            view = inflater.inflate(layoutResourceId, parent, false);
        }

        PopupMenuItem pItem = data[position];
        TextView text = (TextView)view.findViewById(android.R.id.text1);
        text.setText(pItem.textResId);
        text.setCompoundDrawablesWithIntrinsicBounds(pItem.iconResId, 0, 0, 0);

        return view;
    }
}

// ... PopupMenuItem is just a container

private static class PopupMenuItem {
    public int iconResId;
    public int textResId;

    public PopupMenuItem(int iconResId, int textResId) {
        this.iconResId = iconResId;
        this.textResId = textResId;
    }
}

每当您需要展示时(例如在View.OnClickListener中)

mPopupMenu.setContentWidth(getActivity().getWindowManager().getDefaultDisplay().getWidth() / 2);
PopupAdapter.notifyDataSetChanged(); // if you change anything
mPopupMenu.setAnchorView(yourAnchorView);
mPopupMenu.show();

在您的OnItemClickListener

请务必致电mPopupMenu.dismiss()

希望这有帮助!感谢Jake Wharton的ABS!

答案 1 :(得分:4)

PopupMenu可能就是你要找的东西。但是,它仅适用于Android 3.0+(在API级别11中引入),据我所知,它不存在于兼容性库中。

答案 2 :(得分:2)

请查看以下链接。有一个很好的Quick Action对话框示例。所以你可以修改你想要的代码。

http://www.londatiga.net/it/how-to-create-quickaction-dialog-in-android/

答案 3 :(得分:0)

这看起来更像是一个自定义操作栏。可能是ActionProvider。 ActionBar自API级别11开始提供,但请查看ActionBarSherlock