2016-02-25 2 views
0

Я пытаюсь научиться создавать приложение-генератор мем. Сначала у меня была проблема с сбоем моего приложения, когда я нажал на изображения в виде сетки, поскольку изображения были слишком большими. Мне было рекомендовано использовать идентификатор изображения для передачи изображения во вторую активность. Я (думал, я) изменил код соответственно. Теперь, когда вы нажимаете на изображение, я могу видеть следующее действие с вводом верхних и нижних текстовых параметров, но неподвижное изображение не появляется. Я знаю, проблема в том, как я передаю идентификатор изображения, но не знаю, что. Надеюсь, вы можете дать мне конкретный код, поскольку я очень новичок в программировании.Как передать изображение, используя Идентификатор изображения в намерении различной активности?

Я знаю, что использование uri также является вариантом, но, будучи новичком, я не уверен, как я мог бы выполнить это здесь. Если вы считаете, что это лучше (с точки зрения скорости использования приложений и памяти/их легче освоить и выполнить), вы были бы любезны, чтобы помочь мне с кодом тоже.

Спасибо заранее!

Вот мой код:

Главная Activity.java

package com.javatechig.gridviewexample; 

import android.content.Intent; 
import android.content.res.TypedArray; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.GridView; 

import java.util.ArrayList; 

public class MainActivity extends ActionBarActivity { 
    private GridView gridView; 
    private GridViewAdapter gridAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     gridView = (GridView) findViewById(R.id.gridView); 
     gridAdapter = new GridViewAdapter(this, R.layout.grid_item_layout, getData()); 
     gridView.setAdapter(gridAdapter); 

     gridView.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
       ImageItem item = (ImageItem) parent.getItemAtPosition(position); 

       //Create intent 
       Intent intent = new Intent(MainActivity.this, DetailsActivity.class); 
       intent.putExtra("id", item.getId()); 

       //Start details activity 
       startActivity(intent); 
      } 
     }); 
    } 

    /** 
    * Prepare some dummy data for gridview 
    */ 
    private ArrayList<ImageItem> getData() { 
     final ArrayList<ImageItem> imageItems = new ArrayList<>(); 
     TypedArray imgs = getResources().obtainTypedArray(R.array.image_ids); 
     for (int i = 0; i < imgs.length(); i++) { 
      Bitmap bitmap = BitmapFactory.decodeResource(getResources(), imgs.getResourceId(i, -1)); 
      imageItems.add(new ImageItem(bitmap, R.array.image_ids)); 
     } 
     return imageItems; 
    } 
} 

DetailsActivity.java

package com.javatechig.gridviewexample; 

import android.graphics.Bitmap; 
import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.widget.ImageView; 

public class DetailsActivity extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.details_activity); 

     //imageUri = Uri.parse(extras.getString("imageUri")); 
     Bitmap bitmap = getIntent().getParcelableExtra("id"); 

     ImageView imageView = (ImageView) findViewById(R.id.image); 
     imageView.setImageBitmap(bitmap); 
    } 
} 

ImageItem.java

package com.javatechig.gridviewexample; 

import android.graphics.Bitmap; 

public class ImageItem { 
    private Bitmap image; 
    private int id; 

    public ImageItem(Bitmap image, int id) { 
     super(); 
     this.image = image; 
     this.id = id; 
    } 

    public Bitmap getImage() { 
     return image; 
    } 

    public void setImage(Bitmap image) { 
     this.image = image; 
    } 


    public int getId(){ 
     return id; 
    } 

    public void setId(int id){ 
     this.id = id; 
    } 

} 

GridViewAdapter.java

package com.javatechig.gridviewexample; 

import android.app.Activity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 

import java.util.ArrayList; 

public class GridViewAdapter extends ArrayAdapter<ImageItem> { 

    private Context context; 
    private int layoutResourceId; 
    private ArrayList<ImageItem> data = new ArrayList<ImageItem>(); 

    public GridViewAdapter(Context context, int layoutResourceId, ArrayList<ImageItem> data) { 
     super(context, layoutResourceId, data); 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.data = data; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     ViewHolder holder; 

     if (row == null) { 
      LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 
      holder = new ViewHolder(); 
      holder.image = (ImageView) row.findViewById(R.id.image); 
      row.setTag(holder); 
     } else { 
      holder = (ViewHolder) row.getTag(); 
     } 


     ImageItem item = data.get(position); 
     holder.image.setImageBitmap(item.getImage()); 
     return row; 
    } 

    static class ViewHolder { 
     ImageView image; 
    } 
} 
+0

Вы просто передавая поле идентификатора через намерение и вы не сохраняя объект в любом месте, чтобы получить ссылку на него. – chRyNaN

+0

@chRyNaN: Я хотел бы попробовать ваше предложение. Проблема только в том, что я просто начинающий программировать. В любом случае, вы можете дать мне несколько строк кода и начать меня? Заранее спасибо. –

ответ

0

Есть несколько проблем с кодом. Для начала вы получаете свои изображения из ресурсов, но когда вы создаете новый ImageItem и добавляете его в ArrayList, вы не передаете идентификатор отдельного ресурса. Вот соответствующая часть вашего метода GetData():

TypedArray imgs = getResources().obtainTypedArray(R.array.image_ids); 
for (int i = 0; i < imgs.length(); i++) { 
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), imgs.getResourceId(i, -1)); 
    //Here you are putting in the generic R.array.image_ids 
    //Instead you should put in the images specific id: imgs.getResourceId(i, -1)); 
    imageItems.add(new ImageItem(bitmap, R.array.image_ids)); 
} 

Далее, вы неправильно прохождение и получение данных между различными видами деятельности. Вот ваш соответствующий код:

Intent intent = new Intent(MainActivity.this, DetailsActivity.class); 
intent.putExtra("id", item.getId()); //You are putting in an int extra 

... 

//You are attempting to retrieve a Parcelable extra even though you only 
//passed in an int 
Bitmap bitmap = getIntent().getParcelableExtra("id"); 

И, наконец, я хочу, чтобы было ясно, что вы не хранить эти ImageItems в любом месте, таким образом, вы не смогли бы получить правильный ImageItem с идентификатором, чтобы получить изображение ,

Итак, какое решение?

Как вы знаете, растровые изображения могут быть довольно большими, а передача их между действиями - это не лучший подход, так как при этом может быть много проблем. Один из способов обойти это - хранить их в Файле и извлекать тот же самый Файл в другой Деятельности. К счастью, все битмапы, которые вам нужны, уже хранятся в ваших ресурсах, поэтому вы можете просто получить их оттуда.

Во-первых, исправить свой метод GetData():

private ArrayList<ImageItem> getData() { 
    final ArrayList<ImageItem> imageItems = new ArrayList<>(); 
    TypedArray imgs = getResources().obtainTypedArray(R.array.image_ids); 
    try{ 
     for (int i = 0; i < imgs.length(); i++) { 
      Bitmap bitmap = BitmapFactory.decodeResource(getResources(), imgs.getResourceId(i, -1)); 
      imageItems.add(new ImageItem(bitmap, imgs.getResourceId(i, -1))); 
     } 
    }finally{ 
     imgs.recycle(); //When done recycle your TypedArray 
    } 
    return imageItems; 
} 

Тогда ваш метод OnCreate() в DetailsActivity:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.details_activity); 

    Intent intent = getIntent(); 
    int id = intent.getIntExtra("id", -1); 
    if(id != -1){ 
     //We have the resource ID so we can retreive the item 
     Bitmap bitmap = BitmapFactory.decodeResource(getResources(), id); 
     ImageView imageView = (ImageView) findViewById(R.id.image); 
     imageView.setImageBitmap(bitmap); 
    }else{ 
     //We don't have the resource ID so show default View or perform task 
    } 
} 
+0

Большое спасибо! Вы очень помогли. Вы ушли от вас, чтобы написать для меня такой подробный ответ. Я благодарен. –

+0

@Pinkesh S, я рад, что это помогло. Если он решит вашу проблему, обязательно примите ответ и рассмотрите вопрос о голосовании. – chRyNaN

+1

Только что принял ответ. Пока еще нет репутации до +1. Но хорошо по дороге туда с помощью таких людей, как ты. Обязательно вернитесь к +1, если вы имеете право. Еще раз спасибо. –

0

item.getId() - уникальный идентификатор в памяти, а не идентификатор ресурса изображения, вы должны использовать идентификатор ресурса. Простой способ, вы можете установить идентификатор ресурса в качестве идентификатора изображения в setgetData().

+0

Эй, спасибо за ваш быстрый ответ. Я пробовал, но не могу найти никаких указаний о том, как я могу делать то, что вы предложили здесь. Просто чтобы вы знали, я просто начинающий программировать. Возможно ли вам дать мне дополнительную помощь и предоставить мне код? Заранее спасибо. –