单击ImageView时更改片段中的ImageView

时间:2014-03-13 09:27:26

标签: java android android-fragments

我在我的应用中使用Fragments。我在ImageView中有一个Fragment。点击ImageView用户时,应该可以从图库中选择图片,图片应该显示在同一个ImageView中。我在Activity类中单独尝试了这个并且它工作正常,但我怎样才能在Fragment类中执行此操作?我试过的代码是 -

  public class FragmentCreateGroup extends Fragment {
    ImageView group;
    EditText et;
    LayoutInflater glob_inflater;
    View glob_view;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);



    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.fragment_creategroup, container, false);
            glob_view=v;
            glob_inflater=inflater;
            et = (EditText) v.findViewById(R.id.cr_group_grpname_input);
            group = (ImageView) v.findViewById(R.id.group_image);
            group.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    Intent intent = new Intent();
                     intent.setType("image/*");
                     intent.setAction(Intent.ACTION_GET_CONTENT);
                     startActivityForResult(Intent.createChooser(intent,
                             "Select Picture"), 1);
                }


            });
            return v;
    }
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == -1) {
            if (requestCode == 1) {
                Uri selectedImageUri = data.getData();
                String selectedImagePath = getPath(selectedImageUri);

                BitmapFactory.Options options = new BitmapFactory.Options();

                options.inSampleSize = 2;
                Bitmap bitmap = BitmapFactory.decodeFile(selectedImagePath, options);

                group.setImageBitmap(BitmapFactory.decodeFile(selectedImagePath));
            }
        }
    }

     public String getPath(Uri uri) {
         // just some safety built in 
         if( uri == null ) {
             // TODO perform some logging or show user feedback
             return null;
         }
         Activity act=new Activity();
         // try to retrieve the image from the media store first
         // this will only work for images selected from gallery
         String[] projection = { MediaStore.Images.Media.DATA };
         Cursor cursor =act.managedQuery(uri, projection, null, null, null);
         if( cursor != null ){
             int column_index = cursor
             .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
             cursor.moveToFirst();
             return cursor.getString(column_index);
         }
         // this is our fallback here
         return uri.getPath();
 }
    public void onStart() {
        // TODO Auto-generated method stub
        super.onStart();

    }

}

2 个答案:

答案 0 :(得分:0)

您不应该在Activity中使用startActivityForResult,而是在Fragment中使用Fragment,然后在onActivityResult中覆盖{{1}}来执行您的逻辑。< / p>

它是一样的,请试一试!

答案 1 :(得分:0)

对于StartActivityForResult,您必须按照以下步骤获得更好的解决方案。

1.开始时使用getActivity.StartActivityForResult()

2.User接口与片段和活动进行通信。

private void chooseOption() {
    DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            switch (which) {
            case DialogInterface.BUTTON_POSITIVE:
                pickImage();
                break;

            case DialogInterface.BUTTON_NEGATIVE:
                takePic();
                break;
            }
        }
    };

    AlertDialog.Builder builder = new AlertDialog.Builder(
            this.getActivity());
    builder.setMessage("Choose your option")
            .setPositiveButton("From Gallery", dialogClickListener)
            .setNegativeButton("Camera", dialogClickListener).show();
}

public void pickImage() {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    getActivity().startActivityForResult(intent, REQUEST_CODE);
}

public void takePic() {
    Intent cameraIntent = new Intent(
            android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    getActivity().startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
}

显示用于从图库或相机中获取图像的对话框的代码

在您的活动中定义此界面

public interface onImageGot {
    public void onImageGotSelected(Uri position);
}

在你的活动中为这个界面创建一个实例本身就像

之类的oncreate
onImageGot mCallback;

在onActivityResult上启动此实例并使用..

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Uri selectedImage = null;
    EditProfile titleFragmentByTag = (EditProfile) getSupportFragmentManager()
            .findFragmentByTag("edit");
    if (titleFragmentByTag != null) {
        mCallback = (onImageGot) titleFragmentByTag;
        if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK)
            try {
                selectedImage = data.getData();
            } catch (Exception e) {
                e.printStackTrace();
            }
        else if (requestCode == CAMERA_PIC_REQUEST
                && resultCode == Activity.RESULT_OK) {
            selectedImage = getImageUri(getApplicationContext(),
                    (Bitmap) data.getExtras().get("data"));
        }
        if (selectedImage != null) {
            mCallback.onImageGotSelected(selectedImage);
        }
    }
    super.onActivityResult(requestCode, resultCode, data);
}

public Uri getImageUri(Context inContext, Bitmap inImage) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = Images.Media.insertImage(inContext.getContentResolver(),
            inImage, "Title", null);
    return Uri.parse(path);
}

在片段类中实现HomeScreenActivity.onImageGot 您的片段将覆盖此

@Override
public void onImageGotSelected(Uri position) {
    UpdateImage(position);
}

在这里你可以从这里得到uri你可以像你想要的那样使用..