2011-11-01 21 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/ से ... मैं अभी भी सुंदर एंड्रॉयड developement की दुनिया में नया हूँ ले लिया है:/एंड्रॉयड ViewPager findViewById काम नहीं कर रहा - हमेशा लौटने अशक्त

अब मैं स्पिनर नियंत्रण और "पृष्ठों" के अंदर कुछ बटन तक पहुंचने का प्रयास कर रहा हूं। लेकिन findViewById वापस लौट रहा रहता है!

मुझे याद है कि लेआउट के बारे में कुछ वास्तव में कोड के अंदर मौजूद नहीं है और इसे पहले फुलाया जाना चाहिए, जो तत्काल इटैम() फ़ंक्शन में हो रहा है। और यह बहुत स्पष्ट है कि यह "व्यू" चर में जा रहा है। लेकिन जब मैं view.findViewById (R.id.light1_off) को कॉल करता हूं;

जो कि एक बटन है, यह हमेशा शून्य लौट रहा है! मैंने यह भी सुनिश्चित किया कि यह केवल तभी कहा जाता है जब वास्तव में यह पृष्ठ लोड हो रहा था। लेकिन इससे कोई फर्क नहीं पड़ता कि मैंने क्या किया, यह हमेशा एक नल लौटता रहता है और मुझे एक बुरा नलपोइंटर अपवाद मिलता है।

क्या कोई मेरी मदद कर सकता है? मैं विचारों से बहुत अधिक हूं, और Google किसी भी मदद की नहीं है, पहले से ही लगभग 10 अलग-अलग खोज शब्दों पर पृष्ठ 5 पर रहा है।

उत्तर

21

इस मुद्दे पर बहुत निराशा और मेरे बालों को खींचने के बाद, मैंने इसे हल कर लिया है! कम से कम मेरे लिए। मान लीजिए कि आपने ट्यूटप्लस ट्यूटोरियल का इस्तेमाल किया जैसा मैंने किया था, आपके पास अपनी स्क्रीन के लिए अलग-अलग एक्सएमएल फाइलें हैं। अब, मुझे लगता है कि उन लेआउट एक्सएमएल में उनके भीतर लेआउट होते हैं (यानी लीनियरलाउट, रिलेटिव लेआउट, आदि)। अब, उन लेआउट में आपका बटन और अन्य विजेट शामिल हैं। क्या आपके पास findViewById करने में सक्षम है, instatiateItem विधि में वास्तविक स्विच बयान में, इस तरह से अपने बटन को प्रारंभ होने के लिए करना है:

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

तो ... पहले आप दृश्य को बढ़ाने के लिए है, तो प्रारंभ लेआउट के प्रकार (सापेक्ष Layout) कास्टिंग करके और दृश्य .findViewById (संसाधन आईडी) कास्टिंग करके दृश्य के भीतर रखा गया लेआउट। फिर, आप वही कर रहे वास्तविक विजेट को प्रारंभ करते हैं, लेकिन विजेट प्रकार (बटन) कास्टिंग करते हैं और .findViewById (संसाधन आईडी) को कॉल करते हैं।

यह मेरे लिए काम करता है, इसलिए मुझे उम्मीद है कि यह आपको कुछ परेशानी बचाएगा! मुझे पता लगाने के लिए हमेशा के लिए लिया।

+4

अच्छा काम findViewById से पहले यह सब गंदा काम सिर्फ जोड़ने setContentView (R.layout.youlayout) से बच सकते हैं! यह वास्तव में निराशाजनक मुद्दा था। – Jackson

+1

वास्तव में शानदार काम! बहुत बहुत धन्यवाद – swati

+2

हम वास्तव में मुख्य गतिविधि से बटन तक कैसे पहुंच सकते हैं? –

0

बस अनुमान लगाएं कि आप फुफ्फुसीय के लिए एक्सएमएल नहीं दिखाते हैं। क्या आप + @ आईडी का उपयोग करते हैं। अगर यह कोशिश नहीं करते हैं।

संबंधित मुद्दे