2012-07-25 26 views
7

के लिए NoSuchMethod फेंकता रहा है एक स्वनिर्धारित TextView जो तीन देखें कंस्ट्रक्टर्स लागू करता है (nb, यह एक Android एप्लिकेशन पर मेरा पहला वार है):को लागू करने के लिए बढ़ाया/कस्टम दृश्य निर्माता

public class DynamicGeometryTextView extends TextView { 

    public DynamicGeometryTextView (Context con) { super(con); } 

    public DynamicGeometryTextView (Context con, AttributeSet attrs) { 
     super(con, attrs); 
    } 

    public DynamicGeometryTextView (Context con, AttributeSet attrs, int style) { 
     super(con, attrs, style); 
    } 

यह एक गैर स्थिर है आंतरिक वर्ग, क्योंकि इसे बाहरी वर्ग से इंस्टेंस डेटा तक पहुंचने की आवश्यकता है। यह एक .xml लेआउट में प्रकट होता है:

<view class="cogdis.chalkboard.DisplayText$DynamicGeometryTextView" 
    android:id="@+id/chalkboard" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

सब कुछ संकलित करता है तथा ठीक स्थापित करता है, लेकिन कार्यावधि में:

Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class cogdis.chalkboard.DisplayText$DynamicGeometryTextView 
    at android.view.LayoutInflater.createView(LayoutInflater.java:596)                   
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)                 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)                   
    at android.view.LayoutInflater.inflate(LayoutInflater.java:489)                    
    at android.view.LayoutInflater.inflate(LayoutInflater.java:396)                    
    at android.view.LayoutInflater.inflate(LayoutInflater.java:352)                    
    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:256)              
    at android.app.Activity.setContentView(Activity.java:1867)                     
    at cogdis.chalkboard.DisplayText.onCreate(DisplayText.java:26)                    
    at android.app.Activity.performCreate(Activity.java:5008)                     
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)                
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)                
    ... 11 more                                 
Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]      
    at java.lang.Class.getConstructorOrMethod(Class.java:460)                     
    at java.lang.Class.getConstructor(Class.java:431)                       
    at android.view.LayoutInflater.createView(LayoutInflater.java:561)                   
    ... 22 more          
मेरी आँखों के लिए

यह संकेत मिलता है कि यह नहीं मिल सकता है (संदर्भ, AttributeSet) संस्करण निर्माता का ... लेकिन यह अस्तित्व में है। मैंने कुछ अन्य एसओ पोस्ट देखे हैं, जैसे कि Android Custom View Constructor, यह सब एक ही निष्कर्ष (मेरी आंखों के लिए) पर इंगित करता है और बार-बार कस्टम घटक पर एपीआई गाइड पढ़ता है, लेकिन मुझे एक घंटे से अधिक समय तक इसके साथ फंस गया है।

किसी के पास कोई विचार है? क्या इसे आगे डीबग करने का कोई तरीका है?

भावी पीढ़ी, अर्थात्।, किसी को भी नया मेरी तरह इस के लिए , गैर स्थिर इनर क्लासों को नो-जाना करता है, तो अपने कस्टम दृश्य एक एक्सएमएल लेआउट में संदर्भित है, लेकिन अगर आप यह प्रोग्राम के रूप में बनाने के लिए, यह काम कर सकते हैं , जैसे:

LayoutInflater lif = getLayoutInflater(); 
    ViewGroup layout = (ViewGroup)lif.inflate(R.layout.board, null); 

    tv = new DynamicGeometryTextView(this); 

    layout.addView((View)tv); 

इस मामले में, आप केवल कंस्ट्रक्टर्स आप वास्तव में उपयोग करने से मिलान करने की जरूरत है। लेआउट पैरामीटर (WRAP_CONTENT, आदि) को setLayoutParams() के माध्यम से कन्स्ट्रक्टर में सेट किया जा सकता है जिसे दृश्य से विरासत में मिला है।

+1

बस कारण को सीमित करने के होना चाहिए आप संदर्भ निकाल सकते हैं बाहरी वर्ग में और अपना टेक्स्ट व्यू क्लास स्थिर बनाते हैं? –

+0

@ धीरजवीएस .: हां, और वास्तव में समस्या का समाधान करता है:/ – delicateLatticeworkFever

उत्तर

9

गैर-स्थैतिक आंतरिक वर्ग without reference to an instance of the outer class को तुरंत चालू करने का कोई तरीका नहीं है।

OuterClass.InnerClass innerObject = outerObject.new InnerClass(); 

तो इस कारण यह है कि लेआउट inflater अपनी कक्षा बढ़ करने में विफल हो सकता है। बाहरी वर्ग के सदस्यों के संदर्भों को हटाने के बाद अपनी कक्षा को स्थिर बनाएं।

+0

! @ $ # मुझे लगता है कि मैं इसे तुरंत एक्सएमएल लेआउट को सांस करने की कोशिश करूंगा, वहां बहुत सारे युग्मन हैं। – delicateLatticeworkFever

9

बदलें:

public class DynamicGeometryTextView extends TextView { 

करने के लिए:

public static class DynamicGeometryTextView extends TextView { 

ताकि ठीक से यह संदर्भ के लिए, यह एक static भीतरी वर्ग

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