【问题标题】:How to dynamically add image to a viewpager containing imageview?如何将图像动态添加到包含 imageview 的 viewpager?
【发布时间】:2014-01-08 20:41:46
【问题描述】:

我的 main_layout 中有一个 viewpager。视图分页器只包含一个由 RelativeLayout 包裹的 ImageView

我想要做的是,当用户点击一个按钮时,它会将图像添加到该特定的浏览器。

我在 stackoverflow 上找到了这个答案(我认为这与我的问题有关),但是我完全迷失了那个代码。

Dynamically Adding View to viewpager

到目前为止,这是我的代码:

MainActivity.Java

private PagerAdapter pAdapter;
private ViewPager photoPager;

...

pAdapter = new GalleryPagerAdapter(getApplicationContext());
photoPager.setAdapter(pAdapter);

GalleryPagerAdapter.java

public class GalleryPagerAdapter extends PagerAdapter{

    private final Context context;
    LayoutInflater inflater;
    private final int[] GalImages = new int[] {
        R.drawable.ic_launcher,
        R.drawable.ic_launcher,
        R.drawable.ic_launcher
    };

    public GalleryPagerAdapter(Context context){
        this.context=context;
    }

    @Override
    public int getCount() {
        return GalImages.length;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        ImageView imageView = new ImageView(context);
        int padding = 10;
        imageView.setPadding(padding, padding, padding, padding);
        imageView.setScaleType(ImageView.ScaleType.MATRIX);
        imageView.setImageResource(GalImages[position]);
        container.addView(imageView, 0);
        return imageView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((ImageView) object);
    }
}

这是我要动态添加的视图

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:padding="10dp" >
    <ImageView
        android:id="@+id/photo_thumb"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:background="#000000"
        android:scaleType="fitXY"
        android:padding="0dp" />
</RelativeLayout>

这是我的 ViewPager 所在的 MainActivity

MainActivity.xml
<LinearLayout
    android:id="@+id/bannerLayout"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="0.4"
    android:layout_margin="0dip"
    android:orientation="vertical">
    <android.support.v4.view.ViewPager
        android:id="@+id/photoPager"
        android:layout_width="fill_parent"
        android:layout_height="125dp"
        android:background="#4F4E4F"/>
</LinearLayout>

所以我的问题是如何改进我正在使用的代码,以便我可以动态地将新图像添加到我的 ViewPager

ps:在参考链接上(我坚信这与我的问题相关),我完全迷失了这一部分:

// Create an initial view to display; must be a subclass of FrameLayout.
FrameLayout v0 = (FrameLayout) inflater.inflate (R.layout.one_of_my_page_layouts, null);
pagerAdapter.addView (v0, 0);

什么是充气机??我应该把它初始化成什么?

我希望有人可以指导我。如果我听起来想在这里问多个问题,我很抱歉。

【问题讨论】:

  • 您要从 SD 卡中添加图片吗?
  • 是的,用户应该能够从他们的手机图库中浏览。
  • 好的,需要一些时间来为您制定答案。
  • 我会耐心等待.. :) 同时我会修补我遇到的那个参考链接。
  • 你扩展了 PageAdapter 但需要一个这个 startOnActivityResult() 方法

标签: android android-layout android-viewpager


【解决方案1】:

Inflater 用于从您的 xml 布局中创建 View 对象。

所以,如果你的 lauout R.layout.one_of_my_page_layouts:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:padding="10dp" >
    <ImageView
        android:id="@+id/photo_thumb"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:background="#000000"
        android:scaleType="fitXY"
        android:padding="0dp" />
</RelativeLayout>

Inflater 会做这样的事情(只是一个例子)

ImageView iv=new ImageView(context);
RelativeLayout rl=new RelativeLayout(context);
rl.add(iv)
return rl;

只需最少的代码,但 inflater 也会设置所有布局参数。

因此,与其像在instantiateItem 中那样动态创建视图,如果您有一个 xml,您可以简单地对其进行膨胀并获得一个类型视图的对象。

因此您可以将instantiateItem 更改为:

 public Object instantiateItem(ViewGroup container, int position) {
        RelativeLayout v0 = (RelativeLayout ) inflater.inflate (R.layout.one_of_my_page_layouts, null);

        ImageView imageView = vo.findViewById(R.id.photo_thumb);
        int padding = 10;
        imageView.setPadding(padding, padding, padding, padding);
        imageView.setScaleType(ImageView.ScaleType.MATRIX);
        imageView.setImageResource(GalImages[position]);
        container.addView(v0, 0);
        return v0;
    }

【讨论】:

  • ViewPager不能直接持有ImageView吗?当代码可以创建 ImageView 并将其添加到集合中时,为单个视图使用布局似乎过多。
猜你喜欢
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多