What I want to achieve:
I have a custom ListView adapter. To each Listitem I want to add a popup menu, pretty similar to the ListView in the current Google Play appl
I finally found the solution to my problem, eventhough I have no explanation why this solution works.
With the following import I always had the error:
import android.support.v7.widget.PopupMenu;
It works fine with the following import:
import android.widget.PopupMenu;
I tested the code provided by Ric (Thanks for the great help!) and my own. Both are working now. Maybe someone has an explanation why the import matters in this case.
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:
Don't forgot to import this....
import android.support.v7.widget.PopupMenu;
import android.view.MenuItem;
I've just had the same issue when I modified the theme parent style: from
<style name="MainAppTheme" parent="@style/Theme.AppCompat.Light">
to
<style name="MainAppTheme" parent="@style/Theme.Base.AppCompat.Light">
Maybe your app uses the Theme.Base style, which does not define the required 6th parameter used by PopupMenu. From SO question How to use ActionBarActivity with Theme.Material, Theme.AppCompat extends Theme.Base.AppCompat
First create a button
in your custom-item-listview.xml and then add the code below:
Button
:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_text"
android:id="@+id/button1"
... />
class:
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;
}
use this as(activity context)not application context or context
PopupMenu popup = new PopupMenu(this, v);
Rick's code of lines works perfect as long as you import the following:
import android.widget.PopupMenu;
Not the one below:
import android.support.v7.widget.PopupMenu;