2011-11-01 30 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 

    } 

} 

ben ^^ ... Hemen hemen ... Hala android sürekli yenileme dünyasında oldukça yeni http://mobile.tutsplus.com/tutorials/android/android-user-interface-design-horizontal-view-paging/ doğrudan alınan orada bu kodu vardır:/Android ViewPager findViewById çalışmıyor - Her zaman dönen boş

Şimdi bir "spinner" kontrolüne ve "sayfalar" içindeki bazı butonlara erişmeye çalışıyorum. Ancak findViewById, null döndürüyor!

Düzen ile ilgili bir şeyin gerçekten kod içinde bulunmadığını hatırlıyorum ve ilk olarak şişirilmek zorunda kalıyor, bu da instantiateItem() işlevinde oluyor. Ve "view" değişkenine girdiği oldukça açık. Ama ben view.findViewById (R.id.light1_off) adını verdiğimde; Bu arada bir düğme olan

, her zaman SIFIR! Yalnızca, aslında bu sayfa yüklenirken çağrıldığından emin oldum. Ama ne yaptığımın bir önemi yok, her zaman bir boşa dönmeye devam ediyor ve kötü bir nullpointer istisnası alıyorum.

Birisi bana yardım edebilir mi? Oldukça fazla fikir sahibiyim ve Google yaklaşık 10 farklı arama terimiyle ilgili olarak 5. sayfaya gitmemiş.

cevap

21

Saçımı çok sıkmadan ve saçımı çekerek çözdüm, çözdüm! En azından benim için. Yaptığım gibi tutsplus eğitimini kullandığınızı varsayarak, ekranlarınız için ayrı XML dosyalarınız var. Şimdi, bu düzen XML'lerinin içinde düzenleri (yani, LinearLayout, RelativeLayout, vb.) Içerdiğini varsayalım. Şimdi, bu düzenler düğmenizi ve diğer widget'larınızı içerir. Ne var instatiateItem yönteminde fiili şalter açıklamada, bu şekilde düğmeye başlatmak edilir findViewById edebilmek için gerekenler:

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; 
    } 
} 

Öyleyse ... ilk görünümü şişirmek zorunda, o zaman başlatmak düzen, düzen türünü (RelativeLayout) ve .findViewById (kaynak kimliği) çağırarak görünümünde tutuldu. Ardından, aradığınız asıl parçayı aynı işlemi yaparak başlatırsınız, ancak widget türünü (Düğme) ve .findViewById (resource id) öğesini çağırırsınız.

Bu benim için çalıştı, bu yüzden umarım bu sizi bazı sorunlardan kurtarır! Benim için anladım.

+4

İyi çalışmalarını tüm bu kirli işi sadece ekleyerek setContentView (R.layout.youlayout) önleyebilirsiniz! Bu gerçekten sinir bozucu bir sorundu. – Jackson

+1

gerçekten harika iş! Çok teşekkürler – swati

+2

Düğmeye ana etkinlikten nasıl erişebiliriz? –

0

Yalnızca, şişirilmiş için xml göstermediğiniz gibi tahmin edin. + @ Kimliğini kullanıyor musunuz? Eğer bir deneyin değil.

0

Sen findViewById önce