en经过几个项目的开发,对于Android 软键盘的一些常见问题和解决方案做一下总结。

键盘的显示与隐藏

先附上一个写好的工具类:

/** * Created by YBJ on 2016/1/14. * 显示键盘d工具类 */public class InputMethodUtils {    /** 显示软键盘 */    public static void showInputMethod(View view) {        InputMethodManager imm = (InputMethodManager) view.getContext()                                                          .getSystemService(Context.INPUT_METHOD_SERVICE);        if (imm != null) {            imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);        }    }    /** 隐藏软键盘 */    public static void showInputMethod(Context context) {        InputMethodManager imm = (InputMethodManager) context            .getSystemService(Context.INPUT_METHOD_SERVICE);        imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);    }    /** 多少时间后显示软键盘 */    public static void showInputMethod(final View view, long delayMillis) {        if (view==null)return;        // 显示输入法        view.postDelayed(new Runnable() {            @Override            public void run() {                InputMethodUtils.showInputMethod(view);            }        }, delayMillis);    }}

解决底部输入框与键盘覆盖冲突

/** * 解决底部输入框和软键盘的问题 * Created by geyifeng on 2017/5/17. */public class KeyboardPatch {    private Activity mActivity;    private View mDecorView;    private View mContentView;    private boolean flag = false;    private KeyboardPatch(Activity activity) {        this(activity, activity.findViewById(android.R.id.content));    }    private KeyboardPatch(Activity activity, View contentView) {        this.mActivity = activity;        this.mDecorView = activity.getWindow().getDecorView();        this.mContentView = contentView;        if (contentView.equals(activity.findViewById(android.R.id.content))) {            this.flag = false;        } else {            this.flag = true;        }    }    /**     * Patch keyboard patch.     *     * @param activity the activity     * @return the keyboard patch     */    public static KeyboardPatch patch(Activity activity) {        return new KeyboardPatch(activity);    }    /**     * Patch keyboard patch.     *     * @param activity    the activity     * @param contentView 界面容器,指定布局的根节点     * @return the keyboard patch     */    public static KeyboardPatch patch(Activity activity, View contentView) {        return new KeyboardPatch(activity, contentView);    }    /**     * 监听layout变化     */    public void enable() {//        mActivity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN//                | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);        mActivity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            mDecorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener);//当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时,所要调用的回调函数的接口类        }    }    /**     * 取消监听     */    public void disable() {//        mActivity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN//                | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);        mActivity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            mDecorView.getViewTreeObserver().removeOnGlobalLayoutListener(onGlobalLayoutListener);        }    }    private ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {        @Override        public void onGlobalLayout() {            Rect r = new Rect();            mDecorView.getWindowVisibleDisplayFrame(r); //获取当前窗口可视区域大小的            int height = mDecorView.getContext().getResources().getDisplayMetrics().heightPixels; //获取屏幕密度,不包含导航栏            int diff = height - r.bottom;            if (diff > 0) {                if (mContentView.getPaddingBottom() != diff) {                    if (flag || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && !OSUtils.isEMUI3_1())) {                        mContentView.setPadding(0, 0, 0, diff);                    } else {                        mContentView.setPadding(0, 0, 0, diff + TranslucentBar.getNavigationBarHeight(mActivity));                    }                }            } else {                if (mContentView.getPaddingBottom() != 0) {                    if (flag || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && !OSUtils.isEMUI3_1())) {                        mContentView.setPadding(0, 0, 0, 0);                    } else {                        mContentView.setPadding(0, 0, 0, TranslucentBar.getNavigationBarHeight(mActivity));                    }                }            }        }    };}

更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Android(安卓)API 中文 (53) —— BaseAdapter
  3. Android(安卓)实现拍照功能
  4. Android学习第四篇——使用绘图API自定义视图
  5. Android(安卓)UI绘制原理(一)
  6. android一些控件
  7. Android(安卓)容器控件
  8. Android让屏幕保持常亮,不熄屏的三种方法
  9. android关于AlertDialog加入EditText无法弹出键盘的问题

随机推荐

  1. Android(安卓)UI线程和非UI线程
  2. Android(安卓)的权限级别小记
  3. android mediaStore
  4. android 输入法弹出键盘把listview顶上去
  5. android: layout_alignParentRight androi
  6. Ubuntu 10.10从零开始建立android 2.2 fr
  7. Android(安卓)Context
  8. Android(安卓)控件ProgressBar进度条
  9. Android中状态栏的隐藏
  10. Android开发教程笔记完全版