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) 创建动态选项卡?