具有不同功能的多个DialogFragments

时间:2017-09-07 08:43:50

标签: java android runnable android-dialogfragment

所以我正在开发Android应用程序,用户经常被问到他想对某些操作做什么(按钮点击等)。为此,我使用AlertDialog并在其上写了文字,并添加了我需要的按钮。直到我意识到,在设备轮换时,一个打开的AlertDialog会disappear。 我在网上发现处理旋转的正确方法是使用Fragment,所以我选择使类扩展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的类中实现Button.onClick()行为。使用getArguments(),我传递了将在Dialog中使用的所有文本。

问题是我只能将此类用于one Dialog,因为我必须覆盖接口函数,但我有multiple具有不同行为的对话框。

我想用三个公共对象Runnable来解决这个问题,我只想初始化Runnable,我需要更改Button.onClick()的行为

...
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的原因)。所有变量都被"删除"关于轮换,我已经传递了我需要进一步工作的所有变量,但是出现了新问题,我不知道如何解决:我无法通过Objects轮换,无论我是否尝试{ {1}}或onRetainCustomNonConfigurationInstance()徒劳无功......

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

提前致谢!

1 个答案:

答案 0 :(得分:2)

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

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

从对话框中调用其方法时,传递fragment标记,以便知道哪个对话框称为该方法。这样你就可以轻松处理任意数量的对话框。

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