Android 从未从 Fragment 中的 DialogFragment 调用过 onActivityResult
Android onActivityResult never called from DialogFragment in Fragment
我想显示 Dialog
,以便在 Fragment
中选择打开 Camera
/ Gallery
。
按下Button
后,我显示一个自定义的DialogFragment
(这个DialogFragment
是inner
class
里面的Fragment
).
public static class AddPictureDialogFragment extends DialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_add_picture_dialog, container, false);
getDialog().setTitle("New Picture");
Button openCameraButton = (Button) rootView.findViewById(R.id.open_camera_button);
openCameraButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("","Open Camera Option Selected");
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUEST_CAMERA);
getDialog().dismiss();
}
});
Button openGalleryButton = (Button) rootView.findViewById(R.id.open_gallery_button);
openGalleryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("","Open Gallery Option Selected");
Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
startActivityForResult(Intent.createChooser(intent, "Select File"), SELECT_FILE);
getDialog().dismiss();
}
});
return rootView;
}
}
选择一个选项后,初始化Camera
/Gallery
,但在制作/选择图片后,onActivityResult
方法永远不会被调用。
这是我创建 DialogFragment
:
的代码
FragmentManager fm = getActivity().getSupportFragmentManager();
AddPictureDialogFragment addPictureDialogFragment = new AddPictureDialogFragment();
addPictureDialogFragment.show(fm, getTag());
奇怪的是,如果我直接在 Fragment
中创建 DialogFragment
而没有使用 DialogFragment
它会起作用...
我在创建 DialogFragment
:
时也试过这个
addPictureDialogFragment.setTargetFragment(this, 1);
和这个,当初始化 camera
Intent
:
Button openCameraButton = (Button) rootView.findViewById(R.id.open_camera_button);
openCameraButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("","Open Camera Option Selected");
getDialog().dismiss();
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
getTargetFragment().onActivityResult(getTargetRequestCode(), 1, intent);
startActivityForResult(intent, REQUEST_CAMERA);
}
});
在你的主要 activity 中覆盖 onActivityResult 方法如下。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
if(fragment!=null)
fragment.onActivityResult(requestCode, resultCode, data);
}
}
有时片段可能会被破坏,但引用可能会持续存在,因此会进行 if(fragment!=null) 检查。
请将此代码写入您的 Main Actvity。
// In your activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
System.out.println("onActivityResult Main Activity");
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
fragment.onActivityResult(requestCode, resultCode, data);
}
}
覆盖 Activity 父级 Activity 的结果,即所有片段的父级
在您的 Main 上覆盖此方法 activity :
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
TestFrag demoFragment = (TestFrag) getSupportFragmentManager().findFragmentByTag("test");
demoFragment.onActivityResult(requestCode, resultCode, data);
}
在您的片段 activity 结果调用之后
这部分很简单
只要打电话startActivityForResult(intent,constant);
在你片段 class
覆盖 activity 中的 onActivityResult
并且不删除 super.onActivityResult(requestCode, resultCode, data);
也覆盖片段 class
中的 onActivityResult
在activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "activity result called");
super.onActivityResult(requestCode, resultCode, data);
}
片段中
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "fragment result called");
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==constant){
Logger.d(TAG, "got result");
}
}
试试这个:
private void showAddImageDialog() {
FragmentManager fm = getActivity().getSupportFragmentManager();
AddPictureDialogFragment addPictureDialogFragment = new AddPictureDialogFragment();
addPictureDialogFragment.setTargetFragment(this, REQUEST_CAMERA);
addPictureDialogFragment.show(fm, getTag());
}
public static class AddPictureDialogFragment extends DialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_add_picture_dialog, container, false);
getDialog().setTitle("New Picture");
Button openCameraButton = (Button) rootView.findViewById(R.id.open_camera_button);
openCameraButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("","Open Camera Option Selected");
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
getTargetFragment().startActivityForResult(intent, getTargetRequestCode());
getDialog().dismiss();
}
});
Button openGalleryButton = (Button) rootView.findViewById(R.id.open_gallery_button);
openGalleryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("","Open Gallery Option Selected");
Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
getTargetFragment().startActivityForResult(Intent.createChooser(intent, "Select File"), SELECT_FILE);
getDialog().dismiss();
}
});
return rootView;
}
}
我想显示 Dialog
,以便在 Fragment
中选择打开 Camera
/ Gallery
。
按下Button
后,我显示一个自定义的DialogFragment
(这个DialogFragment
是inner
class
里面的Fragment
).
public static class AddPictureDialogFragment extends DialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_add_picture_dialog, container, false);
getDialog().setTitle("New Picture");
Button openCameraButton = (Button) rootView.findViewById(R.id.open_camera_button);
openCameraButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("","Open Camera Option Selected");
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUEST_CAMERA);
getDialog().dismiss();
}
});
Button openGalleryButton = (Button) rootView.findViewById(R.id.open_gallery_button);
openGalleryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("","Open Gallery Option Selected");
Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
startActivityForResult(Intent.createChooser(intent, "Select File"), SELECT_FILE);
getDialog().dismiss();
}
});
return rootView;
}
}
选择一个选项后,初始化Camera
/Gallery
,但在制作/选择图片后,onActivityResult
方法永远不会被调用。
这是我创建 DialogFragment
:
FragmentManager fm = getActivity().getSupportFragmentManager();
AddPictureDialogFragment addPictureDialogFragment = new AddPictureDialogFragment();
addPictureDialogFragment.show(fm, getTag());
奇怪的是,如果我直接在 Fragment
中创建 DialogFragment
而没有使用 DialogFragment
它会起作用...
我在创建 DialogFragment
:
addPictureDialogFragment.setTargetFragment(this, 1);
和这个,当初始化 camera
Intent
:
Button openCameraButton = (Button) rootView.findViewById(R.id.open_camera_button);
openCameraButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("","Open Camera Option Selected");
getDialog().dismiss();
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
getTargetFragment().onActivityResult(getTargetRequestCode(), 1, intent);
startActivityForResult(intent, REQUEST_CAMERA);
}
});
在你的主要 activity 中覆盖 onActivityResult 方法如下。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
if(fragment!=null)
fragment.onActivityResult(requestCode, resultCode, data);
}
}
有时片段可能会被破坏,但引用可能会持续存在,因此会进行 if(fragment!=null) 检查。
请将此代码写入您的 Main Actvity。
// In your activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
System.out.println("onActivityResult Main Activity");
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
fragment.onActivityResult(requestCode, resultCode, data);
}
}
覆盖 Activity 父级 Activity 的结果,即所有片段的父级
在您的 Main 上覆盖此方法 activity :
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
TestFrag demoFragment = (TestFrag) getSupportFragmentManager().findFragmentByTag("test");
demoFragment.onActivityResult(requestCode, resultCode, data);
}
在您的片段 activity 结果调用之后
这部分很简单
只要打电话startActivityForResult(intent,constant);
在你片段 class
覆盖 activity 中的 onActivityResult
并且不删除 super.onActivityResult(requestCode, resultCode, data);
也覆盖片段 class
中的onActivityResult
在activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "activity result called");
super.onActivityResult(requestCode, resultCode, data);
}
片段中
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "fragment result called");
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==constant){
Logger.d(TAG, "got result");
}
}
试试这个:
private void showAddImageDialog() {
FragmentManager fm = getActivity().getSupportFragmentManager();
AddPictureDialogFragment addPictureDialogFragment = new AddPictureDialogFragment();
addPictureDialogFragment.setTargetFragment(this, REQUEST_CAMERA);
addPictureDialogFragment.show(fm, getTag());
}
public static class AddPictureDialogFragment extends DialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_add_picture_dialog, container, false);
getDialog().setTitle("New Picture");
Button openCameraButton = (Button) rootView.findViewById(R.id.open_camera_button);
openCameraButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("","Open Camera Option Selected");
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
getTargetFragment().startActivityForResult(intent, getTargetRequestCode());
getDialog().dismiss();
}
});
Button openGalleryButton = (Button) rootView.findViewById(R.id.open_gallery_button);
openGalleryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("","Open Gallery Option Selected");
Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
getTargetFragment().startActivityForResult(Intent.createChooser(intent, "Select File"), SELECT_FILE);
getDialog().dismiss();
}
});
return rootView;
}
}