2011-11-01 82 views
8
public class HSPTabletTestActivity extends Activity { 
private class MyPagerAdapter extends PagerAdapter { 

    public int getCount() { 
     return 2; 
    } 

    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.lighttab; 
      break; 
     case 1: 
      resId = R.layout.securitytab; 
      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 

    } 

} 

我有这样的代码在那里^^ ......相当多的直接从http://mobile.tutsplus.com/tutorials/android/android-user-interface-design-horizontal-view-paging/采取......我仍然在android系统的研究与开发的世界很新:/的Android ViewPager findViewById不工作 - 始终返回null

现在我试图访问一个微调控制和“页面”内的一些按钮。但findViewById不断返回null!

我记得一些关于布局的东西在代码中并不存在,必须先充气,这是在instantiateItem()函数中发生的。它很明显是进入“视图”变量。但是当我调用 view.findViewById(R.id.light1_off);

这是一个按钮,它总是返回零! 我甚至确定只有当它实际上正在加载页面时才会调用它。但是不管我做了什么,它总是返回一个空值,并且我得到一个讨厌的空指针异常。

有人可以帮我一下吗?我几乎没有想法,谷歌也没有任何帮助,已经在第5页提供了大约10种不同的搜索条件。

回答

21

在经历了很多挫折之后,我把头发拉出来解决了这个问题,我解决了它!至少对于我来说。假设你像我一样使用了tutsplus教程,那么你的屏幕就有单独的XML文件。现在,我认为这些布局XML包含其中的布局(即LinearLayout,RelativeLayout等)。现在,这些布局包含您的按钮和其他小部件。你所要做的是能够findViewById是,在instatiateItem方法的实际switch语句,以这种方式初始化按钮:

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.lighttab; 
     View view = inflater.inflate(resId, null); 
     RelativeLayout layout=(RelativeLayout)view.findViewById(R.id.relLayout); 
     Button button=(Button)layout.findViewById(R.id.button); 
     ((ViewPager) collection).addView(view, 0); 
     return view; 
    case 1: 
     resId = R.layout.securitytab; 
     ... 
     ... 
     return view; 
    } 
} 

所以......首先你要膨胀的观点,然后初始化通过转换布局类型(RelativeLayout)并调用.findViewById(资源ID)来维持视图内的布局。然后,通过执行相同的操作初始化您正在查找的实际窗口小部件,然后投射窗口小部件类型(Button)并调用.findViewById(资源ID)。

这对我有用,所以我希望这可以为您节省一些麻烦!永远为我找出解决办法。

+4

良好的工作!这是一个非常令人沮丧的问题。 – Jackson

+1

真是太棒了!非常感谢 – swati

+2

我们如何从主要活动中实际访问Button? –

0

只是猜测,因为你不显示xml为虚的。你使用+ @ id。如果不是试试看。

0

你能避免这一切肮脏的工作只是增加的setContentView(R.layout.youlayout)findViewById前