[英]Popup Menu in custom ListView
我想要達到的目標:
我有一個自定義 ListView 適配器。 我想為每個 Listitem 添加一個彈出菜單,與當前 Google Play 應用程序中的 ListView 非常相似。
這是我嘗試過的:我的大部分代碼來自這個 Android 示例samples\\android-19\\ui\\ActionBarCompat-ListPopupMenu
CustomFragmentPageAdapter.java :
// create new fragment
mCustomFragment = CustomFragment.newInstance(position);
自定義片段.java
public class CustomFragment extends ListFragment implements View.OnClickListener{
...
@Override
public void onClick(final View v) {
v.post(new Runnable() {
@Override
public void run() {
showPopupMenu(v);
}
});
}
private void showPopupMenu(View view) {
PopupMenu popup = new PopupMenu(getActivity(), view);
popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu());
popup.show();
}
自定義陣列適配器:
public class CustomAdapter extends ArrayAdapter<WatchListPlayerItem> {
...
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final int pos = position;
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View rowView = inflater.inflate(R.layout.watch_list_row, parent, false);
View popupButton = rowView.findViewById(R.id.imgPopUp);
popupButton.setTag(getItem(position));
popupButton.setOnClickListener(mFragment);
return rowView;
}
}
popup_menu.xml :
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/install"
android:title="Install" />
<item
android:id="@+id/addtowishlist"
android:title="Add to wishlist" />
</menu>
日志輸出:
java.lang.RuntimeException: Failed to resolve attribute at index 6
at android.content.res.TypedArray.getLayoutDimension(TypedArray.java:603)
at android.view.ViewGroup$LayoutParams.setBaseAttributes(ViewGroup.java:6423)
at android.view.ViewGroup$MarginLayoutParams.<init>(ViewGroup.java:6591)
at android.widget.FrameLayout$LayoutParams.<init>(FrameLayout.java:735)
...
該錯誤在我的 CustomFragment 中的 popup.show() 處引發。
這個錯誤顯然讓我發瘋,非常感謝任何幫助解決這個問題!
我終於找到了我的問題的解決方案,盡管我沒有解釋為什么這個解決方案有效。
使用以下導入我總是有錯誤:
import android.support.v7.widget.PopupMenu;
它可以正常使用以下導入:
import android.widget.PopupMenu;
我測試了Ric提供的代碼(感謝您的幫助!)和我自己的代碼。 兩者現在都在運作。 也許某人有解釋為什么導入在這種情況下很重要。
首先在custom-item-listview.xml中創建一個button
,然后添加以下代碼:
Button
:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_text"
android:id="@+id/button1"
... />
類:
public class CustomAdapter extends ArrayAdapter<CustomItem> {
private static Activity context = null;
private final ArrayList<CustomItem> mItemsArrayList;
private CustomFragment mFragment;
public CustomAdapter(Activity context, ArrayList<CustomItem> itemsArrayList, CustomFragment fragment) {
super(context, R.layout.watch_list_row, itemsArrayList);
CustomAdapter.context = context;
this.mItemsArrayList = itemsArrayList;
this.mFragment = fragment;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final int pos = position;
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View rowView = inflater.inflate(R.layout.watch_list_row, parent, false);
final Button popUp_btn = (Button)rowView.findViewById(R.id.button1);
popUp_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final PopupMenu popup = new PopupMenu(context, popUp_btn);
popup.getMenuInflater().inflate(R.menu.context_menu, popup.getMenu());
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
int i = item.getItemId();
if (i == R.id.item1) {
//do something
return true;
}
else if (i == R.id.item2){
//do something
return true;
}
else if (i == R.id.item3) {
//do something
return true;
}
else {
return onMenuItemClick(item);
}
}
});
popup.show();
編輯:這適合我:
TAB1
public class TAB1 extends Fragment {
View view;
public TAB1() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.tab1, null);
ListView list = (ListView) view.findViewById(android.R.id.list);
CustomList adapter = new CustomList(getActivity());
adapter.addAll();
list.setAdapter(adapter);
return view;
}
CustomList
:
public class CustomList extends ArrayAdapter<YourArrayAdapter> {
private static Activity context = null;
public CustomList(Activity context) {
super(context, R.layout.custom_listview, web);
CustomList.context = context;
}
@Override
public View getView(final int position, View view, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
final View rowView = inflater.inflate(R.layout.custom_listview, null, true);
//your stuff here
final Button popUp_btn = (Button)rowView.findViewById(R.id.button1);
popUp_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final PopupMenu popup = new PopupMenu(context, popUp_btn);
popup.getMenuInflater().inflate(R.menu.context_menu, popup.getMenu());
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
int i = item.getItemId();
if (i == R.id.item1) {
//do something
return true;
}
else if (i == R.id.item2){
//do something
return true;
}
else if (i == R.id.item3) {
//do something
return true;
}
else {
return onMenuItemClick(item);
}
}
});
popup.show();
}
});
return rowView;
}
將此用作(活動上下文) 而非應用程序上下文或上下文
PopupMenu popup = new PopupMenu(this, v);
popup = (Button)findViewById(R.id.button);
popup.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
PopupMenu popup = new PopupMenu(MainActivity.this,view);
popup.getMenuInflater().inflate(R.menu.popup_menu,popup.getMenu());
popup.show();
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
int id = item.getItemId();
if(id==R.id.install){
show_toast("Install Clicked");
}else{
show_toast("WishList Clicked");
}
return true;
}
});
}
});
public void show_toast(String message){
Toast.makeText(this,message,Toast.LENGTH_SHORT).show();
}
注意:
別忘了導入這個....
import android.support.v7.widget.PopupMenu;
import android.view.MenuItem;
只要您導入以下內容,Rick的行代碼就可以完美運行:
import android.widget.PopupMenu;
不是下面那個:
import android.support.v7.widget.PopupMenu;
當我修改主題父樣式時,我遇到了同樣的問題:來自
<style name="MainAppTheme" parent="@style/Theme.AppCompat.Light">
至
<style name="MainAppTheme" parent="@style/Theme.Base.AppCompat.Light">
也許您的應用程序使用Theme.Base樣式,該樣式未定義PopupMenu使用的所需第6個參數。 從SO問題如何在Theme.Material中使用ActionBarActivity ,Theme.AppCompat擴展了Theme.Base.AppCompat
我通過將參數作為靜態活動傳遞來修復類似的錯誤。 例如:
static AppCompatActivity sActivity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sActivity = this;
yourLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PopupMenu popup = new PopupMenu(sActivity, v);
MenuInflater inflater = popup.getMenuInflater();
inflater.inflate(R.menu.my_popup_menu, popup.getMenu());
popup.show();
}
});
}
此外,您的問題可能是這個問題: 問題152141
希望它能幫到你,尊重android.support.v7.widget.PopupMenu
導入。
問候。
首先需要導入
導入 android.widget.PopupMenu;
你的它一定是這樣的
holder.dayDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PopupMenu popupMenu = new PopupMenu(context, holder.dayDate);
popupMenu.getMenu().add("Futa");
popupMenu.getMenu().add("Acha");
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getTitle().toString()) {
case "View" :
Toast.makeText(context, "Bidhaa imefutwa.", Toast.LENGTH_SHORT).show();
break;
case "Edit":
// popupMenu.dismiss();
break;
}
return false;
}
});
popupMenu.show();
}
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.