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