我需要一些帮助解决我在Android应用中使用DialogFragments时出现的问题。我被困了太久了。我确定我做错了什么,但我不知道是什么。我解释问题的最好方法是用一个最小的例子:
我们的主要活动有一个显示对话框的按钮。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void showDialogFragment(DialogFragment fragment) {
// DialogFragment.show() will take care of adding the fragment
// in a transaction. We also want to remove any currently showing
// dialog, so make our own transaction and take care of that here.
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
// Show the dialog.
fragment.show(ft, "dialog");
}
public void showDialogA(View v) {
showDialogFragment(new DialogFragmentA());
}
}
DialogFragmentA是一个带有两个按钮的简单对话框。一个按钮取消,另一个按钮显示DialogFragmentB。
public class DialogFragmentA extends AppCompatDialogFragment implements DialogInterface.OnClickListener {
@Override
@NonNull
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setMessage("Dialog A")
.setTitle("Dialog A")
.setNegativeButton("Cancel", this)
.setPositiveButton("Go to B", this)
.create();
}
@Override
public void onClick(DialogInterface dialogInterface, int i) {
if (i == DialogInterface.BUTTON_NEGATIVE) {
dismiss();
} else if (i == DialogInterface.BUTTON_POSITIVE) {
dismiss();
((MainActivity) getActivity()).showDialogFragment(new DialogFragmentB());
}
}
}
DialogFragmentB类似。一个按钮会将您带回A.
public class DialogFragmentB extends AppCompatDialogFragment implements DialogInterface.OnClickListener {
@Override
@NonNull
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setTitle("Dialog B")
.setMessage("Dialog B")
.setPositiveButton("Do Something", this)
.setNegativeButton("Go to A", this)
.create();
}
@Override
public void onClick(DialogInterface dialogInterface, int i) {
if (i == DialogInterface.BUTTON_NEGATIVE) {
dismiss();
((MainActivity) getActivity()).showDialogFragment(new DialogFragmentA());
} else if (i == DialogInterface.BUTTON_POSITIVE) {
dismiss();
}
}
}
我遇到的问题是,如果我从一个对话框转到下一个对话框,原始对话框将无法正常解除。例如,来自MainActivity:
还有很多其他方法可以产生类似的行为。我确定我已经错误地执行了某些操作,或者我做了一些不允许的事情,但我不知道修复它的方法或方法。如果您想进行实验,我可以使用上面的代码提供Github存储库。
答案 0 :(得分:0)
正如DigitalNinja指出的那样,我创建新对话框片段的方式存在问题。具体来说,我在MainActivity.showDialogFragment()(上面)中所做的大部分工作都是不必要的或错误的。
MainActivity.showDialogFragment()的修订版修复了我遇到的所有问题:
public void showDialogFragment(DialogFragment fragment) {
fragment.show(getSupportFragmentManager(), "dialog");
}