1

我正在开发一个应用程序,该应用程序的一个活动中有一个“过滤器按钮”,每次单击它时都会出现一个弹出菜单。特别是这个弹出菜单并不总是相同的,它可能会根据用户在上一个活动中所做的事情而有所不同。

到目前为止,我已经编写了允许应用程序在不同情况下显示不同弹出菜单的部分(效果很好)。现在,我一直在尝试为任何这些情况添加单独的侦听器。
这是我的代码和一些解释:

// method called when the user clicks on "filter_button"
// displays a different popupmenu depending on the value of
// filterVariable defined in a previous activity 

private void showPopupMenu(View v) {

    Bundle bundle = getIntent().getExtras();
    int filterVariable = bundle.getInt("filterVariable");
    switch (filterVariable) {

    // Case 1: inflates Res/Menu/popupmenu
    case 1:
        PopupMenu myPopupMenu1 = new PopupMenu(ResultListViewActivity.this, v);
        myPopupMenu1.getMenuInflater().inflate(R.menu.popupmenu,
                myPopupMenu1.getMenu());
        myPopupMenu1.setOnMenuItemClickListener(listener_1);
        myPopupMenu1.show();
        break;

    // Case 2: inflates Res/Menu/popumenu2
    case 2:
        PopupMenu myPopupMenu2 = new PopupMenu(ResultListViewActivity.this, v);
        myPopupMenu2.getMenuInflater().inflate(R.menu.popupmenu2,
                myPopupMenu2.getMenu());
        myPopupMenu2.setOnMenuItemClickListener(listener_2);
        myPopupMenu2.show();
        break;

// and so on ...
    }
}  

我现在要做的是为每个侦听器分配不同的事件。这就是为什么我定义了 listener_1、listener_2 等(现在他们用这个注释“listener_1 无法解析为变量”下划线 - 我告诉你这个是因为我对“变量”有点不安,不是监听器应该不是变量吗?我们可以初始化一个监听器吗?)但我不知道如何将它集成到这种代码中,这是为项目点击分配方法的传统示例(在 Android Developer 上找到) :

@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
    case R.id.archive:
        // ....
        return true;
    case R.id.delete:
        // ....
        return true;

} }  

谢谢你的时间!

4

2 回答 2

4

我实际上找到了一种方法来做到这一点,以防有一天它可以帮助某人,我发布了我的代码。它完美地工作,并允许为一个初始按钮分配不同的弹出菜单和不同的事件给侦听器
在我的例子中,case11 对应于我的第一个过滤模式(例如餐厅,每个项目都是不同种类的餐厅),cass12 对应于另一个过滤模式(例如夜生活,项目有不同的活动,等等!)。

private void showPopupMenu(View v) {

Bundle bundle = getIntent().getExtras();
int filterVariable = bundle.getInt("filterVariable");

switch (filterVariable) {

case 11:
    PopupMenu myPopupMenu11 = new PopupMenu(
            ResultListViewActivity.this, v);
    myPopupMenu11.getMenuInflater().inflate(R.menu.popup_fastfood,
            myPopupMenu11.getMenu());
    myPopupMenu11
            .setOnMenuItemClickListener(new OnMenuItemClickListener() {

                private String filterInterval;
                private String filterTitle;

                @Override
                public boolean onMenuItemClick(
                        android.view.MenuItem item) {
                    switch (item.getItemId()) {
                    case R.id.item11a:
                        // define your events for item11a
                        return true;

                    case R.id.item11b:
                        //....
                        return true;

                    case R.id.item11c:
                        // ...
                        return true;

                    }
                    return false;
                }
            });

    myPopupMenu11.show();
    break;
case 12:
    PopupMenu myPopupMenu12 = new PopupMenu(
            ResultListViewActivity.this, v);
    myPopupMenu12.getMenuInflater().inflate(R.menu.popup_restaurants,
            myPopupMenu12.getMenu());
    myPopupMenu12
            .setOnMenuItemClickListener(new OnMenuItemClickListener() {

                @Override
                public boolean onMenuItemClick(
                        android.view.MenuItem item) {
                    switch (item.getItemId()) {
                    case R.id.item12a:
                        // ....
                        return true;

                    case R.id.item12b:
                        // ....
                        return true;

                    }
                    return false;
                }
            });

    myPopupMenu12.show();
    break;
}

}
于 2013-03-21T06:09:22.623 回答
1

