2011-11-01 65 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前