问题描述
MainActivity.java
所以按钮 choose_img_btn 会将您重定向到图库,您可以从中选择图像,在我的数组列表中,我使用 R.drawable.ids 临时添加了一些图像。到目前为止,我可以转到我的图库并单击图像,但图像没有添加到我的网格视图中。 我想我在 onActivityResult 类中犯了错误。我需要一种方法将我的图片从图库添加到我的 gridview,但不知道如何去做。我从 stackoverflow 中尝试了很多结果,但仍然无法正常工作。
公共类 MainActivity 扩展了 AppCompatActivity{GridView gridView;
ImageButton choose_Img_Btn;
private static final int IMAGE_PICK_CODE = 1000;
private static final int PERMISSION_CODE = 1001;
public int queue=-1;
Uri selectedImage;
String imgDecodableString;
ArrayList<Integer> myImageIds = new ArrayList<>(Arrays.asList(
R.drawable.img0,R.drawable.img1,R.drawable.img2,R.drawable.img3,R.drawable.img4,R.drawable.img5,R.drawable.img6,R.drawable.img7,R.drawable.img8,R.drawable.img9,R.drawable.img10,R.drawable.img11,R.drawable.img12,R.drawable.img13,R.drawable.img14,R.drawable.img15,R.drawable.img16,R.drawable.img41,R.drawable.img17,R.drawable.img18,R.drawable.img19,R.drawable.img20,R.drawable.img21,R.drawable.img22,R.drawable.img23,R.drawable.img24,R.drawable.img25,R.drawable.img26,R.drawable.img27,R.drawable.img28,R.drawable.img29,R.drawable.img43,R.drawable.img30,R.drawable.img31,R.drawable.img32,R.drawable.img33,R.drawable.img34,R.drawable.img35,R.drawable.img36,R.drawable.img37,R.drawable.img38,R.drawable.img39,R.drawable.img40,R.drawable.img42,R.drawable.img44,R.drawable.img45
));
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gridView = findViewById(R.id.myGrid);
choose_Img_Btn = findViewById(R.id.choose_img_btn);
// we need an adapter to set images in this grid-view
gridView.setAdapter(new ImageAdaptor(myImageIds,this));
gridView.setonItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView,View view,int i,long l) {
int item_pos = myImageIds.get(i);
ShowDialogBox(item_pos);
}
});
choose_Img_Btn.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//check runtime permission
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
if(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED)
{
//permission not granted,request it
String[] permissions = {Manifest.permission.READ_EXTERNAL_STORAGE};
requestPermissions(permissions,PERMISSION_CODE);
}
else{
//permission already granted
pickImageFromgallery();
}
}
else{
//system OS is less then marshmallow xD
}
}
});
}
private void pickImageFromgallery() {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent,IMAGE_PICK_CODE);
}
//handle request for picked image
@Override
protected void onActivityResult(int requestCode,int resultCode,@Nullable Intent data) {
super.onActivityResult(requestCode,resultCode,data);
/* if(resultCode == RESULT_OK && requestCode == IMAGE_PICK_CODE){
gridView.
}*/
/*
// Set up a try/catch for selecting images from the gallery.
try {
// If an image *is* selected,i.e. we make sure the user has actually selected one.
if (requestCode == IMAGE_PICK_CODE && resultCode == RESULT_OK
&& data != null) {
// Set
queue = 1;
//Assign the results of data.GetData() to our URI variable,selectedImage.
//gridView = data.getData();
// Set up a string to contain the name of the file in question.
String[] filePathColumn = { MediaStore.Images.Media.DATA };
// Get the cursor,Cursor cursor = getContentResolver().query(selectedImage,filePathColumn,null,null);
// Move the cursor to the first row.
cursor.movetoFirst();
// ???? something to do with a database
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
imgDecodableString = cursor.getString(columnIndex);
cursor.close();
}
// Stop the "You haven't picked an image!" message on displaying if we hit the back button
// to return to the browse Photos screen from the Edit Photos screen.
else if(queue!=-1) {
return;
}
else {
Toast.makeText(this,"You haven't picked an image!",Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
Toast.makeText(this,"Something went wrong!",Toast.LENGTH_LONG).show();
}
*/
if (requestCode == IMAGE_PICK_CODE && resultCode == RESULT_OK && data != null){
Uri selectedImage = data.getData();
choose_Img_Btn.setimageURI(selectedImage);
//gridView.setAdapter(new ImageAdaptor(myImageIds,this));
ImageView i = new ImageView(this);
i.setimageURI(selectedImage);
myImageIds.add(i.getId());
}
}
//handle request for runtime permission
@Override
public void onRequestPermissionsResult(int requestCode,@NonNull String[] permissions,@NonNull int[] grantResults) {
switch (requestCode){
case PERMISSION_CODE: {
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
//permission was granted
pickImageFromgallery();
}
else{
//permission was denied
Toast.makeText(this,"Permission denied...!",Toast.LENGTH_SHORT).show();
}
}
}
}
public void ShowDialogBox(int item_pos){
Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.custom_dialog);
//Getting Custom Dialog Views
TextView Image_name = dialog.findViewById(R.id.txt_Image_name);
ImageView image = dialog.findViewById(R.id.img);
Button btn_full = dialog.findViewById(R.id.btn_full);
Button btn_close = dialog.findViewById(R.id.btn_close);
String title = getResources().getResourceName(item_pos);
//Extract only name
int index = title.indexOf("/");
String name = title.substring(index+1,title.length());
Image_name.setText(name);
image.setimageResource(item_pos);
btn_close.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog.dismiss();
}
});
btn_full.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,FullView.class);
intent.putExtra("img_id",item_pos);
startActivity(intent);
}
});
dialog.show();
}
}
ImageAdaptor 类
公共类 ImageAdaptor 扩展 BaseAdapter {
private List<Integer> mThumbIds;
private Context context;
public ImageAdaptor(List<Integer> mThumbIds,Context context) {
this.mThumbIds = mThumbIds;
this.context = context;
}
@Override
public int getCount() {
return mThumbIds.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return mThumbIds.get(i);
}
@Override
public View getView(int position,View convertView,ViewGroup parent) {
ImageView imageView = (ImageView) convertView;
if(imageView == null){
imageView = new ImageView(context);
imageView.setLayoutParams(new ViewGroup.LayoutParams(350,450));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
}
// imageView.setimageResource(mThumbIds.get(position));
Glide.with(context).load(mThumbIds.get(position)).into(imageView);
return imageView;
}
解决方法
首先,要从图库中获取多张图片,您需要在创建打开图库的意图时添加 intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE,true);
。
//select image
public void Select_Image() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE,true);
startActivityForResult(Intent.createChooser(intent,"Select Image"),select_image_code);
}
之后,将所有选定的图像 URI 添加到 ArrayList<Uri> uriArrayList;
@Override
protected void onActivityResult(int requestCode,int resultCode,@Nullable Intent data) {
super.onActivityResult(requestCode,resultCode,data);
if (requestCode == select_image_code && resultCode == RESULT_OK && data.getClipData() != null) {
int image_count = data.getClipData().getItemCount();
for (int i = 0; i < image_count; i++) {
uriArrayList.add(data.getClipData().getItemAt(i).getUri());
}
gridview_adapter.notifyDataSetChanged();
}
}
完整示例:
1) activity_main2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity2">
<Button
android:id="@+id/BTN_select_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="12dp"
android:fontFamily="sans-serif"
android:text="Select Image"
android:textAllCaps="false"
android:textSize="20dp" />
<GridView
android:id="@+id/img_gridview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:numColumns="2"
android:scrollbars="vertical" />
</LinearLayout>
2) gridview_adapter.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:orientation="vertical">
<ImageView
android:id="@+id/Grid_imageview"
android:layout_width="150dp"
android:layout_height="150dp"
android:src="@color/black" />
</LinearLayout>
3) MainActivity2.java
package com.demo.temp;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.GridView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
public class MainActivity2 extends AppCompatActivity {
Button button;
GridView gridView;
private final int select_image_code = 0;
ArrayList<Uri> uriArrayList;
Gridview_Adapter gridview_adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
button = findViewById(R.id.BTN_select_image);
gridView = findViewById(R.id.img_gridview);
uriArrayList = new ArrayList<>();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Select_Image();
}
});
gridview_adapter = new Gridview_Adapter(uriArrayList);
gridView.setAdapter(gridview_adapter);
}
//select image
public void Select_Image() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE,select_image_code);
}
@Override
protected void onActivityResult(int requestCode,data);
if (requestCode == select_image_code && resultCode == RESULT_OK && data.getClipData() != null) {
int image_count = data.getClipData().getItemCount();
for (int i = 0; i < image_count; i++) {
uriArrayList.add(data.getClipData().getItemAt(i).getUri());
}
gridview_adapter.notifyDataSetChanged();
}
}
}
4) Gridview_Adapter.java
package com.demo.temp;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import java.util.ArrayList;
public class Gridview_Adapter extends BaseAdapter {
ArrayList<Uri> uriArrayList;
public Gridview_Adapter(ArrayList<Uri> uriArrayList) {
this.uriArrayList = uriArrayList;
}
@Override
public int getCount() {
return uriArrayList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position,View convertView,ViewGroup parent) {
if (convertView == null){
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.gridview_adapter,parent,false);
ImageView imageView = convertView.findViewById(R.id.Grid_imageview);
imageView.setImageURI(uriArrayList.get(position));
}
return convertView;
}
}