按钮在第一次单击时未调用 OnClickListener

2022-09-02 11:31:30

我正在尝试开发一个登录页面,其中我有用户名,密码和按钮。当我第一次单击该按钮时,没有任何反应,但是当我第二次单击该按钮时,它可以正常工作。我很困惑,为什么会发生这种情况?

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

登录活动.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

您正在设置 因此在第一次单击时,它会获得焦点。android:focusableInTouchMode="true"

参考Android按钮 - 如何将可聚焦设置为真,并在第一次点击时仍然接受点击监听器?


答案 2

设置这个 -

android:focusableInTouchMode="true"

对此 -

android:focusableInTouchMode="false"

按钮。

说明 - 如果您要使按钮可聚焦,则在第一次单击时,焦点将传递到按钮,然后在第二次触摸时传递单击。EditText是一个可聚焦的视图,它首先获得焦点,因此其他视图必须首先从EditText重新获得焦点,除非它们不需要焦点来工作,就像按钮一样。如果您只需要OnClick功能,那么您就不需要焦点,因此您可以再次单击一次。

PS:虽然它不应该要求,但如果第一个不起作用,设置为false也会有所帮助。android:focusable


推荐