Evento onClick no está desencadenando | Androide

Hice una aplicación de prueba muy simple con una actividad y un diseño. El onClick no se activa la primera vez que se presiona, como debería.

La actividad:

 package com.example.mytest; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final EditText ed1 = (EditText) findViewById(R.id.editText1); ed1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Toast.makeText(getApplicationContext(), "1", Toast.LENGTH_LONG) .show(); } }); } } 

El diseño:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <EditText android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:ems="10" > <requestFocus /> </EditText> <EditText android:id="@+id/editText2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/editText1" android:ems="10" /> </RelativeLayout> 

Si ejecuta esta aplicación y hace clic en el segundo editText y luego en el primero, no disparará el onClick . Usted puede seguir seleccionando hacia adelante y hacia atrás y no disparará el onClick en absoluto. Necesito esta funcionalidad básica, pero no he podido pensar en una forma de hacerlo funcionar. ¿Ideas?

darse cuenta

He intentado todos los métodos recomendados en mi dispositivo físico del nivel 16 de la API y mi emulador del nivel 8 de la API, pero consigo el mismo problema.

Aclaración

Cuando editText1 está enfocado y se hace clic en, entonces el método onClick se onClick . Si editText2 está enfocado, y luego editText1 se hace clic, no se dispara. Gran problema.

Cuando un usuario interactúa con un elemento de interfaz de usuario, los distintos oyentes se llaman en orden descendente. (Por ejemplo: OnTouch -> OnFocusChange -> OnClick.) Si se ha definido un listener (con setOn … Listener) y se consume este evento: no se llamará a los oyentes de menor prioridad. Por su naturaleza la primera vez que toca un EditText recibe el enfoque con OnFocusChangeListener para que el usuario pueda escribir. La acción se consume aquí para ello OnClick no se llama. Cada toque sucesivo no cambia el enfoque para que el evento llegue a OnClickListener.

Básicamente, usted tiene tres opciones:

  1. Establezca el atributo focusable en false en su XML:

     android:focusable="false" 

    Ahora el OnClickListener se disparará cada vez que se hace clic en él. Pero esto hace que el EditText sea inútil ya que el usuario ya no puede ingresar ningún texto …

  2. Implementar un OnFocusChangeListener junto con el OnClickListener:

     ed1.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(hasFocus) Toast.makeText(getApplicationContext(), "onFocusChange", Toast.LENGTH_LONG).show(); } }); 

    Juntos puedes capturar cada evento táctil en tu EditText.

  3. Implementar un OnTouchListener por sí mismo:

     ed1.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if(MotionEvent.ACTION_UP == event.getAction()) Toast.makeText(getApplicationContext(), "onTouch: Up", Toast.LENGTH_SHORT).show(); return false; } }); 

    Esto se ejecutará cada vez que se toca el EditText. Observe que este evento devuelve un booleano. Devolver false significa que el evento continuará goteando hacia abajo y alcanzando el onFocusChangeListener incorporado permitiéndole recibir texto.

¡Espero que ayude!

Hacer que el texto de edición se puede hacer clic .. En XML android:clickable="true" o en código

 ed1.setClickable(true); 

entonces hazlo

 ed1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getBaseContext(), "1",Toast.LENGTH_SHORT).show(); } }); 

Estoy probablemente demasiado tarde para la fiesta, pero aquí hay un código cortado que corrige el problema con onClick () no se llama:

 ed1.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP && !v.hasFocus()) { // onClick() is not called when the EditText doesn't have focus, // onFocusChange() is called instead, which might have a different // meaning. This condition calls onClick() when click was performed // but wasn't reported. Condition can be extended for v.isClickable() // or v.isEnabled() if needed. Returning false means that everything // else behaves as before. v.performClick(); } return false; } }); 
 public class TestProject extends Activity implements OnClickListener { TextView txtmsg; EditText ed1, ed2; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); txtmsg = (TextView) findViewById(R.id.txtmsg); ed1 = (EditText) findViewById(R.id.edt1); ed2 = (EditText) findViewById(R.id.edt2); ed1.setOnClickListener(this); ed2.setOnClickListener(this); } @Override public void onClick(View v) { if(v==ed1){ txtmsg.setText("1"); Toast.makeText(this, "first",Toast.LENGTH_SHORT).show(); } if(v==ed2){ txtmsg.setText("2"); Toast.makeText(this, "second",Toast.LENGTH_SHORT).show(); } } 

}

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <EditText android:id="@+id/edt1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:ems="10" /> <EditText android:id="@+id/edt2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/edt1" android:layout_marginTop="14dp" android:ems="10" /> <TextView android:id="@+id/txtmsg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@+id/edt2" android:layout_below="@+id/edt2" android:layout_marginRight="22dp" android:layout_marginTop="160dp" android:textAppearance="?android:attr/textAppearanceLarge" /> </RelativeLayout> 

Me tomó un minuto para averiguar esto una vez cuando esto me sucedió. Mi ImageButton con un setOnClickListener y onClick no parecía disparar y luego me di cuenta de que estaba realmente debajo de otro elemento en mi diseño xml, así que me giró esto:

  <RelativeLayout> <ImageButton> <LinearLayout></LinearLayout> </RelativeLayout> 

dentro de esto:

  <RelativeLayout> <LinearLayout></LinearLayout> <ImageButton> </RelativeLayout> 

Y de repente ImageButton no estaba siendo superpuesta por la otra disposición ya que ahora se agregó más tarde a la disposición de los padres y ahora estaba en la parte superior y funciona cada vez. Buena suerte, siempre divertido cuando cosas básicas de repente parece dejar de funcionar

Evite usar un FocusChangeListener ya que se comportará erráticamente cuando no lo necesite realmente (por ejemplo, al entrar en una actividad). Sólo tiene que establecer un OnTouchListener junto con su OnClickListener como este:

 @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 reciba el foco al principio, y su onClick para funcionar correctamente la primera vez.

Esto sucede porque el primer toque gana el foco en la vista. El toque siguiente dispara el clic.

Si está inflando la vista dinámicamente, lo que podría hacer es, en el conjunto de elementos:

 android:clickable="true" android:focusable="false" android:focusableInTouchMode="false" 

Si esto no funciona, intente aplicarlo también en la vista principal.

prueba esto:

 public class MainActivity extends Activity implements OnClickListener { //rest of your code } 
  • Cómo establecer un listener de onclick para un imagebutton en un alertdialog
  • Vista no se puede resolver a un tipo
  • En el enlace del navegador de Android no siempre se ejecuta onClick causando el foco en su lugar
  • Cambiar el contenido de la ficha dependiendo del elemento del hilador seleccionado
  • Toast dentro del método onClick en Fragment
  • Android: El botón OnClickListener no funciona
  • ¿Cómo hacer efecto bling en textview en clic?
  • Cómo capturar el evento onclick en disabled EditText en la aplicación de Android
  • Evite que EditText consuma un evento de clic
  • Android se congela cuando hay una NullPointerException en OnClickListener.onClick (otras tareas no se pueden iniciar)
  • Realizar el botón Acción en Haga clic en Notificación personalizada: Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.