Кнопка не вызывает OnClickListener с первого щелчка

Я пытаюсь создать страницу Log, где у меня есть имя пользователя, пароль и кнопка. Когда я нажимаю кнопку в первый раз, ничего не происходит, но когда я нажимаю кнопку во второй раз, он работает правильно. Я смущен, почему это происходит?

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

Ответы

Ответ 1

Да. Я получил ответ, после большого количества RND, я получил решение, мне просто нужно реализовать setOnClickListener() и setOnFocusChangeListener(). Поэтому я ставил здесь решение.

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

Ответ 3

Задайте это -

android:focusableInTouchMode="true"

для этого -

android:focusableInTouchMode="false"

на кнопке.

Объяснение. Если вы сделаете кнопку фокусной, тогда при первом нажатии фокус передается на кнопку, затем клик передается при втором касании. EditText - это фокусируемое представление, которое сначала получает фокус, и поэтому другие виды сначала должны вернуть фокус с помощью EditText, если они не нуждаются в фокусе для работы, как кнопки. Если вам просто нужна функция OnClick, вам не нужен фокус, поэтому вы можете создать один дополнительный клик.

PS: Хотя это не требуется, но установка android:focusable на false также поможет, если первый не работает.

Ответ 4

если в вашей xml-кнопке или img или макете макета:

android:focusableInTouchMode="true"

Чтобы решить, просто удалите это.

Ответ 5

Я предложил использовать фокус запроса в методе onCreate().

Когда вы используете android:focusableInTouchMode="true", вы можете не хотеть захвата фокуса в поле "EditText".

Например:  1. Действие имеет вид, содержащий → android: focusableInTouchMode  2. Вы открываете диалог фрагментации, но нажмите кнопку "Назад" дважды, чтобы запустить его.  3. Вы должны вызвать requestFocus() после диалога фрагмента onCreateView()