2015-05-27 8 views
6

Voglio definire un Listener onClick per un EditText nel Layout-XML dell'attività di may, ma fallisce sempre con un'eccezione oscura.Android EditText onClick Listener definito in Layout non riesce con oscura Eccezione

Il layout viene iniettato con setContentView() nel onCreate -Metodo della mia attività. Sono non utilizzando un frammento qui e sono ben consapevole del fatto che il listener XML definito onClick non funziona per i frammenti.

Per scopi di test, ho aggiunto lo stesso metodo di gestione a un ImageView che si trova accanto a EditText. Lì il gestore funziona, su EditText fallisce. Quindi questo è qualcosa di speciale nell'EditText e non in un Problema generale di un metodo di gestione errato.

Questa è la parte rilevante del mio file di layout:

<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" 
    /> 

Quando clicco sul ImageView viene eseguito il metodo associato e un DialogFragment viene avviato. Quando clicco sul EditText ottengo la seguente eccezione:

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) 

Attualmente sto testando su un Samsung S4 (Android 5.0.1) API 21 e AppCompat Biblioteca nella versione v7 22.1.0

Aggiunta del Il listener sarebbe una soluzione, ma volevo evitare questo, dal momento che risulta in un singolo metodo onClick con una grande istruzione switch e l'onClick-Handler basato su XML produce un codice più leggibile ed esplicito che io preferire.

Forse ulteriore ricerca:

ora posso riprodurre il comportamento di errore e il comportamento corretto (vedi sotto). Sembra che questo sia un bug (o una funzionalità) introdotto con appcompat-v7 22.1.0 & 22.1.1.

Ho creato un nuovo progetto con Android Studio con Blank Activity. minSdk 17, targetSdk 21. Aggiunta la EditText al vuoto Activity come illustrato di seguito e ha aggiunto il metodo del gestore al Activity in questo modo:

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

Iniziato l'App ha toccato l'EditText -> Crash

cambiato la mia build.gradle da:

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

a

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

e viene mostrato lo Toast.

Qualche idea?

+0

I Need l'ascoltatore onClick sul EditText. Rimozione non è una soluzione. – Wildsau

risposta

10

Forse questo aiuta gli altri a risparmiare tempo con la ricerca di una soluzione. Ho sollevato un problema per appcompat7 che è stato accettato con il seguente commento:

Questo è già stato risolto per la prossima versione della piattaforma, ma potrebbe non essere possibile risolverlo in appcompat.

Dettagli: https://code.google.com/p/android/issues/detail?id=174871

Così in effetti si tratta di un bug/problema della appcompat e io ripiego ad aggiungere l'ascoltatore onClick di programmazione.

+0

confermo, è un bug :) mi è successo proprio ora, e il messaggio di eccezione è 'nessuna di tali funzioni'. cattivo google! – eiran

+0

Ben fatto! Grazie. – Hong

+0

Ho appena avuto questo problema con 'appcompat-v7: 22.2.0', sono andato al link e ho notato un post un'ora fa in cui lo stato era stato cambiato in' FutureRelease'. – hoss

3

È necessario definire il metodo onCreationClicked(View) nel proprio Activity non nel proprio Fragment. Se si desidera che Fragment gestisca il clic, è necessario rimuovere onClick nel codice XML e gestire il listener a livello di codice.

+0

Il file di layout è associato a un'attività e onCreatíonClicked è implementato in Activity. A scopo di test ho aggiunto lo stesso gestore a ImageView. Lì funziona, ma voglio averlo su EditText e non su ImageView. L'unico punto in cui utilizzo un frammento qui è che il gestore "onCreationClicked" avvia un DialogFragment. – Wildsau

+0

hai rimosso "onclick" di "ImageView" quando esegui il test di "onclick" in "EditText"? forse usando lo stesso nome del metodo è il pb. –

+0

perché non solo gonfiare EditText nel tuo metodo onCreate() e applicare setOnClickListener su di esso? –

0

ho usato il seguente suggerimento dal 5 ° posto Issue 174871:

cambiamento: <EditText .../> a <android.widget.EditText .../>

Quindi AppCompat non gestisce onClick più

+1

Non penso che questa sia una soluzione. AFAIK significa solo che non stai più utilizzando il widget EditText appcompat sostituendolo con il widget Android "nativo". Ciò significa che il comportamento e l'aspetto di esso dipendono dalla versione di Android che hai scelto come target. Appcompat sta "emulando" il comportamento della nuova versione di Android per le versioni precedenti, quindi perderai tutte le "nuove" funzionalità di EditText (che potrebbero essere ok per te e un EditText). – Wildsau