从先前的活动中添加额外内容并在弹出窗口显示的活动中接收它怎么样,您可以创建一个全局最终变量来确定将发送哪个弹出窗口,所以基本上它会像这样

BaseID 类

public class BaseID {
    public static final int POP_UP_1 = 1;
    public static final int POP_UP_2 = 2;
    public static final int POP_UP_3 = 3;
    public static final int POP_UP_4 = 4;
}

然后在之前的活动中,在你开始新活动之前,你应该多放一个

Intent i = new Intent(previousactivity, popup.class);
switch(condition) {
   case condition1:
   i.putExtra("popUpType",BaseID.POP_UP_1);
   break;
   case condition2:
   i.putExtra("popUpType",BaseID.POP_UP_2);
   break;
   case condition3:
   i.putExtra("popUpType",BaseID.POP_UP_3);
   break;
   case condition4:
   i.putExtra("popUpType",BaseID.POP_UP_4);
   break;
}
startActivity(i);

然后在弹出活动中,您可以使用 getIntExtra() 获得额外的

private int popUpType;

.
.
.

popUpType= getIntent().getIntExtra("popUpType", 0);

然后你可以创建一个监听器并切换 popUpType

private View.onClickListener mOnClickFilter = new View.OnClickListener() {
  @Override
    public void onClick(View v) {
    switch(popUpType) {
         case BaseID.POP_UP_1:
         //show popup 1 here
         break;
         case BaseID.POP_UP_2:
         //show popup 1 here
         break;
         case BaseID.POP_UP_3:
         //show popup 1 here
         break;
         case BaseID.POP_UP_4:
         //show popup 1 here
         break;
    }
   } 
};

然后您可以将侦听器添加到 oncreate 中弹出活动中的按钮

mButtonFilter.setOnClickListener(mOnClickFilter);

对于在弹出窗口中设置不同的操作,我认为您可以首先使用回调(java接口)定义接口

回调弹出按钮接口

public interface callbackPopUpButton {
    public void onClick();
}

然后你可以在你想像这样显示弹出的活动中实现它

private class cbPopUpButton implements callbackPopUpButton {
     @Override
     public void onClick() {
          switch(popUpType) {
             case BaseID.POP_UP_1:
             //action of button in pop up 1
             break;
             case BaseID.POP_UP_2:
             //action of button in pop up 2
             break;
             case BaseID.POP_UP_3:
             //action of button in pop up 3
             break;
             case BaseID.POP_UP_4:
             //action of button in pop up 4
             break;
         }
     }
}

或者如果您想根据视图进行切换,您可以在 onClick() 中添加 View v

声明类后,您可以创建一个新对象并将其传递给弹出菜单,然后像这样调用 onclick

myPopupMenu1.setCallback(new cbPopUpButton ); //please create new function to pass the callback

函数和设置回调应该是这样的(在 myPopupMenu1 类中)

private callbackPopUpButton cbPopUpButton

public static void setCallback(callbackPopUpButton cbPopUpButton) {
      this.cbPopUpButton = cbPopUpButton;
}

然后您可以像这样在按钮的 onclick 侦听器中添加操作

buttonPopUp.setOnClickListener = new View.onClickListener() {
    @Override
    public void onClick(View v) {
       cbPopUpButton.onClick();
    }
};

此代码将调用 cbPopUpButton 类中的 onClick 函数

就这样!

希望您能理解我的回答,如果您对我的回答有任何疑问,请随时在评论中提问:)

于 2013-03-20T07:50:44.983 回答