2013-04-05 30 views
1

我试图在单击操作栏中的按钮后出现PopupMenu。Android - 在单击ActionBar按钮时创建PopupMenu

我在menu文件夹中找到文件中的按钮 - action.xml

这包含ActionBar的按钮。

<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

任何想法?

帮助将不胜感激。

回答

-1
<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; 
} 
+0

谢谢,但我首先在FragmentActivity中制作一个ActionBar。然后,我想要一个PopupMenu出现一旦按钮在ActionBar被选中。 – ARampal 2013-04-05 12:57:25

1

首先,这很容易。

您必须将此属性添加到您的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(); 
    } 
    }); 
} 

就是这样。

0

我想分享一下我的工作方式。让我们说我们有一个Button(或者任何位于任何地方的clicakbale视图),id为“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