1. 程式人生 > >Android:隱藏輸入法軟鍵盤

Android:隱藏輸入法軟鍵盤

內部 encoding utf-8 res ger 裏的 trac mini 對象

1.概述

1) 給LinearLayout 註冊click 事件,點擊後隱藏輸入法軟鍵盤。為什麽要叫軟鍵盤,很奇怪呢。通過Activity 的getSystem(Context.INPUT_METHOD_SERVICE) 獲取到輸入法的對象,接著把它隱藏掉。

2) EditText 輸入的字符達到最大值時隱藏輸入法軟鍵盤。註冊EditText 的TextWatcher 事件,通過判斷輸入的字符數達到最大長度時隱藏掉輸入法軟鍵盤。

2.Activity 後臺代碼

public class EditHideActivity extends AppCompatActivity implements View.OnClickListener {
    private LinearLayout ll_hide;
    private EditText et_phone;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit_hide);

        ll_hide = (LinearLayout) findViewById(R.id.ll_hide);
        et_phone = (EditText) findViewById(R.id.et_phone);

        //給LinearLayout 註冊click 監聽,點擊後隱藏輸入法
        ll_hide.setOnClickListener(this);

        //給EditText 註冊TextChanged 監聽,文本的變化會觸發監聽事件
        et_phone.addTextChangedListener(new HideTextWatcher(et_phone));
    }

    //實現OnClickListener 的onClick 事件
    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.ll_hide) {
            hideOneInputMethod(EditHideActivity.this, et_phone);
        }

    }

    private void hideOneInputMethod(Activity act, View v) {
        //實際上不只是et_other的軟鍵盤會關閉,其它編輯框的軟鍵盤也會關閉
        //因為方法內部去獲取視圖的WindowToken,這個Token在每個頁面上都是唯一的
        InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
    }

    private void hideAllInputMethod(Activity act) {
        InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm.isActive() == true) {
            imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }


    //獲取EditText 最大長度
    private int getMaxLength(EditText et) {
        int length = 0;
        try {
            InputFilter[] inputFilters = et.getFilters();
            //遍歷所有過濾器
            for (InputFilter filter : inputFilters) {
                Class<?> c = filter.getClass();
                //是否有InputFilter$LengthFilter 過濾器
                if (c.getName().equals("android.text.InputFilter$LengthFilter")) {
                    //Field 的命名空間為: java.lang.reflect.Field
                    Field[] f = c.getDeclaredFields();
                    //遍歷過濾器的所有字段
                    for (Field field : f) {
                        if (field.getName().equals("mMax")) {
                            field.setAccessible(true);
                            length = (Integer) field.get(filter);
                        }
                    }
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return length;
    }

    private class HideTextWatcher implements TextWatcher {
        private CharSequence mStr;
        private EditText mView;
        private int mMaxLength;

        //通過構造函數註入要監聽的EditText,持有EditText 便於事件裏的操作
        public HideTextWatcher(EditText v) {
            super();
            mView = v;

            //獲取EditText 的最大長度
            mMaxLength = getMaxLength(v);
        }

        //CharSequence charSequence:文本改變之前的內容
        //int i:文本開始改變時的起點位置,從0開始計算
        //int i1:要被改變的文本字數,即將要被替代的選中文本字數
        //int i2:改變後添加的文本字數,即替代選中文本後的文本字數
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        //CharSequence charSequence:文本改變之後的內容
        //int i:文本開始改變時的起點位置,從0開始計算
        //int i1:要被改變的文本字數,即已經被替代的選中文本字數
        //int i2:改變後添加的文本字數,即替代選中文本後的文本字數
        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            mStr = charSequence;
        }

        //Editable editable: 改變後的最終文本
        @Override
        public void afterTextChanged(Editable editable) {
            if (mStr == null || mStr.length() == 0) {
                return;
            } else if (mStr.length() == mMaxLength) {
                //輸入的字符達到最大時,隱藏輸入法
                hideAllInputMethod(EditHideActivity.this);
            }
        }
    }
}

  

3.layout 布局文件代碼

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.administrator.middledemo.EditHideActivity">

    <LinearLayout
        android:id="@+id/ll_hide"
        android:layout_width="368dp"
        android:layout_height="495dp"
        android:orientation="vertical"
        tools:layout_editor_absoluteY="8dp"
        tools:layout_editor_absoluteX="8dp">

        <View
            android:layout_width="match_parent"
            android:layout_height="20dp" />

        <EditText
            android:id="@+id/et_phone"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:maxLength="11"
            android:inputType="number"
            style="@style/text_normal"/>
    </LinearLayout>
</android.support.constraint.ConstraintLayout>

  

Android:隱藏輸入法軟鍵盤