从图库中选择不在Android中的Fragment Class中工作的图像

时间:2015-10-07 13:46:27

标签: android fragment android-dialogfragment android-gallery

从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。

6 个答案:

答案 0 :(得分:0)

如果您startActivityForResult()调用Fragment方法,则有两个选项

  1. 直接致电startActivityForResult()
  2. 致电getActivity().startActivityForResult()
  3. 在您的情况下,如果您想在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上使用此代码,则:

  1. getActivity().startActivityForResult()将调用活动的onActivityResult()

  2. startActivityForResult()将调用活动和片段的onActivityResult()。这里的问题是,片段onActivityResult()将获得正确的requestCode。但是活动的那个将获得修改后的requestCode。

  3. 但嵌套碎片不是这种情况。对于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()方法......如果你需要帮助,请告诉我......