El botón no está llamando a OnClickListener con el primer clic

Estoy tratando de desarrollar una página de inicio de sesión , donde tengo nombre de usuario, contraseña y un botón. Cuando hago clic en el botón por primera vez, no pasa nada, pero cuando hago clic en el botón por segunda vez, entonces funciona correctamente. Estoy confundido, ¿por qué está sucediendo?

Activity_login.xml

<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" android:background="@drawable/splash_bg" tools:context=".LoginActivity" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:orientation="vertical" android:layout_margin="30dp" > <EditText style="@style/EditText1" android:id="@+id/userEditText" android:layout_marginBottom="50dp" android:inputType="textNoSuggestions" android:singleLine="true" android:hint="username" /> <EditText style="@style/EditText1" android:id="@+id/passEditText" android:inputType="textPassword" android:layout_marginBottom="50dp" android:hint="password" /> <Spinner android:id="@+id/locationSpinner" android:layout_width="match_parent" android:layout_height="wrap_content" android:popupBackground="#ffffff" style="@style/EditText1" android:layout_marginBottom="50dp" /> <Button style="@style/Button1" android:focusable="true" android:focusableInTouchMode="true" android:onClick="onLoginClick" android:text="continue" /> 

LoginActivity.java

  @SuppressLint("DefaultLocale") public void onLoginClick(View view) { String username = mUserEditText.getText().toString(); String password = mPassEditText.getText().toString(); String location = mLocationData.get( mLocationSpinner.getSelectedItemPosition()).toLowerCase(); if (username.isEmpty() || password.isEmpty()) { CreatorMessenger .getInstance() .showMessage(this, "Error!!", "You need to enter username and password both to continue!!"); return; } User user; user = new User(username);/* * } */ user.setLocation(location); AppManager.getInstance().setLoggedInUser(user); APICaller.getInstance().login(username, password, location); } 

Estás estableciendo android:focusableInTouchMode="true" Por lo tanto, en el primer clic que recibe el enfoque.

Referir el botón de Android – ¿Cómo establecer focusable a true y todavía aceptar onClick oyente en el primer clic?

Sí Sí Tengo la respuesta, después de un montón de RND, tengo la solución, sólo tengo que implementar setOnClickListener (), y setOnFocusChangeListener (). Así que estoy poniendo aquí la solución.

ActividadLogin.java

  buttonLogin= (Button) findViewById(R.id.buttonLogin); buttonLogin.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.d("hello", "hellow"); String username = mUserEditText.getText().toString(); String password = mPassEditText.getText().toString(); String location = mLocationData.get(mLocationSpinner.getSelectedItemPosition()).toLowerCase(); if(username.isEmpty()||password.isEmpty()){ popbox(); return; } User user; user = new User(username); user.setLocation(location); AppManager.getInstance().setLoggedInUser(user); APICaller.getInstance().login(username, password, location); } }); buttonLogin.setOnFocusChangeListener(new View.OnFocusChangeListener() { public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { v.performClick(); } } }); } 

Activity_login.xml

  <Button android:id="@+id/buttonLogin" style="@style/Button1" android:text="continue" /> 

Establecer esto –

 android:focusableInTouchMode="true" 

a esto –

 android:focusableInTouchMode="false" 

En el botón.

Explicación – Si haces que el botón se pueda enfocar, entonces en el primer clic el foco se pasa al botón, entonces el clic es pasado en el segundo toque. EditText es una vista focusable que obtiene el foco primero y por lo tanto otras vistas primero deben recuperar el foco de EditText, a menos que no necesiten el foco para trabajar, apenas como botones. Si sólo necesita la función OnClick, entonces no necesita foco, por lo que puede spre un clic extra.

PS: Aunque no debería requerir, pero la configuración de android:focusable a false también ayudará, si el primero no funciona.

Si en su xml en el botón, o img, o la disposición del trazador de líneas tiene:

 android:focusableInTouchMode="true" 

Para resolverlo, solo elimínalo.

Sugerí utilizar el enfoque de solicitud en el método "onCreate ()".

Cuando usa android:focusableInTouchMode="true" puede que no quiera capturar el foco por un campo 'EditText'.

Por ejemplo: 1. Una actividad tiene una vista contiene -> android: focusableInTouchMode 2. Usted abre un cuadro de diálogo de fragmentos, pero el botón de nuevo tiene que hacer clic dos veces para disparar. 3. Debe llamar a requestFocus () después de la ventana de diálogo de fragmentos onCreateView ()

  • Cómo registrar la clase de aplicación en mi archivo de manifiesto
  • Obligar a un botón a permanecer en la parte inferior de la pantalla del teléfono
  • Android forma xml dibujable - cómo dibujar un formulario u?
  • ¿Es posible tener más de un archivo de recursos de cadena en Android?
  • Fondo Android + texto + icono para un botón
  • ListFragment Layout desde xml
  • ¿Cómo puedo volver a utilizar este botón de Android?
  • Ignorar elementos no está permitido aquí, en Android lint.xml
  • Android: Lectura de XML desde un recurso local (para pruebas)
  • ¿Cómo puedo mostrar una imagen que acabo de sacar de mi cámara en mi aplicación Android?
  • Dibujo de múltiples formas con ShapeDrawable en xml con Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.