使用片段从图库中选择图像

Posted

技术标签:

【中文标题】使用片段从图库中选择图像【英文标题】:Selecting Image from gallery using fragment 【发布时间】:2013-06-22 06:04:06 【问题描述】:

我正在尝试使用从片段活动中调用的片段从图库中获取图像,但片段类的onActivityResult 未被调用。我发现这可能是由于 FragmentActivity 类的onActivityResult 而发生的,但是当我检查这两个类的日志时,没有调用 non,因此我无法从图库中访问选定的图像。

我已经尝试了大多数解决方案,但仍然无法解决问题。

我的主要片段活动

public class CreateEvent extends FragmentActivity

private int CREATE =0;
private int INVITE = 1;
private int FRAGMENT_COUNT = INVITE +1;
private Fragment[] fragment = new Fragment[FRAGMENT_COUNT]; 
private boolean isResumed = false;
@Override
protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        FragmentManager fm = getSupportFragmentManager();
        fragment[CREATE] = fm.findFragmentById(R.id.create);
        fragment[INVITE] = fm.findFragmentById(R.id.invite);
        FragmentTransaction transaction = fm.beginTransaction();
        for(int i = 0 ; i<fragment.length; i++)
        
            transaction.hide(fragment[i]);
        
        transaction.commit();
    ;
        private void showfragment(int fragmentIndex, boolean addToBackStack)
        
            FragmentManager fm = getSupportFragmentManager();
            FragmentTransaction transaction = fm.beginTransaction();
                for (int i = 0; i<fragment.length;i++)
            
                if (i == fragmentIndex)
                
                    transaction.show(fragment[i]);
                
                else
                
                    transaction.hide(fragment[i]);
                
            
            if (addToBackStack)
            
                transaction.addToBackStack(null);
            
            transaction.commit();
        

// I've tried both including and excluding onresume and onresumefragment methods
@Override
protected void onResumeFragments() 
    super.onResumeFragments();
    
            isResumed = true;
            showfragment(INVITE, false);
    
  
@Override
protected void onResume() 
        super.onResume();
        isResumed = true;


// I've tried both including and excluding this method as well
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) 
           super.onActivityResult(requestCode, resultCode, data);
           EventActivity activity = (EventActivity) getSupportFragmentManager().findFragmentById(R.id.create);
           activity.onActivityResult(requestCode, resultCode, data);

    

我的片段类

public class Event extends Fragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) 
    final View view = inflater.inflate(R.layout.createevent,container,false);

    imgcover = (ImageView) view.findViewById(R.id.newcover_img);
    btnupload = (Button) view.findViewById(R.id.newcover_upload);

    btnupload.setOnClickListener(new View.OnClickListener() 
    @Override
    public void onClick(View arg0) 
        Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(intent, RESULT_LOAD_IMAGE);
    
    );


 @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) 
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) 
    
        Uri selectedImg = data.getData();
        String[] filePathColumn =  MediaStore.Images.Media.DATA ;
        Cursor cursor = getContentResolver().query(selectedImg,
                    filePathColumn, null, null, null);
                cursor.moveToFirst();
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String picturePath = cursor.getString(columnIndex);
        imgcover = (ImageView) findViewById(R.id.newcover_img);
        imgcover .setImageBitmap(BitmapFactory.decodeFile(picturePath));
                cursor.close();
    
  

【问题讨论】:

你找到答案了吗,在这里更新@lil'ms 【参考方案1】:

我正在这样做,它有效!

希望对你有帮助!!

mImgProfile.setOnClickListener(new OnClickListener() 

        @Override
        public void onClick(View v) 
            Intent i = new Intent(
                    Intent.ACTION_PICK,
                    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(i, IMAGE_PICKER_SELECT);
        
    );


public void onActivityResult(int requestCode, int resultCode, Intent data) 
    if (requestCode == IMAGE_PICKER_SELECT
            && resultCode == Activity.RESULT_OK) 
        String path = getPathFromCameraData(data, this.getActivity());
        Log.i("PICTURE", "Path: " + path);
        if (path != null) 
            setFullImageFromFilePath(mImgProfile, path);
        
    


public static String getPathFromCameraData(Intent data, Context context) 
    Uri selectedImage = data.getData();
    String[] filePathColumn =  MediaStore.Images.Media.DATA ;
    Cursor cursor = context.getContentResolver().query(selectedImage,
            filePathColumn, null, null, null);
    cursor.moveToFirst();
    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
    String picturePath = cursor.getString(columnIndex);
    cursor.close();
    return picturePath;

【讨论】:

谢谢,你节省了我的时间:)【参考方案2】:
public class FragmentProfile extends Fragment 

    private static final int RESULT_OK = -1;
    Bitmap image;
    private GetPhoto gph;

    private static int RESULT_LOAD_IMAGE = 1;


    View myView;
    private ImageView profImg;


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
        myView = inflater.inflate(R.layout.profile_layout, container, false);


        //Setting up the content
        profImg = (ImageView) myView.findViewById(R.id.prfimg);


        //Choosing profile pic from clicking on the ImageView
        profImg.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                Intent i = new Intent(
                        Intent.ACTION_PICK,
                        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

                startActivityForResult(i, RESULT_LOAD_IMAGE);
            
        );


        return myView;
    

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) 
        super.onActivityResult(requestCode, resultCode, data);

        //GETTING IMAGE FROM GALLERY
        if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) 
            Uri selectedImage = data.getData();
            String[] filePathColumn = MediaStore.Images.Media.DATA;

            Cursor cursor = this.getActivity().getContentResolver().query(selectedImage,
                    filePathColumn, null, null, null);
            cursor.moveToFirst();

            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String picturePath = cursor.getString(columnIndex);
            cursor.close();


            profImg.setImageBitmap(BitmapFactory.decodeFile(picturePath));

        
    

【讨论】:

以上是关于使用片段从图库中选择图像的主要内容,如果未能解决你的问题,请参考以下文章

如何使用接口将活动回调返回到片段

从图库中选择图像并保存以备将来使用

从图库中选择照片(onActivityResult()问题 - 我想是这样) - 片段Android

如果从图库中选择图像或选择视频,则在 onActivityResult 中识别 - Android

从相机中选择图像时无法交付结果,但从图库中选择图像时没有问题

Android:在捕获或从图库中挑选后裁剪图像