1

クリックするたびにポップアップメニューが表示される「フィルターボタン」がアクティビティの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 などを定義した理由です。リスナーは変数以外のものであるはずですか?リスナーを初期化できますか?)しかし、これをこの種のコードに統合する方法がわかりません。これは、アイテムのクリックにメソッドを割り当てる従来の例です (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

私は実際にこれを行う方法を見つけました。いつか誰かを助けることができる場合に備えて、コードを公開します。これは完全に機能し、1 つの初期ボタンのみのリスナーにさまざまなポップアップ メニューとさまざまなイベントを割り当てることができます。
私の場合、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インターフェイス)を使用してインターフェイスを定義できると思います

callbackPopUpButtonインターフェイス

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()にビュー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 に答える