Android - Создание PopupMenu при нажатии кнопки ActionBar
Я пытаюсь заставить PopupMenu появляться после нажатия кнопки на панели действий.
У меня есть кнопки в файле - action.xml
в 'menu
папка.
Он содержит кнопки для панели действий.
<item
android:id="@+id/overflow"
android:icon="@drawable/ic_action_overflow"
android:orderInCategory="2"
android:menuCategory="container"
android:title="Overflow Button"
android:showAsAction="ifRoom|withText"
android:onClick="**showPopup**"
/>
<item
android:id="@+id/add"
android:icon="@drawable/add"
android:title="Add Button"
android:orderInCategory="100"
android:showAsAction="ifRoom|withText"
android:onClick="**showPopup**"
/>
Как только кнопка нажата, я хочу иметь PopupMenu
быть показано. showPopup
Метод находится в FragmentActivity
учебный класс:
public void showPopup(MenuItem v) {
PopupMenu popup = new PopupMenu(this, this.getCurrentFocus());
popup.inflate(R.layout.pop);
popup.show();
}
pop.xml
файл хранится в папке макета (и содержит вид всплывающего меню)
К сожалению, это дает мне RuntimeException java.lang.reflect.InvocationTargetException
,
Есть идеи?
Помощь будет принята с благодарностью.
3 ответа
Прежде всего, это довольно просто.
Вы должны добавить этот атрибут в ваш элемент actionBar.
android:onClick="openPopup"
openPopup
ваш метод всплывающих окон.
Тогда в вашем MainActivity
который, кстати, должен продлить ActionBarActivity
Вы должны добавить свой метод, который будет вызываться onClick
,
public void openPopup(MenuItem item){
Point p;
p.x = 0;
p.y = 0;
showPopup(MainActivity.this, p);
Toast.makeText(this, "Popup Should Open", Toast.LENGTH_LONG).show();
}
И конечно showPopup
метод.
private void showPopup(final Activity context, Point p) {
// Inflate the popup_layout.xml
LinearLayout viewGroup = (LinearLayout) context.findViewById(R.id.popup);
LayoutInflater layoutInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = layoutInflater.inflate(R.layout.popup_layout, viewGroup);
// Creating the PopupWindow
final PopupWindow popup = new PopupWindow(context);
popup.setContentView(layout);
popup.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
popup.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
popup.setFocusable(true);
popupWidth = popup.getWidth();
// Clear the default translucent background
popup.setBackgroundDrawable(new BitmapDrawable(this.getResources()));
// Displaying the popup at the specified location.
popup.showAtLocation(layout, Gravity.NO_GRAVITY, p.x, p.y);
// Getting a reference to Close button, and close the popup when clicked.
Button close = (Button) layout.findViewById(R.id.close);
close.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
popup.dismiss();
}
});
}
Вот и все.
Я хотел бы поделиться тем, как я это делаю. Допустим, у нас есть кнопка (или любое другое представление clickakbale, где бы она ни находилась) с идентификатором "btn", и мы хотим прикрепить popupMenu к ее нажатию. Поместите меню, которое вы хотите отобразить, в папку меню в следующем xml скажите "menu1.xml".
OnClick кнопки определяется следующим образом:
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showPopupMenu(v);
}
});
showPopupMenu () определяется следующим образом:
private void showPopupMenu(View view) {
// inflate menu and attach it to a view onClick of which you want to display menu
PopupMenu popup = new PopupMenu(mContext, view);
MenuInflater inflater = popup.getMenuInflater();
//inflate menu items to popup menu
inflater.inflate(R.menu.menu1, popup.getMenu());
//assign a cutom onClick Listener to it.
popup.setOnMenuItemClickListener(new MyMenuItemClickListener());
//Show Popup.
popup.show();
}
Полный пост можно найти здесь: http://revisitingandroid.blogspot.in/2017/01/how-to-display-popup-menu-on-any-view.html
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="20sp"
android:textColor="#000000"
android:layout_margin="20dip"
android:text="Popup Menu Example" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Touch here to see the menu."
android:layout_margin="20dip"
android:layout_gravity="center"
android:textColor="#0000ff"
android:id="@+id/anchor"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="20dip"
android:layout_gravity="center"
android:textSize="40sp"
android:textColor="#808080"
android:id="@+id/selection"/>
</LinearLayout>
package com.authorwjf.popmenu;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.PopupMenu;
import android.widget.PopupMenu.OnMenuItemClickListener;
import android.widget.TextView;
import android.app.Activity;
public class Main extends Activity implements OnClickListener, OnMenuItemClickListener
{
private PopupMenu popupMenu;
private final static int ONE = 1;
private final static int TWO = 2;
private final static int THREE = 3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
popupMenu = new PopupMenu(this, findViewById(R.id.anchor));
popupMenu.getMenu().add(Menu.NONE, ONE, Menu.NONE, "Item 1");
popupMenu.getMenu().add(Menu.NONE, TWO, Menu.NONE, "Item 2");
popupMenu.getMenu().add(Menu.NONE, THREE, Menu.NONE, "Item 3");
popupMenu.setOnMenuItemClickListener(this);
findViewById(R.id.anchor).setOnClickListener(this);
}
}
@Override
public void onClick(View v) {
popupMenu.show();
}
@Override
public boolean onMenuItemClick(MenuItem item) {
TextView tv = (TextView) findViewById(R.id.selection);
switch (item.getItemId()) {
case ONE:
tv.setText("ONE");
break;
case TWO:
tv.setText("TWO");
break;
case THREE:
tv.setText("THREE");
break;
}
return false;
}