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

    } 

} 

mam ten kod tam ^^ ... Dość dużo pobierane bezpośrednio z http://mobile.tutsplus.com/tutorials/android/android-user-interface-design-horizontal-view-paging/ ... Nadal jestem całkiem nowy w świecie Androida developerski:/Android ViewPager findViewById nie działa - zawsze zwraca wartość null

Teraz próbuję uzyskać dostęp do pokrętła sterowania i niektórych przycisków wewnątrz "stron". Ale findViewById zwraca wartość zerową!

Pamiętam, że coś takiego w układzie nie istnieje naprawdę w kodzie i musi zostać najpierw napompowane, co dzieje się w funkcji instantiateItem(). I jest całkiem oczywiste, że przechodzi do zmiennej "widok". Ale kiedy zadzwonię pod numer view.findViewById (R.id.light1_off);

który jest przyciskiem przy okazji, zawsze zwraca ZERO! Nawet upewniłem się, że zadzwoniło tylko wtedy, gdy faktycznie ładowano tę stronę. Ale bez względu na to, co zrobiłem, zawsze zwracam wartość zerową i pojawia się nieprzyjemny wyjątek nullpointer.

Czy ktoś może mi pomóc? Nie mam żadnych pomysłów, a Google nie ma żadnej pomocy, już na stronie 5 na temat około 10 różnych wyszukiwanych słów.

Odpowiedz

21

Po wielu frustracjach i wyrywaniu włosów z tego problemu rozwiązałem go! Przynajmniej dla mnie. Zakładając, że użyłeś samouczka tutsplus tak jak ja, masz oddzielne pliki XML dla swoich ekranów. Teraz zakładam, że te pliki XML zawierają układy w nich (np. LinearLayout, RelativeLayout itp.). Teraz te układy zawierają przycisk i inne widżety. Co trzeba zrobić, aby móc findViewById jest w aktualnej instrukcji switch w metodzie instatiateItem, włączasz przycisk w ten sposób:

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

Więc ... najpierw trzeba nadmuchać pogląd, następnie zainicjować układ przechowywany w widoku przez rzutowanie typu układu (RelativeLayout) i wywoływanie .findViewById (identyfikator zasobu). Następnie zainicjuj rzeczywisty widget, którego szukasz, wykonując to samo, ale przesyłając typ widgetu (przycisk) i wywołując .findViewById (identyfikator zasobu).

To zadziałało dla mnie, więc mam nadzieję, że to uratuje ci kłopoty! Trwało to na zawsze, abym mógł dojść do tego.

+4

Dobra robota! To był naprawdę frustrujący problem. – Jackson

+1

Naprawdę fantastyczna robota! Wielkie dzięki – swati

+2

W jaki sposób uzyskujemy dostęp do przycisku z głównego działania? –

0

Tylko zgadnij, ponieważ nie pokazujesz xml dla zawyżonej. Czy używasz + @ id. Jeśli nie, spróbuj.

0

Można uniknąć całą tę brudną robotę wystarczy dodać setContentView (R.layout.youlayout) przed findViewById

Powiązane problemy