当前位置: 首页 > 知识库问答 >
问题:

在Android上,将值从对话框返回到活动的健壮方法?

谭献
2023-03-14
public class MyDialogFragment extends DialogFragment {

    public interface MyDialogFragmentListener {
        public void onReturnValue(String foo);
    }

    public void init(boolean someValue)
    {
        sSomeValue = someValue;
        listeners = new ArrayList<MyDialogFragmentListener>();
    }
    static boolean sSomeValue;
    private static ArrayList<MyDialogFragmentListener> listeners;

    public void addMyDialogFragmentListener(MyDialogFragmentListener l)
    {
        listeners.add(l);
    }

    public void removeMyDialogFragmentListener(MyDialogFragmentListener l)
    {
        listeners.remove(l);
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(R.string.title)
           .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
               @Override
               public void onClick(DialogInterface dialog, int id) {
                   for (MyDialogFragmentListener listener : listeners) {
                       listener.onReturnValue("some value");
                   }
               }
           })
           .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   // User cancelled the dialog
                   // Nothing to do but exit
               }
           });
        if (sSomeValue) {
            builder.setMessage(R.string.some_value_message);
        } else {
            builder.setMessage(R.string.not_some_value_message);
        }
        // Create the AlertDialog object and return it
        return builder.create();
    }
}

问题是:当打开对话框时旋转设备并改变方向时,ActivityMyDialogFragment对象都将重新创建。为了确保输入值不会搞砸,我将初始化值设置为static。这对我来说感觉很讨厌,但因为一次只会有一个这样的对话框,我对此很满意。问题出在返回值上。原始侦听器将被调用。这很好,因为对象仍然存在,但是如果需要更新活动上的UI(确实存在),它将不会得到更新,因为新的活动实例现在正在控制UI。

我正在考虑的一个解决方案是将dialog类中的getActivity()强制转换为我的Activity,并强制对话框本身添加监听器,而不是让调用的Activity来执行。但这感觉就像黑客滚雪球一样。

优雅地处理这个问题的最佳实践是什么?

共有1个答案

丁嘉庆
2023-03-14

您在正确的轨道上,我遵循Android开发人员-使用DialogFragments文章推荐的方法。

创建DialogFragment并定义活动将实现的接口,就像上面所做的那样:

public interface MyDialogFragmentListener {
    public void onReturnValue(String foo);
}

然后在DialogFragment中,当您希望将结果返回到活动时,您将活动强制转换到接口:

@Override
public void onClick(DialogInterface dialog, int id) {
    MyDialogFragmentListener activity = (MyDialogFragmentListener) getActivity();
    activity.onReturnValue("some value");
}
public class MyActivity implements MyDialogFragmentListener {
    ...
    @Override
    public void onReturnValue(String foo) {
        Log.i("onReturnValue", "Got value " + foo + " back from Dialog!");
    }
}
 类似资料:
  • 访客详细信息 我在访问者活动中有一个对话框。当我点击图标,它将重定向到相机活动。然后点击Camera Activity中的Confirm按钮,将意图发送回前一个活动,即访客活动。问题是我应该如何将Camera活动的意图结果传递回Visitor活动中的对话框。意图数据应该放在Pass No Edit文本中。我使用的是材料对话框,没有任何附加到该对话框的片段。这一切都放在访客活动中。谁能帮帮我吗?谢谢

  • 如何将数据从活动传递到对话框? 有关更多详细信息,请参阅下图:

  • 目标: 将应用程序脚本函数中的数据返回到自定义电子表格HTML表单中。 问题: 脚本返回“未定义” 应用程序脚本: 电子表格超文本标记语言对话中的脚本:

  • Unix 至少设立了三层内部边界来防范恶意用户或有缺陷的程序。一层是内存管理:Unix 用硬件自身的内存管理单元(MMU)来保证各自的进程不会侵入到其它进程的内存地址空间。第二层是为多用户设置的真正权限组——普通用户(非 root用户)的进程未经允许,就不能更改或者读取其他用户的文件。第三层是把涉及关键安全性的功能限制在尽可能小的可信代码块上。在 Unix 中,即使是 shell(系统命令解释器)

  • 本文向大家介绍js获取会话框prompt的返回值的方法,包括了js获取会话框prompt的返回值的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js获取会话框prompt的返回值的方法。分享给大家供大家参考。具体分析如下: 获取会话框prompt的返回值,见例子: 注意: prompt返回数据类型是字符串。 alert():无返回值; confirm():返回true 或 false

  • 我有第一活动,它通过意图调用第二活动 在SecondActivity完成后,我希望SecondActivity向FirstActivity发送一些变量。然后调用finsih(),它将返回到第一个活动。如何使SecondActivity发送变量并在FirstActivity中获得结果?