gpt4 book ai didi

android - 在 Android 上将值从 Dialog 传回 Activity 的可靠方法?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:21:52 25 4
gpt4 key购买 nike

这个问题已经出现好几次了,我已经阅读了所有的答案,但我还没有看到一个真正可靠的方法来处理这个问题。在我的解决方案中,我使用从调用 ActivityAlertDialog 的监听器,如下所示:

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

然后在调用 Activity 时,我正常实例化对象,通过 init 传入任何参数并设置我的监听器。

问题在于:当您在对话框打开的情况下旋转设备并更改方向时,ActivityMyDialogFragment 对象都会重新创建。为确保输入值不会搞砸,我将初始化值设置为 static。这对我来说感觉很老套,但由于一次只会有一个这样的对话,所以我可以接受。问题出在返回值上。原始监听器将被调用。这很好,因为该对象仍然存在,但如果需要更新 Activity(存在)上的 UI,它不会得到更新,因为 new Activity 实例现在控制着 UI。

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

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

最佳答案

你走对了,我按照Android Developers - Using DialogFragments article推荐的方法.

您创建 DialogFragment 并定义 Activity 将实现的接口(interface),就像您在上面所做的那样:

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

然后在 DialogFragment 中,当您想将结果返回给 Activity 时,您将 Activity 转换为界面:

@Override
public void onClick(DialogInterface dialog, int id) {
MyDialogFragmentListener activity = (MyDialogFragmentListener) getActivity();
activity.onReturnValue("some value");
}

然后在 Activity 中实现该接口(interface)并获取值:

public class MyActivity implements MyDialogFragmentListener {
...
@Override
public void onReturnValue(String foo) {
Log.i("onReturnValue", "Got value " + foo + " back from Dialog!");
}
}

关于android - 在 Android 上将值从 Dialog 传回 Activity 的可靠方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13435118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com