2015-05-27 6 views
6

मैं मई गतिविधि के लेआउट-एक्सएमएल में एक EditText के लिए एक onClick श्रोता परिभाषित करना चाहते हैं के साथ विफल रहता है, लेकिन यह हमेशा एक अस्पष्ट अपवाद के साथ विफल रहता है।एंड्रॉयड EditText onClick श्रोता लेआउट में परिभाषित अस्पष्ट अपवाद

लेआउट setContentView()onCreate में मेरी गतिविधि के तरीके से इंजेक्शन दिया गया है। मैं नहीं हूँ यहाँ एक टुकड़ा का उपयोग कर और मुझे अच्छी तरह पता है कि XML परिभाषित onClick श्रोता टुकड़े के लिए काम नहीं करते हैं।

परीक्षण प्रयोजनों के लिए मैं एक imageView कि EditText के बगल में स्थित है के लिए एक ही हैंडलर विधि गयी। हैंडलर काम करता है, संपादन टेक्स्ट पर यह विफल रहता है। तो यह एडिटटेक्स्ट का कुछ खास है और एक गलत जगह वाले हैंडलर विधि की सामान्य समस्या नहीं है।

<ImageView 
    android:layout_gravity="center_horizontal|top" 
    android:layout_rowSpan="3" 
    android:src="@drawable/ic_action_event" 
    android:onClick="onCreationClicked" 
    /> 

<EditText 
    android:id="@+id/creation_edit" 
    android:focusable="false" 
    android:clickable="true" 
    android:layout_gravity="fill_horizontal" 
    android:hint="@string/enter_creation" 
    android:onClick="onCreationClicked" 
    style="@style/PickerEditText" 
    /> 

जब मैं imageView जुड़े विधि निष्पादित किया जाता है और एक DialogFragment पर क्लिक करें शुरू कर दिया गया है:

यह मेरा लेआउट फ़ाइल के प्रासंगिक हिस्सा है।

java.lang.IllegalStateException: Could not find a method onCreationClicked(View) in the activity class android.support.v7.internal.widget.TintContextWrapper for onClick handler on view class android.support.v7.widget.AppCompatEditText with id 'creation_edit' 
      at android.view.View$1.onClick(View.java:3994) 
      at android.view.View.performClick(View.java:4756) 
      at android.view.View$PerformClick.run(View.java:19749) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5221) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
    Caused by: java.lang.NoSuchMethodException: onCreationClicked [class android.view.View] 
      at java.lang.Class.getMethod(Class.java:664) 
      at java.lang.Class.getMethod(Class.java:643) 
      at android.view.View$1.onClick(View.java:3987) 
            at android.view.View.performClick(View.java:4756) 
            at android.view.View$PerformClick.run(View.java:19749) 
            at android.os.Handler.handleCallback(Handler.java:739) 
            at android.os.Handler.dispatchMessage(Handler.java:95) 
            at android.os.Looper.loop(Looper.java:135) 
            at android.app.ActivityThread.main(ActivityThread.java:5221) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

मैं वर्तमान में संस्करण v7 22.1.0

जोड़ना एक सैमसंग एस 4 (एंड्रॉयड 5.0.1) एपीआई 21 और AppCompat लाइब्रेरी पर परीक्षण कर रहा हूँ: जब मैं EditText मैं निम्नलिखित अपवाद मिल पर क्लिक करें onClick श्रोता onCreate विधि में प्रोग्राम के रूप में एक समाधान हो सकता है, लेकिन जब से यह एक बड़ा स्विच बयान और अधिक पठनीय और स्पष्ट कोड में XML- आधारित onClick-हैंडलर परिणाम के साथ एक एकल onClick विधि में जो परिणाम मैं, इस से बचना चाहते थे जो मैं पसंद करते हैं।

अब मैं त्रुटि व्यवहार और सही व्यवहार (नीचे देखें) पुन: पेश कर सकते हैं:

अतिरिक्त शोध किया। ऐसा लगता है कि यह एक बग (या एक फीचर) है जो एपकोम्पैट-वी 7 22.1.0 & 22.1.1 के साथ पेश किया गया है।

मैं खाली गतिविधि के साथ एंड्रॉयड स्टूडियो के साथ एक नया ताजा प्रोजेक्ट बनाया। minSdk 17, targetSdk 21. जोड़ा खाली Activity को EditText जैसा कि नीचे दिखाया और Activity इस तरह के हैंडलर विधि कहा:

public void onCreationClicked(View view) { 
    Toast.makeText(this,"Event Handled",Toast.LENGTH_LONG).show(); 
} 

अनुप्रयोग प्रारंभ EditText छुआ -> क्रैश

बदली गई मेरी से build.gradle:

compile 'com.android.support:appcompat-v7:22.1.1' 

को

compile 'com.android.support:appcompat-v7:22.0.0' 

और Toast दिखाया गया है।

कोई विचार?

+0

प्रबंधन नहीं करती है मैं EditText पर onClick श्रोता की आवश्यकता है। इसे हटाने का समाधान नहीं है। – Wildsau

उत्तर

10

शायद यह दूसरों को समाधान खोजने के लिए समय बचाने में मदद करता है। मैंने एपकोपैट 7 के लिए एक मुद्दा उठाया जिसे निम्नलिखित टिप्पणी के साथ स्वीकार किया गया था:

यह पहले ही प्लेटफॉर्म रिलीज के लिए तय किया गया है, लेकिन यह एपकोपेट में इसे ठीक करने के लिए संभव नहीं हो सकता है।

विवरण: https://code.google.com/p/android/issues/detail?id=174871

तो वास्तव में यह एक बग/appcompat की समस्या है और मैं प्रोग्राम के रूप में onClick श्रोता जोड़ने पर वापस आने जाएगा।

+0

मैं पुष्टि करता हूं, यह एक बग है :) अभी मेरे साथ हुआ, और अपवाद संदेश 'ऐसा कोई फ़ंक्शन नहीं' है। बुरा गूगल! – eiran

+0

ठीक है! धन्यवाद। – Hong

+0

मुझे इस समस्या को 'एपकोपेट-वी 7: 22.2.0' के साथ मिला था, लिंक पर गया और एक घंटे पहले एक पोस्ट देखी गई जहां स्थिति को' फ्यूचर रिलीज 'में बदल दिया गया था। – hoss

3

आपको अपने में Activity में onCreationClicked(View) विधि को परिभाषित करने की आवश्यकता है। आप Fragment क्लिक हैंडल करना चाहते हैं, तो आप अपने एक्सएमएल में onClick हटाने और प्रोग्राम के रूप में श्रोता संभाल की जरूरत है।

+0

लेआउट फ़ाइल एक गतिविधि से जुड़ा हुआ है और क्रिएटिऑनक्लिड गतिविधि में लागू किया गया है। परीक्षण उद्देश्यों के लिए मैंने ImageView में एक ही हैंडलर जोड़ा। वहां यह काम करता है, लेकिन मैं इसे EditText पर रखना चाहता हूं, न कि ImageView। एकमात्र बिंदु जहां मैं यहां एक टुकड़ा का उपयोग करता हूं वह यह है कि "ऑनक्रेशनक्लेक्ड" हैंडलर डायलॉग फ्रैगमेंट शुरू करता है। – Wildsau

+0

जब आपने 'एडिटटेक्स्ट' में 'ऑनक्लिक' का परीक्षण किया था तो आपने 'ImageView' के 'ऑनक्लिक' को हटा दिया था? हो सकता है कि एक ही विधि का नाम पीबी है। –

+0

क्यों न केवल संपादन टेक्स्ट को क्रिएट() विधि पर बढ़ाएं और उस पर setOnClickListener लागू करें? –

0

मैं Issue 174871 में # 5 से निम्नलिखित टिप का इस्तेमाल किया:

परिवर्तन: <EditText .../> <android.widget.EditText .../>

को तो Appcompat onClick अब

+1

मुझे नहीं लगता कि यह एक समाधान है। AFAIK इसका मतलब यह है कि आप इसे "मूल" एंड्रॉइड विजेट के साथ बदलकर एपकंपेट एडिटटेक्स्ट विजेट का उपयोग नहीं कर रहे हैं। इसका मतलब है कि, इसका व्यवहार और रूप, आपके द्वारा लक्षित किए जा रहे एंड्रॉइड संस्करण पर निर्भर है। Appcompat पुराने संस्करणों के लिए नए एंड्रॉइड संस्करण के व्यवहार को "अनुकरण" कर रहा है, इसलिए आप सभी "नई" संपादन टेक्स्ट सुविधाओं को खो देंगे (जो आपके लिए और एक संपादन टेक्स्ट के लिए ठीक हो सकता है)। – Wildsau

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