2011-06-04 13 views
5

तो मेरे पास कोड में एक कस्टम व्यू सेट अप है (इसके लिए कोई एक्सएमएल लेआउट परिभाषित नहीं है) और मैं सोच रहा हूं कि बच्चे के दृश्य आईडी को सही ढंग से कैसे परिभाषित किया जाए। I DO में एक XML फ़ाइल परिभाषित आईडी है जो इस तरह के समान है .. लेकिन मैं इसे कैसे समझता हूं, कम से कम, क्योंकि मेरे पास xml लेआउट नहीं है, पास करने के लिए कोई AttribSet नहीं है .. इसलिए मेरे निर्माता सभी बस हैं (संदर्भ संदर्भ) प्रकार के।कस्टम व्यू - मैं अपनी आईडी कैसे सेट करूं ताकि वे findViewById() के माध्यम से मिल सकें?

<resources> 
    <item type="id" name="textview1"/> 
    <item type="id" name="textview2"/> 
</resources> 

और मेरे विचार में इन पंक्तियों के साथ दिखता है:

public class MyView extends View { 

    protected RelativeLayout baseLayout; 
    protected TextView textView1; 
    protected TextView textView2; 

    public MyView(Context context) { 
     super(context); 
     LayoutParams fill = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 
     setLayoutParams(fill); 

     Resources res = getResources(); 

     baseLayout = new RelativeLayout(context); 
     baseLayout.setLayoutParams(fill); 

     textView1 = new TextView(context); 
     textView1.setId(R.id.textview1); 
     // other init stuff here 

     textView2 = new TextView(context); 
     textView2.setId(R.id.textview2); 
     // other init stuff here 

     baseLayout.addView(textView1); 
     baseLayout.addView(textView2); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     // *snip lots of stuff* 

     baseLayout.draw(canvas); 
    } 

    // This is only here because findViewById() returns NULL when I search 
    public TextView getTextView1() { 
     return textView1; 
    } 

    // This is only here because findViewById() returns NULL when I search 
    public TextView getTextView2() { 
     return textView2; 
    } 

} 

यहाँ गतिविधि दृश्य का उपयोग करता है है ..

public class MyActivity extends Activity { 

    // This is only here because findViewById() returns NULL when I search 
    private MyView myView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Resources res = getResources(); 

     myView = new myView(this); 
     setContentView(myView); 

     // This returns NULL. :/  
     // final TextView textView1 = (TextView) findViewById(R.id.textView1); 

     // This is only here because findViewById() returns NULL when I search.. 
     final TextView textView1 = myView.getTextView1(); 
     final Animation anim = AnimationUtils.loadAnimation(this, R.anim.my_animation); 
     textView1.setAnimation(anim); 
     anim.setAnimationListener(new AnimationListener() { 
      @Override 
      public void onAnimationEnd(Animation _anim) { 
       Log.v("InsideAnimation", "Animation ended"); 
       textView1.setVisibility(View.INVISIBLE); 
      } 
      @Override 
      public void onAnimationRepeat(Animation _anim) { 
       Log.v("InsideAnimation", "Animation repeated"); 
      } 
      @Override 
      public void onAnimationStart(Animation _anim) { 
       Log.v("InsideAnimation", "Animation started"); 
      } 
     }); 
     anim.reset(); 
     textView1.startAnimation(anim); 
    } 
} 

मुख्य समस्या यह है कि एनीमेशन मैं लोड है (जो एक्सएमएल में परिभाषित किया गया है) और शुरूआत बिल्कुल कुछ नहीं करता है। मुझे "एनीमेशन शुरू हुआ" का लॉग स्टेटमेंट मिलता है लेकिन यह है। यह कभी खत्म नहीं होता है और जब मैं इसे अनुकरण करता हूं तो यह कभी भी कुछ नहीं करता है। ऐसा लगता है जैसे यह शुरू होता है, लेकिन वास्तव में नहीं चलता है। I सोचें समस्या यह है कि शायद एनीमेशन एक्सएमएल आईडी लेआउट परिभाषाओं का उपयोग करने के लिए उपयोग करने की उम्मीद कर रहा है, लेकिन चूंकि findViewById() NULL देता है, मुझे लगता है कि भाग टूट गया है (और इस प्रकार एनीमेशन काम नहीं करता है)। तो .. कम से कम अभी के लिए, मैं यह जानना चाहता हूं कि आईडी को सेट करने के साथ मैं क्या गलत कर रहा हूं ताकि मैं सही दृश्य वापस करने के लिए खोजने के लिए ViewById() ढूंढ सकूं और न कि ... और फिर संभवतः एनीमेशन काम करेगा । (या यदि यह अभी भी उस बिंदु के बाद काम नहीं करता है, तो मुझे शायद xml के बजाय कोड में एनीमेशन को परिभाषित करना होगा)

कोई भी मदद या सुझावों की सराहना की जाती है।

उत्तर

0

मेरा अनुमान है कि इस समय आपके टेक्स्ट व्यू को तुरंत चालू नहीं किया गया है। अपने एनीमेशन को ऑनक्रेट-विधि के बाहर ट्रिगर करने का प्रयास करें।

इसके अतिरिक्त, आपका MyView दृश्य से बढ़ाया गया है और आप अंदर एक रिलेवेटिवआउट बना रहे हैं। यदि आप ऐसा करते हैं, तो आप भी सीधे अपने वर्ग RelativeLayout से विस्तार कर सकता है और उसके बाद की तरह

