2012-09-24 18 views
35

Ho un edittext e quando l'utente fa clic su questo edittoxt voglio mostrare un messaggio di avviso.
Il mio codice è il seguente:L'evento OnClick funziona solo una seconda volta su edittext

  edt.setInputType(InputType.TYPE_NULL); 
      edt.setFocusableInTouchMode(true); 
      edt.requestFocus(); 

      edt.setCursorVisible(false); 

      edt.setOnClickListener(new OnClickListener() { 

       public void onClick(View v) { 
        CommentDialog.buildDialog(mContext, identifier, false, edt.getId()); 
       } 
      }); 

Non voglio la tastiera di presentarsi quando l'utente fa clic sul EditText, così ho impostato l'InputType a TYPE_NULL.
Ma quando l'edittext non ha lo stato attivo e faccio clic su di esso, l'evento onClick non viene eseguito. Quando clicco su di esso una seconda volta, il messaggio di avviso appare correttamente.

Come posso risolvere questo problema?

+1

Usa 'onFocusChangeListener' –

+0

comportamento totalmente incoerente e fuorviante dal quadro di Android. Quasi 3 anni dopo, sempre lo stesso. – zgulser

risposta

91

semplicemente provare a aggiungere questo al file XML. La tastiera si solleva quando widget si attiva. Quindi, per evitare che questo comportamento sia impostabile su false. Quindi normale utilizzo OnClickListener.

<EditText 
    android:focusable="false" 
    ... 
/> 

Ora, dovrebbe funzionare.

+1

grazie, lavora per me. – kevinl

+0

@kevinl siete i benvenuti :) – Sajmon

+0

Ha reso la mia notte: P Grazie :) –

17

È possibile utilizzare al posto di onTouchonClick, quindi non importa se il EditText ha lo stato attivo o meno.

edt.setOnTouchListener(new OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     CommentDialog.buildDialog(mContext, identifier, false, edt.getId());      
     return false; 
    } 
}); 
+3

questo è quello che stavo cercando <3. – Bawa

+0

Che funziona grazie –

1

Invece di impostare l'uso input type "modificabile = false" e "Focus = false" se non si necessita di tastiera.

Forse ti è stato utile.

4

rendere il vostro avviso finestra di dialogo compare

setOnFocusChangedListener()

5

Non c'è molto da fare devi solo

edt.setFocusable(false); 
2

Se focusableInTouchMode è vero allora tocco viene attivato solo in secondo tocco, quindi a meno che non si desidera questo caso utilizzare false per focusableInTouchMode. e se si desidera attivare la focusability nella vista set attivabile vero

<EditText android:focusable="true" android:focusableInTouchMode="false" ... /> 
+0

Penso che sarebbe più utile per l'op e ulteriori visotrs se aggiungi alcune spiegazioni alla tua intenzione. – reporter

0

Si dovrebbe aggiungere onFocusChangeListener:

edt.setKeyListener(null); 
edt.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
     if(hasFocus) 
     { 
      edt.callOnClick(); 
     } 
    } 
}); 
edt.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     CommentDialog.buildDialog(mContext, identifier, false, edt.getId()); 
    } 
}); 
2

Evitare di utilizzare un FocusChangeListener poiché si comporterà in modo irregolare quando non si ha realmente bisogno (ad esempio quando si inserisce un'attività). Basta impostare un OnTouchListener con il vostro OnClickListener in questo modo:

@Override 
    public boolean onTouch(View view, MotionEvent event) { 
     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       view.requestFocus(); 
       break; 
     } 
     return false; 
    } 

Questo farà sì che la vostra EditText per ricevere messa a fuoco prima la chiamata onClick.

-1

Questo è stato un problema per me quando si tenta di riprodurre un suono "clic" da EditText quando viene visualizzata la tastiera software; Ricevo solo un clic ogni volta. Ciò che ha risolto per me era l'opposto di ciò che ha funzionato per @neaGaze. Questo ha funzionato per me in my_layout.xml:

<EditText android:focusable="true" android:focusableInTouchMode="true" ... /> 

Permette lo scatto suono/evento accada ogni volta quando l'utente entra nel EditText, consentendo anche la tastiera virtuale da mostrare. Bisogna gestire l'OnClickListener, naturalmente, per questo accada, anche se si fa nulla con esso, in questo modo:

myEditText = (EditText) findViewById(R.id.myEditText); 
... 

// implement the onClick listener so we get the click sound and event if needed 
myEditText.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     //do something or nothing; up to you 
    } 
}); 

Parlando di quel fastidioso tastiera virtuale, se ho finito dalla mia attività di stile di dialogo con la tastiera virtuale up, non importa cosa ho provato, la tastiera è rimasta attiva quando sono tornato a MainActivity. Avevo provato tutti i soliti suggerimenti come Close/Hide the Android soft keyboard, How to close Android soft keyboard programmatically ecc. Nessuno di questi funzionava.

Nel mio caso non avevo bisogno della tastiera morbida in MainActivity. Che cosa ha fatto il lavoro è stato il seguente nel mio file AndroidManifest.xml, all'interno della sezione MainActivity

<activity 

    android:name=".MainActivity" 
    android:windowSoftInputMode="stateAlwaysHidden"> 

</activity> 
Problemi correlati