2014年3月26日

【Android】EditText Change Focus. EditText自動切換焦點與虛擬鍵盤顯示/隱藏

各位Android安卓開發者大家好 ^^

今天小黑人要與大家分享的主題元件是"EditText",原因就是小黑人有一次碰到過一個問題,就是有4個或5EditText輸入到固定的字數後要自動切換到下一個EditText,哈哈~不知道大家有沒有寫過需要輸入一些序號或電話號碼等等的編輯輸入框,雖然製作這個編輯框不困難,只需要EditText元件就可以完成了,但是如果要寫的比較流暢人性化一點那就必須要再多加一些判斷囉,那要怎麼判斷EditText的狀態並自動切換EditText焦點呢?那就和小黑人一起看下去吧~!!! ^^

1.首先我們在Layout裡配置一個畫面,下列為小黑人自己預設的版面Layout,用4EditText3TextView連接EditText,類似輸入序號的版面 :

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
>

        //ID
比重、置中、最多4字數、單行、數字鍵盤

        <EditText
        android:id="@+id/edit1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_gravity="center_vertical"
        android:gravity="center"
        android:maxLength="4"
        android:singleLine="true"
        android:phoneNumber="true"
        />
   
        <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="-"
        android:layout_gravity="center_vertical"
        />
   
        <EditText
        android:id="@+id/edit2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_gravity="center_vertical"
        android:gravity="center"
        android:maxLength="4"
        android:singleLine="true"
        android:phoneNumber="true"
        />
   
        <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="-"
        android:layout_gravity="center_vertical"
        />
   
        <EditText
        android:id="@+id/edit3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_gravity="center_vertical"
        android:gravity="center"
        android:maxLength="4"
        android:singleLine="true"
        android:phoneNumber="true"
        />
   
        <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="-"
        android:layout_gravity="center_vertical"
        />
   
        <EditText
        android:id="@+id/edit4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_gravity="center_vertical"
        android:gravity="center"
        android:maxLength="4"
        android:singleLine="true"
        android:phoneNumber="true"
        />

</LinearLayout>


2.Layout版面配置完後,接下來就是程式端(.java)進行焦點切換囉 :

public class MainActivity extends Activity
{
        private EditText mEdit1,mEdit2,mEdit3,mEdit4;
       
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
       
                mEdit1 = (EditText) findViewById(R.id.edit1);
                mEdit2 = (EditText) findViewById(R.id.edit2);
                mEdit3 = (EditText) findViewById(R.id.edit3);
                mEdit4 = (EditText) findViewById(R.id.edit4);
               
                //
建立文字監聽

                TextWatcher mTextWatcher = new TextWatcher()
                {
                        @Override
                        public void afterTextChanged(Editable s)
                        {
                        }

                        @Override
                        public void beforeTextChanged(CharSequence s, int start, int count,int after)
                        {
                        }

                        @Override
                        public void onTextChanged(CharSequence s, int start, int before,int count)
                        {
                                //
如果字數達到4,取消自己焦點,下一個EditText取得焦點
                                if(mEdit1.getText().toString().length()==4)
                                {
                                        mEdit1.clearFocus();
                                        mEdit2.requestFocus();
                                }
                               
                                if(mEdit2.getText().toString().length()==4)
                                {
                                        mEdit2.clearFocus();
                                        mEdit3.requestFocus();
                                }
                               
                                if(mEdit3.getText().toString().length()==4)
                                {
                                        mEdit3.clearFocus();
                                        mEdit4.requestFocus();
                                }
                               
                                //
如果字數達到4,取消自己焦點,隱藏虛擬鍵盤
                                if(mEdit4.getText().toString().length()==4)
                                {
                                        mEdit4.clearFocus();
                                        IBinder mIBinder = MainActivity.this.getCurrentFocus().getWindowToken();
                                        InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                                        mInputMethodManager.hideSoftInputFromWindow(mIBinder, InputMethodManager.HIDE_NOT_ALWAYS);

                                        //
下方為顯示虛擬鍵盤
                                        //mInputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
                                }
                        }
                };
               
                //
加入文字監聽
                mEdit1.addTextChangedListener(mTextWatcher);
                mEdit2.addTextChangedListener(mTextWatcher);
                mEdit3.addTextChangedListener(mTextWatcher);
                mEdit4.addTextChangedListener(mTextWatcher);
        }
}


畫面預覽 :

 


以上就是自動切換EditTextFocus焦點程式碼,其中也包含虛擬鍵盤的顯示與隱藏,其實EditText可以自動切換是真的人性化許多啦,這樣就不用自己打到哪邊還要自己再點輸入框,哈哈~大家可以試試看唷 ^^

如有任何問題都可以和小黑人一起交流討論喔~謝謝大家~

☆小黑人☆


3 則留言:

  1. 感謝你的文章讓我困擾許久的問題解決!

    回覆刪除
    回覆
    1. 您好,大家可以互相交流技術是個很好的學習方式,
      非常謝謝您的留言與支持!

      刪除

謝謝大家支持,有任何問題都可以和小黑人一起討論!