У меня есть вопрос, касающийся приложения галереи / тегов изображений, которое я создаю для курса.
Мое приложение представляет собой приложение для создания галереи / тегов. Он начинается с отображения сетки, в которой отображаются эскизы всех изображений телефонов, хранящихся на SD-карте.
Проблема, с которой я сталкиваюсь, заключается в следующем:
Gridview -> пользователь нажимает на картинку -> полный просмотр изображения -> пользователь нажимает обратно -> вернуться к просмотру сетки
поэтому после возврата к виду сетки при прокрутке блоки миниатюр, которые не находятся в прямом просмотре, удаляются, однако объекты все еще там и доступны для щелчка, но миниатюра не видна.
надеюсь получить помощь в этом: D
public class App2Activity extends Activity {
/** Called when the activity is first created. */
static Cursor cursor;
static int columnIndex;
static Bitmap bMap;
static String imagePath;
protected static ContentResolver cr;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String[] projection = {MediaStore.Images.Thumbnails._ID}; //Columns to return
cursor = managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, projection, null, null, MediaStore.Images.Thumbnails.IMAGE_ID);//Puts selected columns in cursor object
columnIndex = cursor.getColumnIndex(MediaStore.Images.Thumbnails._ID);//return columns index
GridView imagesview = (GridView) findViewById(R.id.gridView1);
imagesview.setAdapter(new ImageAdapter(this));
//Method litsens for thumbnail that is clicked and then loads the full image bit map
imagesview.setOnItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> parent, View v, int position, long id){
String[] projection = {MediaStore.Images.Media.DATA};
//This segment fetches selected image path
cursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null, null, null);
columnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
cursor.moveToPosition(position);
imagePath = cursor.getString(columnIndex);
Intent intent = new Intent(v.getContext(), Fullview.class);
FileInputStream in;
BufferedInputStream buf;
try {
in = new FileInputStream(imagePath);
buf = new BufferedInputStream(in);
bMap = BitmapFactory.decodeStream(buf);
startActivity(intent);//Start fullviewclass to project bitmap in fullscreen
if (in != null) {
in.close();
}
if (buf != null) {
buf.close();
}
} catch (Exception e) {
Log.e("Error reading file", e.toString());
}
}
});
}
//Inflates menu when button is pressed
public boolean onCreateOptionsMenu(Menu menu){
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.exitmenu, menu);
return true;
}
//handles the exit menu button
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
case R.id.exit:
finish();
default:
return super.onOptionsItemSelected(item);
}
}
}
class ImageAdapter extends BaseAdapter{
private Context context;
public ImageAdapter(Context cont){
context = cont;
}
@Override
public int getCount() {
return App2Activity.cursor.getCount();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView iv;
// this segment sets up the gridview
if(convertView == null){
iv = new ImageView(context);
iv.setScaleType(ImageView.ScaleType.CENTER_CROP);
iv.setPadding(4, 4, 4, 4);
iv.setLayoutParams(new GridView.LayoutParams(120, 120));
}
else {
iv = (ImageView)convertView;
}
//fetches thumbnails
App2Activity.cursor.moveToPosition(position);
int imageID = App2Activity.cursor.getInt(App2Activity.columnIndex);
iv.setImageURI(Uri.withAppendedPath(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, "" + imageID));
return iv;
}
}
public class Fullview extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fullview);
ImageView iv = (ImageView)findViewById(R.id.imageView1);
iv.setImageBitmap(App2Activity.bMap);
}
//Inflates menu when button is pressed
public boolean onCreateOptionsMenu(Menu menu){
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}
//Handles menu options
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
case R.id.back:
finish();
case R.id.Tag:
Intent intent = new Intent(getApplicationContext(), ContactsDisplay.class);
startActivityForResult(intent, 0);
return true;
case R.id.tagged:
Intent intent2 = new Intent(getApplicationContext(), TaggedViewer.class);
startActivity(intent2);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
//Gets the result Uri from choosing a contact after having pressed menu option "Tag" and saves pic/contact combination to internal storage
protected void onActivityResult(int requestCode, int resultCode, Intent data){
if(resultCode == RESULT_OK){
if(requestCode == 0){
//This segment saves the tagged contact uri and hashes the associated imagepath name which become filename internal storage file
Uri result = data.getData();
String toBeStored = result.toString();
Log.w("GOT", result.toString());
int filehash = App2Activity.imagePath.hashCode();
String strfilehash = String.valueOf(filehash);
try {
FileOutputStream fos = openFileOutput(strfilehash, MODE_PRIVATE);
fos.write(toBeStored.getBytes());
fos.close();
} catch (FileNotFoundException e) {
Log.w("FileWrite", "FileError");
} catch (IOException e) {
Log.w("FileWrite", "WriteError");
}
}
}
Перед изображением ошибки
так вот как выглядит вид до появления ошибки. Все картинки есть, и затем после возвращения из fullview и некоторой прокрутки позже, возникает ошибка, и представление выглядит как на рисунке ниже. Примечание: он сохраняет все изображения, которые были видны все время, а также объекты, миниатюры которых исчезли, они по-прежнему кликабельны.
После ошибки картинка
Logcat говорит об этом, когда пытается вернуть одно из изображений, которое должно вернуться в вид:
Невозможно открыть контент: content: // media / external / images / thumbnails / 0
java.io.FileNotFoundException: нет записи для содержимого: // media / external / images / thumbnails / 0
а затем некоторые дополнительные вещи и, наконец,:
resolUri обнаружил неверное растровое изображение uri: content: // media / external / images / thumbnails / 0
Так что каким-то образом класс адаптера изображения не может найти никаких миниатюр для изображений, которые должны вернуться к текущему виду.
я бы включил изображение всей этой записи logcat, но в настоящее время я не могу публиковать более 2 ссылок:)
Надеюсь, это вся информация, которая вам нужна :)
буду рад любой помощи, которую я могу получить!