从ViewPager获取当前视图

时间:2016-04-19 20:01:02

标签: android android-viewpager

我试图通过 Viewpager.findViewWithTag 从ViewPager获取当前页面视图。当尝试从ViewPager获取当前视图时,它返回Null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.viewpager_main);
    Bundle bundle = getIntent().getExtras();
    chapter = bundle.getInt("chapter");


    ViewPagerAdapter adapter = new ViewPagerAdapter(this, chapter);
    pager = (ViewPager) findViewById(R.id.pager);
    pager.setAdapter(adapter);

    View myView = pager.findViewWithTag(pager.getCurrentItem());

...这里是我的ViewPageAdapter

 @Override
public Object instantiateItem(ViewGroup container, int position) {
    LayoutInflater inflater;
    if(position != 10){
            inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     itemView = inflater.inflate(R.layout.viewpager_item, container,
            false);
      itemView.setTag(position);

    } else {
        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         itemView = inflater.inflate(R.layout.results, container,
                false);
    }
    container.addView(itemView);
    return itemView ;
}

这里是viewpager_main.xml

<?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.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
</RelativeLayout>

和这里的viewpager_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:gravity="center_horizontal" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:background="#fff"
        android:scaleType="fitCenter"
        />
</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:gravity="center_horizontal">

    <Button
        android:id="@+id/Button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:tag="1"
        android:text="1" />

    <Button
        android:id="@+id/Button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:tag="2"
        android:text="2" />

    <Button
        android:id="@+id/Button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:tag="3"
        android:text="3" />

</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal" >

    <Button
        android:id="@+id/Button4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:tag="4"
        android:text="4" />

    <Button
        android:id="@+id/Button5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:tag="5"
        android:text="5" />
</LinearLayout>

我不知道我在哪里犯了错误但无法修复它。感谢

3 个答案:

答案 0 :(得分:4)

你可以尝试这样的事情 -

@Override
public Object instantiateItem(ViewGroup container, int position) {
    LayoutInflater inflater;
    if(position != 10){
            inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     itemView = inflater.inflate(R.layout.viewpager_item, container,
            false);
      itemView.setTag("View"+position);

    } else {
        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         itemView = inflater.inflate(R.layout.results, container,
                false);
    }
    container.addView(itemView);
    return itemView ;
}

当您需要当前视图时 -

View myView = pager.findViewWithTag("View"+pager.getCurrentItem());

答案 1 :(得分:1)

这里的问题是,您通过

设置PagerAdapter后立即调用pager.getCurrentItem()。
pager.setAdapter(adapter);

不一定必须立即创建页面。那就是在调用

之后调用PageAdapter.instantiateItem。
View myView = pager.findViewWithTag(pager.getCurrentItem());

如果在创建视图后立即需要该视图,则只需在适配器中执行所需的操作,否则,如果在诸如OnPageChangeListener.onPageSelected之类的侦听器中调用,则您的调用应该可以工作。

答案 2 :(得分:0)

您应该使用字符串作为标记。 每次要使用int作为标记时,都可以使用String.valueOf(yourPosition);

至于文件: 为此视图提供包含String的标记,稍后将使用View.getTag()检索或使用View.findViewWithTag()搜索。通常最好使用ID(通过android:id属性)而不是标签,因为它们更快并允许编译时类型检查。

必须是字符串值,使用'\;'转义unicode字符的'\ n'或'\ uxxxx'等字符。

http://developer.android.com/reference/android/view/View.html#attr_android%3atag