How to show icons in context menu in android?

谁说胖子不能爱 提交于 2019-12-13 12:19:33

问题


I have a button on my app, when I click that it should display context Menu, But I know we can not show icons in context Menu. I have seen few Apps having icons in their context menu as shown in the link:

http://pavansdroidapps.blogspot.com/2011/06/context-menu.html


回答1:


you can create a custom dialog on the click of the button And inflate any layout (with or without images in it) in it using LayoutInflater. http://developer.android.com/guide/topics/ui/dialogs.html#CustomDialog




回答2:


While the API doesn't support icons in Context Menu, but we can always fake it by inflating a Dialog with our own view that looks like context menu.

Copy-pasting the following files exactly will do the job:

MainActivity.java

public class MainActivity extends Activity {

List<ContextMenuItem> contextMenuItems;
Dialog customDialog;

LayoutInflater inflater;
View child;
ListView listView;
ContextMenuAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    inflater = (LayoutInflater) this
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    child = inflater.inflate(R.layout.listview_context_menu, null);
    listView = (ListView) child.findViewById(R.id.listView_context_menu);

    contextMenuItems = new ArrayList<ContextMenuItem>();
    contextMenuItems.add(new ContextMenuItem(getResources().getDrawable(
            R.drawable.ic_launcher), "Facebook"));
    contextMenuItems.add(new ContextMenuItem(getResources().getDrawable(
            R.drawable.ic_launcher), "Scanner"));

    adapter = new ContextMenuAdapter(this,
            contextMenuItems);
    listView.setAdapter(adapter);

            listView.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View v,
                int position, long id) {
            customDialog.dismiss();
            if (position == 0)
                Toast.makeText(MainActivity.this, "00", Toast.LENGTH_SHORT)
                        .show();

            if (position == 1)
                Toast.makeText(MainActivity.this, "11", Toast.LENGTH_SHORT)
                        .show();

        }
    });

    customDialog = new Dialog(this);
    customDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    customDialog.setContentView(child);
    customDialog.show();
    }

}

ContextMenuItem.java

public class ContextMenuItem {

Drawable drawable;
String text;

public ContextMenuItem(Drawable drawable, String text) {
    super();
    this.drawable = drawable;
    this.text = text;
}

public Drawable getDrawable() {
    return drawable;
}

public void setDrawable(Drawable drawable) {
    this.drawable = drawable;
}

public String getText() {
    return text;
}

public void setText(String text) {
    this.text = text;
}

}

ContextMenuAdapter.java

public class ContextMenuAdapter extends BaseAdapter {
Context context;
List<ContextMenuItem> listContextMenuItems;
LayoutInflater inflater;

public ContextMenuAdapter(Context context,
        List<ContextMenuItem> listContextMenuItems) {
    super();
    this.context = context;
    this.listContextMenuItems = listContextMenuItems;
}

static class ViewHolder {
    protected ImageView imageView;
    protected TextView textView;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;
    if (convertView == null) {
        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        viewHolder = new ViewHolder();
        convertView = inflater.inflate(R.layout.context_menu_item, parent,
                false);
        viewHolder.imageView = (ImageView) convertView
                .findViewById(R.id.imageView_menu);
        viewHolder.textView = (TextView) convertView
                .findViewById(R.id.textView_menu);
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    viewHolder.imageView.setImageDrawable(listContextMenuItems
            .get(position).getDrawable());
    viewHolder.textView.setText(listContextMenuItems.get(position)
            .getText());
    return convertView;

}

@Override
public int getCount() {
    return listContextMenuItems.size();
}

@Override
public Object getItem(int position) {
    return null;
}

@Override
public long getItemId(int position) {
    return 0;
}

}

context_menu_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="10dp"
android:paddingLeft="10dp"
android:paddingTop="10dp" >

<ImageView
    android:id="@+id/imageView_menu"
    android:layout_width="70dp"
    android:layout_height="70dp"
    android:scaleType="fitXY" />

<TextView
    android:id="@+id/textView_menu"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:layout_marginLeft="10dp"
    android:layout_toRightOf="@+id/imageView_menu" />

</RelativeLayout>

listview_context_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/listView_context_menu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/view" />



回答3:


Perhaps this can be done using popup window with a list, where list item is built of an icon and some caption



来源:https://stackoverflow.com/questions/6370905/how-to-show-icons-in-context-menu-in-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!