所以我正在开发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()
徒劳无功......
所以我不知道如何解决这个问题,我已经经历了数百个关于类似问题的问题,但没有运气......我会很感激有关这个问题的任何有用的建议或答案(即使它是解决问题的另一种方法)。
提前致谢!
答案 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)在上面,然后将对象存储在其中。