2012-09-24 11 views
35

Tengo un texto de edición, y cuando el usuario hace clic en este texto de edición, quiero mostrar un diálogo de alerta.
Mi código es el siguiente:El evento OnClick solo funciona por segunda vez en el texto de edición

  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()); 
       } 
      }); 

no quiero que el teclado aparezca cuando el usuario hace clic en el EditarTexto, por lo que establece la InputType a TYPE_NULL.
Pero cuando el texto de edición no tiene foco y hago clic en él, el evento onClick no se ejecuta. Cuando hago clic por segunda vez, el diagrama de alerta aparece correctamente.

¿cómo puedo solucionar esto?

+1

Use ' –

+0

comportamiento totalmente inconsistente y engañosa del marco de Android. Casi 3 años después, sigue igual. – zgulser

Respuesta

91

simplemente trata de añadir esto a su archivo XML. Su teclado aparece cuando widget gana foco. Para evitar este comportamiento establezca el foco en false. Entonces el uso normal OnClickListener.

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

Ahora, debería funcionar.

+1

gracias, funciona para mí. – kevinl

+0

@kevinl eres bienvenido :) – Sajmon

+0

Hizo mi noche: P Gracias :) –

17

Puede usar onTouch en lugar de onClick, por lo que no importa si el EditText tiene foco o no.

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

esto es lo que estaba buscando <3. – Bawa

+0

Eso funciona gracias –

1

En lugar de establecer el uso del tipo de entrada "editable = false" y "Focus = false" si no necesita teclado.

Puede ser útil para usted.

4

hacer su alerta de diálogo cuadro de aparece en

setOnFocusChangedListener()

5

No hay mucho que hacer sólo hay que

edt.setFocusable(false); 
2

Si es cierto, entonces focusableInTouchMode táctil se activa sólo en segundo toque, por lo que a menos que desee utilizar ese caso falso para focusableInTouchMode. y si desea habilitar la focusability en la vista de conjunto enfocable cierto

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

Creo que sería más útil para el operador y otros visitantes si agregas algunas explicaciones a tu intención. – reporter

0

Debe añadir 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

Evitar el uso de un FocusChangeListener ya que se comporta de forma errática cuando realmente no lo necesita (por ejemplo, cuando ingresas a una actividad). Sólo hay que establecer una OnTouchListener junto con su OnClickListener así:

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

Esto hará que su EditText para recibir el enfoque antes de su llamada onClick.

-1

Esto fue un problema real para mí cuando intenté reproducir un "clic" de EditText cuando aparece el teclado virtual; Solo recibía un clic cada dos veces. Lo que lo solucionó fue lo opuesto a lo que funcionó para @neaGaze. Esto funcionó para mí en my_layout.xml:

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

Permite que el sonido de clic/evento suceda cada vez que el usuario entra en el EditarTexto, mientras que también permite el teclado en pantalla para mostrar. Usted tiene que manejar el OnClickListener, por supuesto, para que esto suceda, incluso si usted no hace nada con él, así:

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 
    } 
}); 

Hablando de ese teclado suave molestos, si he terminado de mi actividad de estilo de diálogo con el teclado en pantalla arriba, sin importar lo que intenté, el teclado permaneció activo cuando volví a MainActivity. Probé todas las sugerencias habituales, como Close/Hide the Android soft keyboard, How to close Android soft keyboard programmatically, etc. Nada de eso funcionó.

En mi caso, no necesité el teclado virtual en MainActivity. Lo que hizo el trabajo era onFocusChangeListener` lo siguiente en mi archivo AndroidManifest.xml, dentro de la sección MainActivity

<activity 

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

</activity> 
Cuestiones relacionadas