Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单击ImageView更改片段中的ImageView_Java_Android_Android Fragments - Fatal编程技术网

Java 单击ImageView更改片段中的ImageView

Java 单击ImageView更改片段中的ImageView,java,android,android-fragments,Java,Android,Android Fragments,我正在我的应用程序中使用片段。我在片段中有一个ImageView。单击ImageView时,用户应能够从库中选择图像,并且图像应显示在相同的ImageView中。我在一个活动类中分别尝试了这一点,效果很好,但在片段类中如何做到这一点?我试过的代码是- public class FragmentCreateGroup extends Fragment { ImageView group; EditText et; LayoutInflater glob_inflater

我正在我的应用程序中使用
片段。我在
片段中有一个
ImageView
。单击
ImageView
时,用户应能够从库中选择图像,并且图像应显示在相同的
ImageView
中。我在一个
活动
类中分别尝试了这一点,效果很好,但在
片段
类中如何做到这一点?我试过的代码是-

  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();

    }

}

您不应新建
活动
,而应在
片段
中使用
startActivityForResult
,然后在
片段
中,覆盖活动结果
以执行逻辑


都差不多,请试一试

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

1.启动时使用getActivity.StartActivityForResult()

2.与片段和活动通信的用户界面

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);
}
显示从gallery或camera获取图像的对话框的代码

在活动中定义此接口

public interface onImageGot {
    public void onImageGotSelected(Uri position);
}
在oncreate之前,在活动本身中为该接口创建一个实例

onImageGot mCallback;
并在ActivityResult上启动此实例并使用

@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);
}
通过在fragment类中实现HomeCreenactivity.onImageGot 你的碎片会覆盖这个

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

这里你得到了uri,因此你可以在这里随心所欲地使用。

我不明白你说的是什么,你能详细解释一下吗?好的,你需要将
changeImage
主体代码从你的BrowsePictureActivity复制到你片段的image
onClick
块中,然后将
onActivityResult
复制到片段中,可能是一些小的syntac错误,但修复它并不难。我尝试了你说的,但在选择了一个显示“应用程序不幸关闭”的图像后,我编辑了我问题中的代码,请看一下。我刚才吃了一顿饭,你能给我看一下你的日志吗?同样,在你的
getPath()
中,你不应该
new Activity
,在你的片段中,你只需要调用
getActivity()
来保存活动实例。谢谢你工作得很好..但是有些图像正在加载,有些图像没有加载..它只是显示为白色的oneKalaimuthu更新页面(位置);这里的位置是uri。使用这个uri,你想做什么就做什么UpdateImage方法,我将图像设置为一些图像视图。你可以做你想做的事