具有不同功能的多个 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),然后将对象存储在其中。
所以我正在开发 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 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),然后将对象存储在其中。