Popup menu in custom ListView

What I want to achieve:

I have a custom ListView adapter. For each Listitem, I want to add a popup menu similar to the ListView in the current Google Play application.

Screenshot of Google Play items

This is what I tried: Most of my code comes from these sample Android \ android-19 \ ui \ ActionBarCompat-ListPopupMenu samples

CustomFragmentPageAdapter.java

// create new fragment mCustomFragment = CustomFragment.newInstance(position); 

CustomFragment.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(); } 

CustomArrayAdapter

 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> 

Logcat Output :

 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) ... 

The error is being called in popup.show () in my CustomFragment.

This mistake is clearly driving me crazy, and ANY help in solving this problem is highly appreciated!

+7
java android android-listview listview runtimeexception android-adapter
Jan 05 '15 at 15:41
source share
7 answers

I finally found a solution to my problem, although I have no explanation why this solution works.

The following import, I always had an error:

 import android.support.v7.widget.PopupMenu; 

It works great with the following import:

 import android.widget.PopupMenu; 

I checked the code provided by Rick (thanks for the great help!) And my own. Both are working now. Maybe someone has an explanation of why import matters in this case.

+36
Jan 07 '15 at 18:59
source share
โ€” -

First create a button in your custom-item-listview.xml and then add the following code:

button :

 <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button_text" android:id="@+id/button1" ... /> 

Grade:

 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(); 

EDIT: This works well for me:

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; } 
+4
Jan 05 '15 at 16:49
source share

use this as (action context), not application context or context

  PopupMenu popup = new PopupMenu(this, v); 
+3
Jun 14 '16 at 10:17
source share
  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(); } 

Note:
Do not forget to import it ....

 import android.support.v7.widget.PopupMenu; import android.view.MenuItem; 
+2
Sep 29 '16 at 10:01
source share

I had the same problem when I changed the parent theme style: from

 <style name="MainAppTheme" parent="@style/Theme.AppCompat.Light"> 

to

 <style name="MainAppTheme" parent="@style/Theme.Base.AppCompat.Light"> 

Perhaps your application uses the Theme.Base style, which does not determine the required 6th parameter used by PopupMenu. From a SO question How to use ActionBarActivity with Theme.Material , Theme.AppCompat extends Theme.Base.AppCompat

+1
Jan 07 '15 at 11:02
source share

Rick's line code works perfect while you import the following:

 import android.widget.PopupMenu; 

Not less:

 import android.support.v7.widget.PopupMenu; 
+1
Mar 09 '17 at 15:22
source share

I fixed a similar error by simply passing static activity as a parameter. For example:

 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(); } }); } 

Additionally, the problem may be as follows: Issue 152141

Hope this helps you by respecting import android.support.v7.widget.PopupMenu .

Sincerely.

0
Jun 09 '16 at 10:23
source share



All Articles