从Fragment Class中的Gallery中选择Image不起作用。
我尝试了更多堆栈代码。
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), GALLERY_INTENT_CALLED);
} else {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, GALLERY_KITKAT_INTENT_CALLED);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
以上代码适用于Activity Class。不适用于Pure Fragment Class。
答案 0 :(得分:0)
如果您从startActivityForResult()
调用Fragment
方法,则有两个选项:
startActivityForResult()
getActivity().startActivityForResult()
在您的情况下,如果您想在Activity
处理结果,请以这种方式更改您的代码:
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
getActivity().startActivityForResult(Intent.createChooser(intent, "Select Picture"), GALLERY_INTENT_CALLED);
} else {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
getActivity().startActivityForResult(intent, GALLERY_KITKAT_INTENT_CALLED);
}
否则,如果您需要在调用Fragment
中处理结果并且它当前不起作用,则可能会出现传播问题。这种问题已在this post中广泛描述。
可以找到关于 startActivityForResult和嵌套片段的详细文章here。
答案 1 :(得分:0)
如果上面的代码不起作用,您应该检查片段导入语句。
我认为你在片段中使用片段。如果是这样,请发布您的导入代码。
答案 2 :(得分:0)
希望这对你有所帮助。
Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, RESULT_LOAD_IMAGE);
// write this in your fragment or method or listener which will invoke gallery.
然后在你的片段
中写下这个public void onActivityResult(int requestCode, int resultCode, Intent data){
if (requestCode == RESULT_LOAD_IMAGE && resultCode == getActivity().RESULT_OK
&& null != data) {
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getActivity().getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
Log.d("Picture Path", "Picture Path:"+picturePath);
long total_Images_size=0;
File f=new File(picturePath);
//total_Images_size+=f.length();
/*if(total_Images_size>MAX_IMAGE_FILES_SIZE)
{
Toast.makeText(getActivity(), "Image attachments size cannot exceed 5MB(total).", Toast.LENGTH_LONG).show();
return;
}*/
String selectedFilename=picturePath.substring(picturePath.lastIndexOf("/"));
addPicture(picturePath, imageCount);
}
如果有任何错误,请尝试并告诉我。谢谢
答案 3 :(得分:0)
如果您在附加到Activity的Fragment上使用此代码,则:
getActivity().startActivityForResult()
将调用活动的onActivityResult()
。
startActivityForResult()
将调用活动和片段的onActivityResult()
。这里的问题是,片段onActivityResult()
将获得正确的requestCode。但是活动的那个将获得修改后的requestCode。
但嵌套碎片不是这种情况。对于NestedFragments,请始终调用getActivity().startActivityForResult()
并在活动的onActivityResult()
中处理结果。如果你不想在片段和活动之间创建强大的依赖关系,你必须有一个设计模式来实现这种解耦(我使用Otto库)。更好的方法是始终从附加到活动的片段中调用getActivity().startActivityForResult()
,而不是嵌套的。{/ p>
最佳做法:根据我的经验,仅在活动中处理onActivityResult()
!这将减少大量的维护噩梦。使用其他一些机制将其委托给片段。
答案 4 :(得分:0)
由于您要做的只是从图库意图中检索图像并填充您的FRAGMENT中存在的图像视图,您可以做的是在您的活动中保留对此图像视图的引用并使用getActivity().startActivityForResult()
然后设置活动中imageview引用的位图。
代码:
// YOUR FRAGMENT
// fragment code...
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), GALLERY_INTENT_CALLED);
} else {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
// Update your activity's imageview reference
mListener.setImageViewRef(fragmentImgView);
getActivity().startActivityForResult(intent, GALLERY_KITKAT_INTENT_CALLED);
}
// more code..
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
mListener = (OnFragmentInteractionListener) getActivity();
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnFragmentInteractionListener");
}
}
// Create interface to communicate with your activity
public interface OnFragmentInteractionListener {
void setImageViewRef(ImageView imgView);
}
// END FRAGMENT CODE.
// YOUR ACTIVITY
public class MyActivity extends FragmentActivity implements MyFragment.OnFragmentInteractionListener {
...
private ImageView myFragmentsImageViewReference;
...
@Override
void setImageViewRef(ImageView imgView) {
this.myFragmentsImageViewReference = imgView;
}
public void onActivityResult(int requestCode, int resultCode, Intent data){
... get Image from intent ...
myFragmentsImageViewReference.setImageBitmap(myBitmapRetrievedFromIntent);
...
}
}
// END ACTIVITY CODE
答案 5 :(得分:0)
如果你没有在Fragment的onActivityResult()中获得回调,请检查你的活动的onActivityResult()方法。如果你在父活动中回调,那么你可以从那里调用Fragment的onActivityResult()方法......如果你需要帮助,请告诉我......