好的,这并不是对问题的解答。可以将其视为替代方案,以取代PopupMenu
以实现所要求的内容。
无PopupMenu
在查阅了PopupMenu
及其源代码的文档后,我终于明白PopupMenu
不是一个允许自定义的实现(对于评论中的误解,向PO道歉)。
替代方案
ListPopupWindow
作为一种替代方案,具有以下优点:
- 它与
PopupMenu
共享父级-ListView
。
- 它非常灵活,允许定义自定义布局的自定义适配器。
- 它还允许像
PopupMenu
一样在运行时创建,并允许将资源ID附加到项目视图上。
实现
首先,让我们为弹出项定义一个自定义布局(popup_item_view.xml
)。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/popup_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
接下来,定义一个自定义的
Adapter
类来操作布局。
package com.example.popupmenu;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class PopupAdapter extends BaseAdapter {
public static class Item {
public final int id;
public final String title;
public Item(int id, @NonNull String title) {
this.id = id;
this.title = title;
}
}
private List<Item> mItemList = new ArrayList<>();
public PopupAdapter(@NonNull Item[] items) {
mItemList.addAll(Arrays.asList(items));
}
@Override
public int getCount() {
return mItemList.size();
}
@Override
public Item getItem(int position) {
return mItemList.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final Item item = getItem(position);
if (convertView == null) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
convertView = inflater.inflate(R.layout.popup_item_view, parent, false);
}
convertView.setId(item.id);
TextView titleView = (TextView) convertView.findViewById(R.id.popup_text);
titleView.setText(item.title);
return convertView;
}
}
最后,将
PopupMenu
代码替换为以下内容。
PopupAdapter.Item[] items = {
new PopupAdapter.Item(R.id.popup_item_1, "item 1"),
new PopupAdapter.Item(R.id.popup_item_2, "item 2")
};
ListPopupWindow popup = new ListPopupWindow(MainActivity.this);
popup.setAnchorView(view);
popup.setAdapter(new PopupAdapter(items));
popup.setModal(true);
popup.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
popup.show();
希望这有所帮助。
R.id.myMenuItem
设置为你的MenuItem
的id。因此,在你的OnMenuItemClickListener()
监听器中,当你调用item.getItemId()
时,你将能够获取与R.id.myMenuItem
等效的id。这难道不是你想要的吗? - LightYearsBehindMenu.add(0, x, 0, 0)
的第二个参数是用于项目ID的。如果需要,您必须强制循环遍历菜单项视图并将项目ID设置为其视图ID。另一种选择是考虑使用索引ID来实现您想要做的事情。 - LightYearsBehind