Кнопка не вызывает 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"
/>
Ответ 2
Вы устанавливаете android:focusableInTouchMode="true"
Следовательно, при первом нажатии он получает фокус.
Обратитесь Android-кнопка - Как настроить фокусировку на значение true и все еще принимать onClick-прослушиватель при первом нажатии?
Ответ 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()