Добавить значок контекстного меню в android

У меня есть Listview с ContextMenu, но когда я устанавливаюIcon для ContextMenu, похоже, что он не работает

public void onCreateContextMenu(ContextMenu menu , View v, ContextMenuInfo menuInfo){ super.onCreateContextMenu(menu, v, menuInfo); menu.add(0, DELETE_ID, 0, R.string.context_menu_favorite) .setIcon(android.R.drawable.btn_star); } 

Контекстные меню не поддерживают значки.

Примечание. Элементы контекстного меню не поддерживают значки или сочетания клавиш.

Эта библиотека позволяет вам иметь контекстное меню (реализованное как AlertDialog ) с значками, используя стандартное меню XML.

https://code.google.com/p/android-icon-context-menu/

Хотя API Android не разрешает значки в контекстных меню, вы можете видеть много мест, где Android их использует. Хорошим примером является длительное нажатие на главный экран.

Я потратил время, чтобы прорваться через источник Launcher и AnyCut и обнаружил, что Google использует свой собственный собственный класс, который расширяет BaseAdapter вместе со своим собственным макетом.

Я смог точно скопировать их класс и макет и использовать его в своем приложении. Класс, если вы хотите его искать, называется AddAdapter.java.

Наслаждайтесь!

Проверьте этот …

 @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); menu.setHeaderTitle("Settings"); menu.setHeaderIcon(R.drawable.ic_settings); menu.add(0, v.getId(), 0, "Action 1"); menu.add(0, v.getId(), 0, "Action 2"); menu.add(0, v.getId(), 0, "Action 3"); } @Override public boolean onContextItemSelected(MenuItem item) { if (item.getTitle() == "Action 1") { Toast.makeText(this, "Action 1 invoked", Toast.LENGTH_SHORT).show(); } else if (item.getTitle() == "Action 2") { Toast.makeText(this, "Action 2 invoked", Toast.LENGTH_SHORT).show(); } else if (item.getTitle() == "Action 3") { Toast.makeText(this, "Action 3 invoked", Toast.LENGTH_SHORT).show(); } else { return false; } return true; } 

Хотя API не поддерживает значки в контекстном меню, но мы всегда можем подделать его, раздувая диалог с помощью собственного представления, которое выглядит как контекстное меню.

Скопировать вставку следующих файлов точно выполнит эту задачу:

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" /> 

Я сделал это следующим образом:

Ссылка на скриншот:

Введите описание изображения здесь

Меню:

menu_patient_language.xml

 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context=".activities.PatientSelectionActivity"> <item android:id="@+id/menuEnglish" android:icon="@drawable/language_english" android:title="@string/english" /> <item android:id="@+id/menuFrench" android:icon="@drawable/language_french" android:title="@string/french" /> </menu> 

Стиль:

style.xml:

  <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="android:popupMenuStyle">@style/popupMenuStyle</item> </style> <!--- Language selection popup --> <style name="popupMenuStyle" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="android:textColor">@color/colorPrimary</item> <item name="android:itemBackground">@android:color/white</item> </style> 

Код Java:

  private void showPopup(View v) { Context wrapper = new ContextThemeWrapper(this, R.style.popupMenuStyle); PopupMenu mypopupmenu = new PopupMenu(wrapper, v); setForceShowIcon(mypopupmenu); MenuInflater inflater = mypopupmenu.getMenuInflater(); inflater.inflate(R.menu.menu_patient_language, mypopupmenu.getMenu()); mypopupmenu.show(); // mypopupmenu.getMenu().getItem(0).setIcon(getResources().getDrawable(R.mipmap.ic_launcher)); mypopupmenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { txtPreferredLanguage.setText(item.getTitle().toString()); switch (item.getItemId()) { case R.id.menuEnglish: // Your code goes here break; case R.id.menuFrench: // Your code goes here break; } return false; } }); } private void setForceShowIcon(PopupMenu popupMenu) { try { Field[] mFields = popupMenu.getClass().getDeclaredFields(); for (Field field : mFields) { if ("mPopup".equals(field.getName())) { field.setAccessible(true); Object menuPopupHelper = field.get(popupMenu); Class<?> popupHelper = Class.forName(menuPopupHelper.getClass().getName()); Method mMethods = popupHelper.getMethod("setForceShowIcon", boolean.class); mMethods.invoke(menuPopupHelper, true); break; } } } catch (Throwable e) { e.printStackTrace(); } } 

Надеюсь, это поможет вам.

Готово