Android viewpager......如何获取视图?

Posted

技术标签:

【中文标题】Android viewpager......如何获取视图?【英文标题】:Android viewpager......how to get a hold of the views? 【发布时间】:2012-02-15 06:17:45 【问题描述】:

我可以通过网络上的各种示例使用 viewpager 构建活动,但我可以不再使用原始活动中的视图吗?举个例子:

public class SimpleViewPagerActivity extends Activity 

    LinearLayout thisIsWhatBreaks;

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

            MyPagerAdapter adapter = new MyPagerAdapter();
            ViewPager myPager = (ViewPager) findViewById(R.id.myfivepanelpager);
            myPager.setAdapter(adapter);
            myPager.setCurrentItem(2);

            thisIsWhatBreaks = (LinearLayout)findViewById(R.id.layoutThatsAlwaysNull);

    


    @Override
    public void onConfigurationChanged(Configuration newConfig) 
        super.onConfigurationChanged(newConfig);

        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) 

            thisIsWhatBreaks.setBackgroundColor(Color.BLACK);

        
        else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
            thisIsWhatBreaks.setBackgroundColor(Color.RED);
           
    


    public void farLeftButtonClick(View v)
    
            Toast.makeText(this, "Far Left Button Clicked", Toast.LENGTH_SHORT).show(); 

    

    public void farRightButtonClick(View v)
    
            Toast.makeText(this, "Far Right Elephant Button Clicked", Toast.LENGTH_SHORT).show(); 

    

    private class MyPagerAdapter extends PagerAdapter 

            public int getCount() 
                    return 5;
            

            public Object instantiateItem(View collection, int position) 

                    LayoutInflater inflater = (LayoutInflater) collection.getContext()
                                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

                    int resId = 0;
                    switch (position) 
                    case 0:
                            resId = R.layout.farleft;
                            break;
                    case 1:
                            resId = R.layout.left;
                            break;
                    case 2:
                            resId = R.layout.middle;
                            break;
                    case 3:
                            resId = R.layout.right;
                            break;
                    case 4:
                            resId = R.layout.farright;
                            break;
                    

                    View view = inflater.inflate(resId, null);

                    ((ViewPager) collection).addView(view, 0);

                    return view;
            

            @Override
            public void destroyItem(View arg0, int arg1, Object arg2) 
                    ((ViewPager) arg0).removeView((View) arg2);

            

            @Override
            public void finishUpdate(View arg0) 
                    // TODO Auto-generated method stub

            

            @Override
            public boolean isViewFromObject(View arg0, Object arg1) 
                    return arg0 == ((View) arg1);

            

            @Override
            public void restoreState(Parcelable arg0, ClassLoader arg1) 
                    // TODO Auto-generated method stub

            

            @Override
            public Parcelable saveState() 
                    // TODO Auto-generated method stub
                    return null;
            

            @Override
            public void startUpdate(View arg0) 
                    // TODO Auto-generated method stub

            

    


我最初在 main.xml 中拥有 thisIsWhatBreaks LinearLayout,但现在已将其移至 farleft.xml,这是 PagerAdapter 中膨胀的布局之一。

因此,我不能再使用 LinearLayout thisIsWhatBreaks = (LinearLayout)findViewById(R.id.layoutThatsAlwaysNull); 为 LinearLayout 赋值。我在哪里以及如何做到这一点?

我怎样才能再次为 LinearLayout 赋值,以便可以在 OnConfurationChanged() 方法中对其进行修改,如此活动类中所示?现在我已经将大部分视图从 main.xml 移动到 farleft.xml 并且似乎无法找到一种方法来完成这项工作,因此我在我的活动中不断收到 nullpointerexceptions。

【问题讨论】:

【参考方案1】:

在您的 ViewPager 上,有一个名为 getCurrentItem() 的方法将返回当前活动视图在 ViewPager 中的位置。

现在,制作您自己的 ViewPagerAdapter,制作视图列表,覆盖 instantiateItem(pagerView, position),将视图添加到 pagerView 并根据请求的位置从列表中返回视图。

然后,您创建一个名为getView(int) 的方法,它将根据您从getCurrentItem() 获得的位置为您提供视图。

最后,您现在可以致电currentView.findViewById()

另外,不要忘记覆盖 destroyItem(),您从 PagerView 中删除视图。

我认为没有更简单的方法可以做到这一点,因为他们似乎根本没有提供任何getView(), 方法,所以你基本上必须自己做一个。但相比之下,您现在也可以很好地控制自己的视图。

【讨论】:

【参考方案2】:

我需要做的就是移动:

thisIsWhatBreaks = (LinearLayout)findViewById(R.id.layoutThatsAlwaysNull);

对于在 PagerAdapter 的 instantiateItem() 中膨胀当前 layout.xml 的情况。

我对 nullpointerexceptions 的问题是我的所有视图都在 onCreate() 中执行。我不得不将所有视图从 onCreate() 移动到 instanceiteItem() 内的 case 语句;

请参阅下面的更正代码....以防万一其他人遇到此问题....

public class SimpleViewPagerActivity extends Activity 

LinearLayout thisIsWhatBreaks;

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

        MyPagerAdapter adapter = new MyPagerAdapter();
        ViewPager myPager = (ViewPager) findViewById(R.id.myfivepanelpager);
        myPager.setAdapter(adapter);
        myPager.setCurrentItem(2);

        //REMOVE THE LINEAR LAYOUT FROM BEING INSTANTIATED HERE!




@Override
public void onConfigurationChanged(Configuration newConfig) 
    super.onConfigurationChanged(newConfig);

    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) 

        thisIsWhatBreaks.setBackgroundColor(Color.BLACK);

    
    else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
        thisIsWhatBreaks.setBackgroundColor(Color.RED);
       



private class MyPagerAdapter extends PagerAdapter 

        public int getCount() 
                return 5;
        

        public Object instantiateItem(View collection, int position) 

          view = new View(MainHome.this);

          final LayoutInflater inflater = (LayoutInflater) MainHome.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

          switch(position)

          case 0 : 
                    view = inflater.inflate(R.layout.farleft, null);
                    thisIsWhatBreaks= (LinearLayout)v.findViewById(R.id.layoutThatUsedToAlwaysBeNull);

                     ***Now you can modify thisIsWhatBreaks***
                    thisIsWhatBreaks.setBackgroundColor(Color.black);

              break;

          case 1: 

                    view = inflater.inflate(R.layout.farright, null);


              break;

          default :

              break;    
          

         ((ViewPager) collection).addView(v,0);
         return v;  

        

        @Override
        public void destroyItem(View arg0, int arg1, Object arg2) 
                ((ViewPager) arg0).removeView((View) arg2);

        

        @Override
        public void finishUpdate(View arg0) 
                // TODO Auto-generated method stub

        

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) 
                return arg0 == ((View) arg1);

        

        @Override
        public void restoreState(Parcelable arg0, ClassLoader arg1) 
                // TODO Auto-generated method stub

        

        @Override
        public Parcelable saveState() 
                // TODO Auto-generated method stub
                return null;
        

        @Override
        public void startUpdate(View arg0) 
                // TODO Auto-generated method stub

        

    


【讨论】:

以上是关于Android viewpager......如何获取视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中向 ViewPager 添加进度条

android ViewPager+Fragment 如何在ViewPager的Activity中获取Fragment中的控件对象

如何使用 viewpager(android) 创建动态选项卡?

android viewpager如何动态添加页面?

如何在Android中使用viewPagerindicator和ViewPager?

如何在 android 中设置 ViewPage 及其适配器?