将 gridview 中的图像打开到新 activity
opening an image from a gridview into a new activity
我创建了一个网格视图来显示来自 SD 卡中特定文件夹的图像。我能够获得项目位置,但不幸的是,我面临以全屏图像显示所选图像的问题 activity。我认为使用其位置获取图像路径存在问题。非常感谢您的帮助。
这是网格视图Activity
public class print extends AppCompatActivity {
public class ImageAdapter extends BaseAdapter {
private Context mContext;
ArrayList<String> itemList = new ArrayList<String>();
public ImageAdapter(Context c) {
mContext = c;
}
void add(String path){
itemList.add(path);
}
@Override
public int getCount() {
return itemList.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) { // if it's not recycled, initialize some attributes
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(700, 1150));
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setPadding(1, 1, 1, 1);
} else {
imageView = (ImageView) convertView;
}
Bitmap bm = decodeSampledBitmapFromUri(itemList.get(position), 220, 220);
imageView.setImageBitmap(bm);
return imageView;
}
public Bitmap decodeSampledBitmapFromUri(String path, int reqWidth, int reqHeight) {
Bitmap bm = null;
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
bm = BitmapFactory.decodeFile(path, options);
return bm;
}
public int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
if (width > height) {
inSampleSize = Math.round((float)height / (float)reqHeight);
} else {
inSampleSize = Math.round((float)width / (float)reqWidth);
}
}
return inSampleSize;
}
}
ImageAdapter myImageAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
setContentView(R.layout.activity_print);
GridView gridView = (GridView) findViewById(R.id.gridView);
myImageAdapter = new ImageAdapter(this);
gridView.setAdapter(myImageAdapter);
String ExternalStorageDirectoryPath = Environment
.getExternalStorageDirectory()
.getAbsolutePath();
String targetPath = ExternalStorageDirectoryPath + "/sdfolder/";
File targetDirector = new File(targetPath);
File[] files = targetDirector.listFiles();
for (File file : files){
myImageAdapter.add(file.getAbsolutePath());
}
gridView.setOnItemClickListener(myOnItemClickListener);
}
AdapterView.OnItemClickListener myOnItemClickListener
= new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// String prompt = (String)parent.getItemAtPosition(position).toString();
Intent i = new Intent(print.this, DetailsActivity.class);
Toast.makeText(print.this, "Position " + position,
Toast.LENGTH_SHORT).show();
i.putExtra("id", id);
startActivity(i);
}};
}
这是全屏Activity
public class DetailsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.details_activity);
// Get position from intent passed from MainActivity.java
Intent i = getIntent();
int position = i.getExtras().getInt("id");
// Open the Image adapter
// Locate the ImageView in single_item_view.xml
ImageView imageView = (ImageView) findViewById(R.id.image);
// Get image and position from ImageAdapter.java and set into ImageView
imageView.setImageResource(position);
}
}
你需要你的 ArrayList<String> itemList
在你的第二个 activity 中,然后做这样的事情:
public class DetailsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.details_activity);
Intent i = getIntent();
int position = i.getExtras().getInt("id");
ImageView imageView = (ImageView) findViewById(R.id.image);
Bitmap bm = decodeSampledBitmapFromUri(itemList.get(position), 220, 220);
ImageView imageView.setImageBitmap(bm);
}
}
或者您可以将图像 URI 发送到下一个 activity 并像这样使用它:
public class DetailsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.details_activity);
Intent i = getIntent();
String imageUri = i.getExtras().getString("uri");
ImageView imageView = (ImageView) findViewById(R.id.image);
Bitmap bm = decodeSampledBitmapFromUri(imageUri, 220, 220);
ImageView imageView.setImageBitmap(bm);
}
}
您传递给 ImageView.setImageResource() 的整数需要是有效的可绘制资源 ID。您实际传递给详细信息 activity 的是特定于适配器的项目 ID,而且根据您的代码,在您的情况下它始终为 0:
// ...
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
// ...
解决方案:如果只需要显示图片,直接将图片URI传给详情即可activity:
GridViewActivity.java
Intent intent = new Intent(print.this, DetailsActivity.class);
intent.putExtra("uri", myImageAdapter.itemList.get(position));
startActivity(intent);
DetailsActivity.java
// ...
setContentView(R.layout.details_activity);
// Get position from intent passed from MainActivity.java
Intent intent = getIntent();
String imageUri = intent.getExtras().getString("uri");
Bitmap image = ...; // load the full size image using the imageUri
ImageView imageView.setImageBitmap(image);
您的活动之间无需共享列表。
我创建了一个网格视图来显示来自 SD 卡中特定文件夹的图像。我能够获得项目位置,但不幸的是,我面临以全屏图像显示所选图像的问题 activity。我认为使用其位置获取图像路径存在问题。非常感谢您的帮助。
这是网格视图Activity
public class print extends AppCompatActivity {
public class ImageAdapter extends BaseAdapter {
private Context mContext;
ArrayList<String> itemList = new ArrayList<String>();
public ImageAdapter(Context c) {
mContext = c;
}
void add(String path){
itemList.add(path);
}
@Override
public int getCount() {
return itemList.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) { // if it's not recycled, initialize some attributes
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(700, 1150));
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setPadding(1, 1, 1, 1);
} else {
imageView = (ImageView) convertView;
}
Bitmap bm = decodeSampledBitmapFromUri(itemList.get(position), 220, 220);
imageView.setImageBitmap(bm);
return imageView;
}
public Bitmap decodeSampledBitmapFromUri(String path, int reqWidth, int reqHeight) {
Bitmap bm = null;
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
bm = BitmapFactory.decodeFile(path, options);
return bm;
}
public int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
if (width > height) {
inSampleSize = Math.round((float)height / (float)reqHeight);
} else {
inSampleSize = Math.round((float)width / (float)reqWidth);
}
}
return inSampleSize;
}
}
ImageAdapter myImageAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
setContentView(R.layout.activity_print);
GridView gridView = (GridView) findViewById(R.id.gridView);
myImageAdapter = new ImageAdapter(this);
gridView.setAdapter(myImageAdapter);
String ExternalStorageDirectoryPath = Environment
.getExternalStorageDirectory()
.getAbsolutePath();
String targetPath = ExternalStorageDirectoryPath + "/sdfolder/";
File targetDirector = new File(targetPath);
File[] files = targetDirector.listFiles();
for (File file : files){
myImageAdapter.add(file.getAbsolutePath());
}
gridView.setOnItemClickListener(myOnItemClickListener);
}
AdapterView.OnItemClickListener myOnItemClickListener
= new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// String prompt = (String)parent.getItemAtPosition(position).toString();
Intent i = new Intent(print.this, DetailsActivity.class);
Toast.makeText(print.this, "Position " + position,
Toast.LENGTH_SHORT).show();
i.putExtra("id", id);
startActivity(i);
}};
}
这是全屏Activity
public class DetailsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.details_activity);
// Get position from intent passed from MainActivity.java
Intent i = getIntent();
int position = i.getExtras().getInt("id");
// Open the Image adapter
// Locate the ImageView in single_item_view.xml
ImageView imageView = (ImageView) findViewById(R.id.image);
// Get image and position from ImageAdapter.java and set into ImageView
imageView.setImageResource(position);
}
}
你需要你的 ArrayList<String> itemList
在你的第二个 activity 中,然后做这样的事情:
public class DetailsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.details_activity);
Intent i = getIntent();
int position = i.getExtras().getInt("id");
ImageView imageView = (ImageView) findViewById(R.id.image);
Bitmap bm = decodeSampledBitmapFromUri(itemList.get(position), 220, 220);
ImageView imageView.setImageBitmap(bm);
}
}
或者您可以将图像 URI 发送到下一个 activity 并像这样使用它:
public class DetailsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.details_activity);
Intent i = getIntent();
String imageUri = i.getExtras().getString("uri");
ImageView imageView = (ImageView) findViewById(R.id.image);
Bitmap bm = decodeSampledBitmapFromUri(imageUri, 220, 220);
ImageView imageView.setImageBitmap(bm);
}
}
您传递给 ImageView.setImageResource() 的整数需要是有效的可绘制资源 ID。您实际传递给详细信息 activity 的是特定于适配器的项目 ID,而且根据您的代码,在您的情况下它始终为 0:
// ...
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
// ...
解决方案:如果只需要显示图片,直接将图片URI传给详情即可activity:
GridViewActivity.java
Intent intent = new Intent(print.this, DetailsActivity.class);
intent.putExtra("uri", myImageAdapter.itemList.get(position));
startActivity(intent);
DetailsActivity.java
// ...
setContentView(R.layout.details_activity);
// Get position from intent passed from MainActivity.java
Intent intent = getIntent();
String imageUri = intent.getExtras().getString("uri");
Bitmap image = ...; // load the full size image using the imageUri
ImageView imageView.setImageBitmap(image);
您的活动之间无需共享列表。