码迷,mamicode.com
首页 > 移动开发 > 详细

Android:隐藏输入法软键盘

时间:2017-08-22 18:41:31      阅读:305      评论:0      收藏:0      [点我收藏+]

标签:http   dma   ted   ati   ber   str   undle   declared   命名空间   

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:隐藏输入法软键盘

标签:http   dma   ted   ati   ber   str   undle   declared   命名空间   

原文地址:http://www.cnblogs.com/mojo/p/7412806.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!