最近做公司項目的時候,經常會遇到一個問題,就是我為某個控件如EditText設置requestfocus()的時候不管用,比如說登陸的時候,我判斷下用戶輸入的密碼,如果正確就登陸,錯誤就提示密碼錯誤,並且輸入框獲取焦點,但是實際中確不起作用
package com.example.hfs.requestfocusdemo; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private EditText mUserName,mPassWord; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { mUserName= (EditText) this.findViewById(R.id.et_username); mPassWord= (EditText) this.findViewById(R.id.et_password); mPassWord.setOnClickListener(this); } @Override public void onClick(View view) { if (!"123456".equals(mPassWord.getText().toString())){ Toast.makeText(this,"密碼錯誤,請重新輸入",Toast.LENGTH_SHORT).show(); mPassWord.requestFocus(); }else{ startActivity(new Intent(this,MainActivity.class)); Toast.makeText(this,"登陸成功",Toast.LENGTH_SHORT).show(); finish(); } } }
原因
查資料分析了一下,可能是以下問題:
Android加載刷新UI的時候,是從左到右,從上到下的順序,正在加載的過程中,如果此時requestFocus(),的話,有可能此時還沒把整個界面刷新好,導致requestFocus無效。
解決辦法
找到原因后就有解決辦法了,給他個延遲時間:
mPassWord.postDelayed(new Runnable() { @Override public void run() { mPassWord.requestFocus(); } }, 500);
這樣就解決了這個問題了