0

我有一个显示带有不同图像的网格视图的活动。单击其中一个图像时,我希望单击的图像成为另一个活动的背景图像。

我怎样才能做到这一点?

这是我显示网格视图的活动:

public class HelloGridViewActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    GridView gridView = (GridView) findViewById(R.id.gridview);

    // Instance of ImageAdapter Class
    gridView.setAdapter(new ImageAdapter(this));

    /**
     * On Click event for Single Gridview Item
     * */
    gridView.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {

//WHAT SHALL I PUT HERE????
    }
}
}
4

2 回答 2

2

因此,张贴者(最初)并没有明确指定是否在点击时立即打开其他活动,或者是否只需要记录点击项目的图像以供以后使用。第一个问题对我来说似乎更常见,因为GridView它显示了一组图像缩略图。用户点击它,就会出现一个只显示该项目信息的新活动。该缩略图可能会全屏显示。无论如何,也许这不是发帖人的想法,但这是我的假设(可能有人最终会在考虑到这样一个用例的情况下找到这个答案)。

它也没有指定图像的存储方式,所以我会假设

  1. ImageAdapter图像是这个应用程序的捆绑资源
  2. 我们可以对ImageAdapter, 存储一些数据来解决这个问题

因此,我采用一个标准,并在 ImageView 的属性ImageAdapter中添加一行代码来记录每个 ImageView 的整数资源 ID 。tag有很多方法可以做到这一点,但这是我选择的方式。

public class ImageAdapter extends BaseAdapter {
   /* see code removed at 
       http://developer.android.com/resources/tutorials/views/hello-gridview.html 
    */

   // create a new ImageView for each item referenced by the Adapter
   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(85, 85));
         imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
         imageView.setPadding(8, 8, 8, 8);
      } else {
         imageView = (ImageView) convertView;
      }

      imageView.setImageResource(mThumbIds[position]);
      // here we record the resource id of the image, for easy access later
      imageView.setTag(mThumbIds[position]);
      return imageView;
   }

   // references to our images
   private Integer[] mThumbIds = {
         R.drawable.pic1, 
         R.drawable.pic2, 
         R.drawable.pic3, 
         R.drawable.pic4, 
         R.drawable.pic5 
   };
}

然后,当 Hello 活动单击了一个网格项目时,我检索图像的资源 id 并将其作为Intent额外的 (HelloGridViewActivity.java) 传递:

   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      GridView gridView = (GridView) findViewById(R.id.gridview);

      // Instance of ImageAdapter Class
      gridView.setAdapter(new ImageAdapter(this));

      final Context activity = this;

      gridView.setOnItemClickListener(new OnItemClickListener() {

         public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
            Object tag = v.getTag();
            if (tag instanceof Integer) {
               // we stored a reference to the thumbnail image in the ImageView's tag property
               Intent i = new Intent(activity, AnotherActivity.class);
               Integer resourceId = (Integer)tag;
               i.putExtra("backgroundImage", resourceId);
               startActivity(i);
            }
         }
      });
   }

最后,当新活动(AnotherActivity)打开时,我们额外检索该意图,并将其解码为整数资源 id,并将其设置为全屏背景图像ImageView(AnotherActivity.java):

   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      this.setContentView(R.layout.another);

      Intent i = getIntent();
      //String bgImage = i.getExtras().getString("backgroundImage");
      int resId = i.getExtras().getInt("backgroundImage");

      try {
         ImageView background = (ImageView) findViewById(R.id.bgImage);
         // Another alternative, if the intent extra stored the resource 'name',
         //   and not the integer resource id
         //Class<?> c = R.drawable.class;
         //background.setImageResource(c.getDeclaredField(bgImage).getInt(c));
         background.setImageResource(resId);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }

我还在上面显示了一些注释掉的代码,如果由于某种原因您需要传递图像资源的字符串名称,而不是整数资源代码。注释掉的代码会查找给定图像名称的资源 id。根据我的 ImageAdapter 中使用的资源名称,要传递的示例字符串名称可能是"pic1". 如果这样做,当然,调用 Activity (HelloGridViewActivity) 需要将 Intent extra 编码为字符串,而不是整数。

于 2012-05-28T23:37:55.680 回答
1

获取您想要作为 BG 的图像的资源 ID 并将其保存到首选项中。

    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
        saveImageId(position);
    }

private void saveImageId(int position) {
    int id = getImageId(); // get the R.drawable.* id of the image. You should be able to figure this out.
    Editor ed = PreferenceManager.getDefaultSharedPreferences(this).edit();
    ed.putInt("bg_image_id", id);
    ed.commit();
}

现在在您的其他活动中,您可以获得图像 ID:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
int id = prefs.getInt("bg_image_id", R.drawable.default_background); //Get image id, use default background if there isn't one.
LinearLayout mLayout = (LinearLayout) findViewById(R.id.background_layout);
mLayout.setBackgroundResource(id);

祝你好运

于 2012-05-28T22:37:12.857 回答