【问题标题】:How do I pass arguments to a Dialog box in Android?如何将参数传递给 Android 中的对话框?
【发布时间】:2015-05-04 17:46:28
【问题描述】:

Google 决定制作一个没有模式对话框的单线程用户界面。我敢肯定,你们中的大多数人都发现在您的函数返回之前没有任何更新,因为一切都是事件驱动的单个线程(根据“法律”)。

如果我有一个简单的警告框,例如“你确定吗?” (仅示例),使用是和否按钮,然后我必须为按钮分配回调,而不是具有简单的返回值(无模式对话框)。很好,即使返回值会极大地简化我的问题(参数对调用者来说是本地的),尽管这会阻止调用活动响应(模态)。

现在想象一下,如果我有一个项目列表并且用户尝试执行某些操作。对话框现在必须有某种方式将我想要执行操作的项目传递给按钮的回调,但我似乎无法在 API 中找到任何机制来将其传递给 onclick 处理程序。使用非局部变量是一种变通方法,但很麻烦。

如何干净利落地传递这些信息?有没有人有某种黑客可以以某种方式“伪造”一个可以返回值的模式对话框(我不知道如何)。

【问题讨论】:

  • 没有。在这个特定的实例中,我有一个由 SQL 适配器填充的 ListView。列表项代表一副抽认卡。滑动手势可以删除牌组。代码首先检查以确保卡片组中没有卡片,并警告用户将要删除多少张卡片。我需要将要从对话框的调用者中删除的牌组传播到按下 OK 按钮时将运行的回调中。还有其他情况,但这是一个例子。
  • 教程中表示的内容相同,您必须根据用户与对话框列表的交互来维护列表项,然后按下 OK 按钮,您必须将该局部变量传递给特定函数以进行进一步操作。我想你可以理解这一点。

标签: android


【解决方案1】:

创建一个自定义对话框,扩展默认的 android 对话框并添加您需要的信息并传递给构造函数。 在此处查看更多信息:How can I pass values between a Dialog and an Activity?

【讨论】:

  • 我将其标记为答案,因为它是我开始使用的答案(甚至在您回复之前)。为了能够转发参数而必须扩展对话框似乎仍然有些笨拙,但我认为这是在不依赖外部库的情况下可以获得的最佳效果。
【解决方案2】:

我不确定您到底想要实现什么。不确定您的问题是在活动与对话框之间的通信还是对话框与活动之间的通信,或两者兼而有之。

不管怎样,我对 Android 有一些经验,我真的建议你使用其中一个库来实现活动、片段甚至对话框(DialogFragments)之间的通信。一开始可能有点难以理解如何工作,但结果是更快、更清晰的代码,当然为您提供了更大的灵活性。

看看:

https://github.com/beworker/tinybus --> 用得少但很棒

https://github.com/greenrobot/EventBus --> 更多的扩展和用于社区

希望能帮到你!

【讨论】:

    【解决方案3】:

    在这种情况下,我在 values 文件夹中的 strings.xml 中创建了一个新的字符串数组条目,如下所示:

    <string-array name="array">
    <item>1</item>
    <item>2</item>
    </string-array>
    

    然后像这样使用对话框生成器创建一个对话框:

    AlertDialog.Builder dialog=new AlertDialog.Builder(this);
    LayoutInflater infl=this.getLayoutInflater();
    Resources res=getResources();
    
    dialog.setSingleChoiceItems(R.array.alphabets, 0,new OnClickListener() {
    
        public void onClick(DialogInterface dialog, int which) {
            mReturnVariable=which;          
        }
    });
    dialog.create().show();
    

    所以 mReturnVariable 包含用户选择的项目索引。希望解决问题

    【讨论】:

    • 这就是要走的路。一个小注释 - 这不是自定义对话框,它是标准的 AlertDialog。
    • 不能解决问题。我不需要传递常量。恕我直言,这基本上只是使用具有足够的装饰和复杂性的全局变量,因此它看起来不像全局变量,也不方便。
    • @EvanLanglois 如果您真的关心返回变量,那么您可以创建一个类方法并将所选项目的索引发送到该方法,在该方法中您可以只返回变量。我不知道您实际上想如何访问此变量,因此使用上述方法。
    • 查看列表视图示例。在其他 API 中,您可以使用模态警报来返回按下了哪个按钮(例如是或否)并且警报返回到调用函数,因此您无需通过箍将局部变量放入按钮回调。你不能在 Android 中这样做,因为你不能让一个函数阻塞。
    • 好的,你想使用它的场景,如果我发现你指定的任何黑客会回来
    【解决方案4】:

    我使用 Android 最新版本中的视图绑定将所需的参数传递给警报对话框。

    private ConnectDialogBinding connectDialogBinding;
    private String chargerID;
    
    private void connectDialog() {
        // Create the object of
        // AlertDialog Builder class
        AlertDialog.Builder builder = new AlertDialog.Builder(ConnectActivity.this);
        connectDialogBinding = ConnectDialogBinding.inflate(getLayoutInflater());
        builder.setView(connectDialogBinding.getRoot());
        connectDialogBinding.txtID.setText(chargerID);
        builder.setCancelable(false);
    
        // Create the Alert dialog
        AlertDialog alertDialog = builder.create();
    
        // Show the Alert Dialog box
        alertDialog.show();
    
        connectDialogBinding.cancelBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                alertDialog.cancel();
            }
        });
    }
    

    enter image description here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-06
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      相关资源
      最近更新 更多