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;
}
Другие вопросы по тегам