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

Gui*_*ume 4 android menu popup

有没有人知道在谷歌地图官方应用程序的新版本6中用于菜单的组件是什么?

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

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

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

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

在最糟糕的情况下,如果Android 2.x不存在此类组件,您是否知道Google Map应用程序本身是否是开源的,以及在何处查找其来源?

Ole*_*ich 11

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

一个例子

如果您使用的是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
Run Code Online (Sandbox Code Playgroud)

片段/活动中的内部类:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

在OnItemClickListener中

一定要打电话mPopupMenu.dismiss()!

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