单击不同按钮时创建类似的对话框

时间:2017-09-12 14:17:05

标签: java android android-fragments android-dialog

背景: 我在活动中有4个按钮。

我想要实现的目标: 单击每个按钮将显示完全相同的Dialog,其中包含5个项目的列表。单击列表中的项目将调用一个方法(在活动中定义),该方法包含2个参数:

  1. 表示最初点击4个按钮中的哪个按钮的值
  2. 表示选择列表中5个项目中的哪个项目的值
  3. 这就是我想要实现的目标。我认为这是一种非常常见的情况,但在搜索一段时间后我找不到任何解决方案。

    我正在尝试关注Android开发人员API指南: https://developer.android.com/guide/topics/ui/dialogs.html

    如果我遵循指南,我将会有这样的事情:

    public class MyDialogFragment extends DialogFragment {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(R.string.dialog_title)
               .setItems(R.array.dialog_array, new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int which) {
                   // something
               }
        });
        return builder.create();
    }
    }
    

    问题是我无法找到一种方法来传递一个值,该值指示单击了哪个按钮进入onClick方法。当然,一种方法是为每个按钮创建4个不同的DialogFragment,但我相信这应该比这更清洁。我的第一个想法是创建一个DialogFragment Factory并为工厂的不同输入返回不同的匿名DialogFragment,但编译器抱怨说“片段应该是静态的”,显然是因为一些生命周期管理问题。当我在搜索时,我会遇到一些使用onCreateDialog的示例,我认为这可以解决我的问题,但显然这种方法已被弃用...

    我现在不知道(除了创建4个不同的DialogFragment)。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

您可以使用相反的逻辑

我有类似的东西,我通过使用静态方法解决了这个问题,该方法创建了一个对话框和一个用于检索结果的界面:

这是我的静态方法

public static void showGenericItemSelectorDialog(Activity activity, ArrayList<MyParams> items, final IReturnMyListItemToParent iReturnMyListItemToParent) {

    final AlertDialog.Builder builder = new AlertDialog.Builder(activity);
    builder.setCancelable(true);

    LayoutInflater inflater = activity.getLayoutInflater();
    View dialogView = inflater.inflate(R.layout.dialog_searchable_list, null); //or init it howerer you want, I have a custom layout
    builder.setView(dialogView);

    final Dialog dialog = builder.create();
    /// omitted not useful code

    Button myBtn= (Button) dialogView.findViewById(R.id.myBtn);
    myBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //check which item has been clicked
            iReturnMyListItemToParent.onResult(myClickedItem);
            dialog.dismiss();
        }
    });
    dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialogInterface) {
            iReturnMyListItemToParent.onResult(null);
            dialog.dismiss();
        }
    });

    dialog.show();
}

这是我的界面

public interface IReturnMyListItemToParent {
    void onResult(MyItem item);
}

这就是我所说的:

RuntimeHelper.showGenericItemSelectorDialog(getActivity(), myParams, new IReturnMyListItemToParent() {
                                    @Override
                                    public void onResult(MyItem result) {
                                      //do stuff with that result item clicked
                                    }
                                });

这是一个例子,但这样你就可以通过从每个按钮调用静态方法来做任何你想做的事情。

如果你想保留你的逻辑:

这样我就将你的&#34;传递按钮更改为适配器&#34;将结果传递给按​​钮。

如果要将按钮传递给方法,只需在构造函数中添加一个指向单击按钮的参数:)

希望这有帮助