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

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

activity_login.xml

     

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

Solutions Collecting From Web of "按钮不会在第一次单击时调用OnClickListener"

你正在设置android:focusableInTouchMode="true"因此,在第一次点击它接收焦点。

请参阅Android按钮 – 如何将focusable设置为true并在第一次单击时仍接受onClick侦听器?

设置这个 –

 android:focusableInTouchMode="true" 

对此 –

 android:focusableInTouchMode="false" 

在按钮上。

说明 – 如果您将按钮设置为可聚焦,则首次单击时焦点将传递给按钮,然后在第二次触摸时传递单击。 EditText是一个可聚焦的视图,它首先获得焦点,因此其他视图必须首先从EditText重新获得焦点,除非它们不需要焦点工作,就像按钮一样。 如果您只需要OnClickfunction,那么您不需要焦点,因此您可以进行额外的一次点击。

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

是的我得到了答案,经过大量的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

   

如果你的xml按钮,或img,或者衬里布局有:

 android:focusableInTouchMode="true" 

要解决此问题,请将其删除。

我建议在“onCreate()”方法中使用请求焦点。

当你使用android:focusableInTouchMode="true"你可能不希望焦点捕获’EditText’字段。

例如:1。一个活动有一个视图包含 – > android:focusableInTouchMode 2.你打开一个片段对话框,但后退按钮需要点击两次才能触发它。 你应该在片段对话onCreateView()之后调用requestFocus()