在 Fragments 和 Show 之间切换隐藏 AlertDialog 并保持状态
Switch between Fragments and Show hide the AlertDialog and maintain state
我的 Android 应用程序有以下场景。
- 第 1 步:
Main Activity
加载 Fragment1
。
- 第 2 步:
Fragment1
在某些事件上显示 AlertDialog
,如下所示
Fragment1 with AlertDialog
- 第三步:对话框右上角有一个摄像头图标。单击它时,它会打开相机拍摄照片,如下所示
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);
- 第 4 步:当图片被捕获时,我们重定向到另一个名为
Fragment2
的片段,我们在其中使用以下代码显示捕获的照片。
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
,而实际上在 Fragment1
和 Fragment2
中打开的是加载在该对话框后面。
如何隐藏这个对话框?
问题 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();
}
});
这是我的作品。
我的 Android 应用程序有以下场景。
- 第 1 步:
Main Activity
加载Fragment1
。 - 第 2 步:
Fragment1
在某些事件上显示AlertDialog
,如下所示 Fragment1 with AlertDialog - 第三步:对话框右上角有一个摄像头图标。单击它时,它会打开相机拍摄照片,如下所示
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);
- 第 4 步:当图片被捕获时,我们重定向到另一个名为
Fragment2
的片段,我们在其中使用以下代码显示捕获的照片。
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
,而实际上在 Fragment1
和 Fragment2
中打开的是加载在该对话框后面。
如何隐藏这个对话框?
问题 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(); } });
这是我的作品。