Android背对背对话没有被正确解雇

时间:2017-01-31 19:18:37

标签: java android android-alertdialog android-dialogfragment

我需要一些帮助解决我在Android应用中使用DialogFragments时出现的问题。我被困了太久了。我确定我做错了什么,但我不知道是什么。我解释问题的最好方法是用一个最小的例子:

MainActivity.java

我们的主要活动有一个显示对话框的按钮。

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.java

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.java

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:

  1. 点击"显示对话框A"。
  2. 点击"转到B"。
  3. 点击"做点什么"。这应该关闭所有对话框。但实际上会带你回到对话框A。
  4. 还有很多其他方法可以产生类似的行为。我确定我已经错误地执行了某些操作,或者我做了一些不允许的事情,但我不知道修复它的方法或方法。如果您想进行实验,我可以使用上面的代码提供Github存储库。

1 个答案:

答案 0 :(得分:0)

正如DigitalNinja指出的那样,我创建新对话框片段的方式存在问题。具体来说,我在MainActivity.showDialogFragment()(上面)中所做的大部分工作都是不必要的或错误的。

MainActivity.showDialogFragment()的修订版修复了我遇到的所有问题:

public void showDialogFragment(DialogFragment fragment) {
    fragment.show(getSupportFragmentManager(), "dialog");
}