mRelativeLayout = new MyRelativeLayout(context) 
mRelativeLayout.findViewById(R.id.textview1) 

कुछ करना भी समस्या हो सकती है, क्योंकि आप haven't अपनी गतिविधि में अपनी RelativeLayout के संदर्भ मिला है। हालांकि यह अधिक संभावना है कि मेरा पहला अनुमान समाधान है ...

ओह, और आप बस अपने रिलेवेटलाइट को एक्सएमएल में डिज़ाइन कर सकते हैं। मुझे प्रोग्रामेटिक लेआउट का उपयोग करने में कोई वास्तविक बिंदु नहीं दिखता है ...

+0

मैं गारंटी दे सकता हूं कि टेक्स्टव्यू तत्काल है .. मैंने लॉग इन करने के लिए लॉग.व स्टेटमेंट (इससे पहले कि मैंने कभी इसे पोस्ट किया) चलाया।तात्कालिकता का उत्पादन इसे आईडी के माध्यम से खोजने की कोशिश करने के आउटपुट से पहले मौजूद था। व्यू को विस्तारित करने के लिए - मैंने पहले से ही व्यू के बजाय रिलेवेटिवआउट को विस्तारित करने का प्रयास किया है .. लेकिन जब मैं करता हूं कि मेरे पास ऑन-स्ट्रॉ के अंदर मौजूद अन्य सामान अब ड्रॉ नहीं करते हैं (जो मुझे यकीन है कि मैं संभावित रूप से ठीक कर सकता हूं, लेकिन मैं हूं यकीन नहीं है कि यह क्यों आकर्षित नहीं करेगा ... लेकिन कोई भी कम नहीं, यह नहीं करता है)। (cont) –

+0

हालांकि, मैं बस खोजने के बजाय myView.findViewById() को चलाने का प्रयास कर सकता हूं। केवल ..ViewById() .. जो काम कर सकता है। खाने के बाद मैं आपको बता दूंगा। सिर्फ एक एक्सएमएल लेआउट के अंदर डिजाइन करने के मामले में .. मुझे पता है कि मैं ऐसा कर सकता हूं (और वास्तव में पहले से ही)। लेकिन समस्या यह है कि मैं चाहता हूं कि यह प्रदर्शन के आयामों के आधार पर मूल्यों की गणना करे ... एक्सएमएल का उपयोग करके ऐसा नहीं होगा, इसलिए मैं xml के बजाय कोड के भीतर काम कर रहा हूं। मैं चाहता हूं कि मेरे प्रोग्राम को कई प्रकार के डिस्प्ले के लिए एक्सएमएल लेआउट न किए बिना एकाधिक डिस्प्ले पर समान दिखना पड़े ... मैं आपके द्वारा बताए गए प्रयासों का प्रयास करूंगा। –

+0

इसलिए मैंने अपनी कक्षा में एक विधि जोड़ा जिसने मुझे रिलेवेटिवआउट दिया, और फिर मैंने 'myRelativeLayout.findViewById (R.id.textview1)' चलाया और वास्तव में यह सही ऑब्जेक्ट वापस कर दिया, इसलिए आपने जो सुझाव दिया था। :) दुर्भाग्यवश, एनीमेशन अभी भी कुछ भी नहीं कर रहा है .. Sooooo .. मुझे कोड में एनीमेशन भी प्रोग्राम करना पड़ सकता है। मुझे नहीं पता। मैं एक नया प्रोग्रामर नहीं हूं - एंड्रॉइड के लिए बिल्कुल नया, और यह कुछ चीजें करता है जो मेरे लिए अजीब लगती हैं। –

1

जावा कोडिंग के लिए setID-method है।

+0

एर्म .. क्या मैं पहले से ही उपयोग नहीं कर रहा हूं? –

+0

आप वास्तव में हैं। लेकिन यह अजीब लगता है कि आप setId (R.id ...) का उपयोग कर रहे हैं। मैंने अब इस मुद्दे को गलत समझा होगा, लेकिन क्या आप पहले से मौजूद आईडी (जो .... मौजूद नहीं है) का जिक्र करते हुए एक आईडी शुरू नहीं कर रहे हैं। यदि यह सही है, तो आपको केवल आरआईडी से तर्क को वास्तविक एनआर में स्विच करने की आवश्यकता है। सूखी अगर मैं कह रहा हूं कि सामान आपको लगता है कि यह स्पष्ट और बेवकूफ है: पी – keyser

+0

आईडी केवल एक्सएमएल में मौजूद है। जब मैं ऑब्जेक्ट बनाता हूं, तो इसमें इसके साथ कोई आईडी संबद्ध नहीं होती है (क्योंकि मैंने ऑब्जेक्ट को xml में @ id + टैग के साथ परिभाषित नहीं किया है)। तो मैं एक्सएमएल (मेरा पहला कोड ब्लॉक) में एक आईडी परिभाषित करता हूं .. और फिर मैं उस आईडी को दृश्य में लिंक करता हूं ताकि मैं बाद में दृश्य प्राप्त कर सकूं। यह एनपी है, मार्टिन - मुझे नहीं पता था कि आप कुछ और कह रहे थे या नहीं। –

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

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