繁体   English   中英

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

[英]Create similar Dialog when clicking different buttons

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

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

  1. 一个值,指示最初单击了四个按钮中的哪个
  2. 指示选择列表中5个项目中的哪个项目的值

这就是我想要实现的。 我认为这是一个很常见的情况,但是经过一段时间的搜索后我找不到任何解决方案。

我正在尝试遵循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工厂,并为工厂的不同输入返回不同的匿名DialogFragment,但是编译器抱怨说“碎片应该是静态的”,这显然是因为生命周期管理问题。 当我四处搜索时,我遇到了一些使用onCreateDialog示例,我认为它们可以解决我的问题,但是显然不推荐使用此方法...

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

你可以用相反的逻辑来做到

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

这是我的静态方法

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
                                    }
                                });

这是一个示例,但是通过这种方式,您只需通过从每个按钮调用static方法就可以执行所需的任何操作。

如果您想保持逻辑:

这样,我将您的“将按钮传递给适配器”以及将结果传递给按​​钮。

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

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM