Android에서 컨텍스트 메뉴 아이콘을 추가하십시오
-
12-09-2019 - |
문제
ContextMenu가있는 ListView가 있지만 ContextMenu를 위해 Seticon이 작동하지 않는 것처럼 보입니다.
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 메뉴를 사용하는 아이콘.
나는 이런 식으로 그것을했다 :
참조 스크린 샷 :
메뉴:
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();
}
}
이것이 당신에게 확실히 도움이되기를 바랍니다.
완료
Android API는 컨텍스트 메뉴에서 아이콘을 허용하지 않지만 Android가 사용하는 많은 장소를 볼 수 있습니다. 홈 화면을 긴 누르면 좋은 예입니다.
나는 시간을내어 런처와 anycut 소스를 파헤쳐 서 Google이 자신의 커스텀 레이아웃과 함께베이스 레이드를 확장하는 자체 사용자 정의 클래스를 사용하고 있음을 발견했습니다.
나는 그들의 수업과 레이아웃을 거의 정확하게 복사하여 내 앱에서 사용하여 달성 할 수있었습니다. 검색하려면 클래스를 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" />