ContextMenuのあるリストビューがありますが、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);
}
コンテキストメニュー アイコンをサポートしていません。
注:コンテキストメニュー項目は、アイコンまたはショートカットキーをサポートしていません。
私はこの方法でそれをしました:
参照スクリーンショット:
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>
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();
}
}
これが確実に役立つことを願っています。
完了
このライブラリを使用すると、標準のXMLメニューを使用してアイコン付きのコンテキストメニュー(AlertDialog
として実装)を使用できます。
Android APIはコンテキストメニューのアイコンを許可していませんが、Androidがアイコンを使用している場所をたくさん見ることができます。ホーム画面を長押しすることは、良い例の1つです。 。
時間をかけてLauncherとAnyCutのソースを調べたところ、Googleが独自のカスタムレイアウトとともにBaseAdapterを拡張する独自のカスタムクラスを使用していることがわかりました。
私は彼らのクラスとレイアウトをほぼ正確にコピーし、それを自分のアプリで使用して達成することができました。検索する場合のクラスは、AddAdapter.Javaと呼ばれます。
楽しい!
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" />
これをチェックしてください...
@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;
}