在 Fragments 和 Show 之间切换隐藏 AlertDialog 并保持状态

Switch between Fragments and Show hide the AlertDialog and maintain state

我的 Android 应用程序有以下场景。

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

intent.putExtra(MediaStore.EXTRA_OUTPUT, getCapturedImagePath());

((Activity)context).startActivityForResult(intent, Constant.CAMERA_CAPTURE);

((Activity) context).overridePendingTransition(R.anim.right_to_left_layout, R.anim.left_to_right_layout);
FragmentTransaction fragTrans = getSupportFragmentManager().beginTransaction();

//Hide Fragment1
fragTrans.hide(fragment1);

//Add Fragment2
fragTrans.add(R.id.frame_container, fragment2, fragment2.getClass().getSimpleName());

fragTrans.addToBackStack(fragment2.getClass().getSimpleName());

fragTrans.commit();

看起来像Fragment2 with AlertDialog

这里我们几乎没有问题。

问题 1: 它在 Fragment2 上显示相同的 AlertDialog,而实际上在 Fragment1Fragment2 中打开的是加载在该对话框后面。 如何隐藏这个对话框?

问题 2:Fragment2 上我们有 Correct 按钮,当它被点击时我们需要关闭 Fragment2 并显示Fragment1 具有相同的警报对话框,或者您可以说处于启动相机之前的相同状态。 我们如何做到这一点?

请指导。

谢谢

对于添加第一个片段,写:

 fragmentManager.beginTransaction().replace(R.id.relativeLayout, fragment).addToBackStack(fragment1.getClass().getSimpleName()).commit();

在片段 1 中显示 AlertDialog

 private void showDialog() {

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setPositiveButton("Camera", null);
    builder.setNegativeButton("Cancel", null);
    final AlertDialog alertDialog = builder.create();
    alertDialog.setCanceledOnTouchOutside(false);

    alertDialog.setOnShowListener(new DialogInterface.OnShowListener() {
        @Override
        public void onShow(DialogInterface dialog) {
            Button button_positive = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
            Button button_negative = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE);


            button_negative.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    alertDialog.dismiss();
                }
            });

            button_positive.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // Your Camera Call
                    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                 // intent.putExtra(MediaStore.EXTRA_OUTPUT, "image path");
                    getActivity().startActivityForResult(intent, "REQUEST_CODE"); getActivity().overridePendingTransition(R.anim.right_to_left_layout, R.anim.left_to_right_layout);
                    //make sure that don't call ==>  alertDialog.dismiss();
                }
            });

        }
    });
    alertDialog.show();

}

相机调用 OnActivityresult 后:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
     //returned from camera
    // goto next Fragment ==> getActivity().fragmentManager.beginTransaction().replace(R.id.relativeLayout, fragment).addToBackStack(fragment2.getClass().getSimpleName()).commit();
   //  and for back to fragment 1 call in fragment 2 ==> //getActivity().fragmentManager.popBackStack(fragment2.getClass().getSimpleName());
}

当您到达片段 1 时,您的状态与片段开始时的状态相同

希望你能得到解决方案

问题1解决方案:- 单击对话框中的相机图标。

camera.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            dialog.dismiss();
            Utils.setDialog(dialog);

            FragmentTransaction fragTran = getSupportFragmentManager().beginTransaction();
            if(activeFragment != null)
                  fragTran.hide(activeFragment);

            fragTran.add(R.id.frame_container, fragment2, fragment2.getClass().getSimpleName());
            fragTran.addToBackStack(fragment2.getClass().getSimpleName());
            fragTran.commit();
            activeFragment = fragment2;  

     }
 });
  • 问题2解决方案:- OnClick of 'correct' button from 'Fragment2'

    correct.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getSupportFragmentManager().popBackStack(); AlertDialog alertDialog = Utils.getDialog(); if(alertDialog != null) alertDialog.show(); } });

这是我的作品。