具有不同功能的多个 DialogFragments

Multiple DialogFragments with different functionalities

所以我正在开发 Android 应用程序,在该应用程序中,用户经常会被问到他想对某些操作(单击按钮等)执行什么操作。为此,我使用 AlertDialog 并在上面写了文字并添加了我需要的按钮。直到我意识到,在设备旋转时,打开的 AlertDialog 会 disappear。 我在网上发现处理旋转的正确方法是使用片段,所以我选择 class extending DialogFragment:

public class MyDialogFragment extends DialogFragment {

public interface YesNoListener {
    void onYes();
    void onNo();
    void onNeu();
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    String[] data = getArguments().getStringArray("data"); //vzame vrednosti, ki smo jih nastavili preden se pokliče .show();
    if(data != null) {
        switch (data.length) {
            case 3:
                return new AlertDialog.Builder(getActivity())
                        .setTitle(data[0])
                        .setMessage(data[1])
                        .setNeutralButton(data[2], new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ((YesNoListener) getActivity()).onNeu();
                            }
                        })
                        .create();
            case 4:
                return new AlertDialog.Builder(getActivity())
                        .setTitle(data[0])
                        .setMessage(data[1])
                        .setPositiveButton(data[2], new DialogInterface.OnClickListener() {

                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ((YesNoListener) getActivity()).onYes();
                            }
                        })
                        .setNegativeButton(data[3], new DialogInterface.OnClickListener() {

                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ((YesNoListener) getActivity()).onNo();
                            }
                        })
                        .create();
            case 5:
                return new AlertDialog.Builder(getActivity())
                        .setTitle(data[0])
                        .setMessage(data[1])
                        .setPositiveButton(data[2], new DialogInterface.OnClickListener() {

                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ((YesNoListener) getActivity()).onYes();
                            }
                        })
                        .setNegativeButton(data[3], new DialogInterface.OnClickListener() {

                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ((YesNoListener) getActivity()).onNo();
                            }
                        })
                        .setNeutralButton(data[4], new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ((YesNoListener) getActivity()).onNeu();
                            }
                        })
                        .create();
            default:
                return null;
        }
    }
    else
        return null;
}
}

我也使用了 interface,所以我可以在我将使用 MyDialogFragment 的 class 中实现 Button.onClick() 行为。使用 getArguments() 我传递了将在对话框中使用的所有文本。

问题是我只能将此 class 用于 one 对话框,因为我必须重写界面函数,但我有 multiple 具有不同行为的对话框。

我想用三个 public 对象 Runnable 来解决这个问题,我只是在需要更改 Button.onClick()

的行为的地方初始化 Runnable
...
Runnable runnablePositive, runnableNegative, runnableNeutral;
...

@Override
public void onYes(){
    threadPositive.start();
}

@Override
public void onNo(){
    threadNegative.start();
}

@Override
public void onNeu(){
    threadNeutral.start();
}

static MyDialogFragment newInstance(String[] arg) {
    MyDialogFragment f = new MyDialogFragment();

    Bundle args = new Bundle();
    args.putStringArray("data", arg);
    f.setArguments(args);

    return f;
}

...以及用法:

threadPositive = new Thread()
{
    public void run()
    {
         //do A
    }
};
threadNegative = new Thread()
{
    public void run()
    {
         //do B
    }
};
threadNeutral = new Thread()
{
    public void run()
    {
         //do C
    }
};
newInstance(new String[]{title, besedilo, nevtralno}).show(getFragmentManager(), "tag");

在我打开 Dialog 和 rotate这是主要问题,其他东西不知何故工作)设备(我使用 DialogFragment 的原因第一名)。所有变量都是 "deleted" 轮换,我已经传递了进一步工作所需的所有变量,但是出现了新问题,我不知道如何解决:我无法传递 Objects on旋转,无论我尝试 onRetainCustomNonConfigurationInstance() 还是 onSaveInstanceState() 都是徒劳的...

所以我不知道如何解决这个问题,我已经解决了数百个关于类似问题的问题,但没有运气......我将不胜感激关于这个问题的任何有用的建议或答案(即使这是解决问题的不同方法。

提前致谢!

如果您有多个具有不同行为的对话框,那么您应该简单地创建更多对话框实例并为它们分配不同的标签。而不是只做

newDialogFragment(someArgs).show(getFragmentManager(), "tag")

你可以做到

newDialogFragment(someArgs).show(getFragmentManager(), "dialogWithArgs")
newDialogFragment(someOtherArgs).show(getFragmentManager(), "dialogWithOtherArgs")

等等。您的界面应更改为

public interface YesNoListener {
    void onYes(String tag);
    void onNo(String tag);
    void onNeu(String tag);
}

当您从对话框中调用它的方法时,传递片段标记以便您知道哪个对话框调用了该方法。这样您就可以轻松处理任意数量的对话框。

关于保存对象,那些不改变的,进入参数,那些改变的,应该做成Parcelable并保存到Bundle,如果不能,那么你可以创建一个单独的片段和对其调用 setRetainInstance(true),然后将对象存储在其中。