Android学习记录039_软键盘问题的探究

方案:通过监控软键盘的高度变化,在其顶部添加输入控件从而达到在不影响原有布局的情况下,既能输入内容,又能看到输入控件。

一、效果图:

二、源代码

package com.study.softkeyboard;

import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.FrameLayout;

import com.blankj.utilcode.util.KeyboardUtils;
import com.blankj.utilcode.util.Utils;
import com.study.softkeyboard.define.InputView;

/**
 * 总结:点击可输入控件弹出软键盘与点击其它控件弹出软键盘的效果是不一样的
 * 按照getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING | WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);方式设置,
 * getViewTreeObserver无法检测到布局的变化。在清单文件设置android:windowSoftInputMode="stateAlwaysHidden|adjustNothing"也是一样的
 * <p>
 * 点击可输入控件弹出软键盘,会影响布局。
 * 点击其它控件弹出软键盘,不会影响布局。
 */
public class MainActivity extends AppCompatActivity {
    //输入控件
    private View inputLayout;

    public static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Utils.init(getApplication());
        super.onCreate(savedInstanceState);
        /**
         * 点击可输入控件时的效果:
         * 不改变布局,也不影响总体布局高度。不过如果输入框所在位置与屏幕底部之间的距离小于软键盘的高度,那么将会导致软键盘遮盖住输入框。
         *
         */
//        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING | WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
        /**
         * 点击可输入控件时的效果:
         * 1.输入控件与屏幕底部之间的距离不足以放下一个软件盘的高度时,改变布局但是不会修改总体布局的高度。可以看成在输入框后面添加了一个软件盘的布局,但是又不是完全是这样
         * 2.输入控件与屏幕底部之间的距离足以放下一个软键盘高度时,软件盘的弹起不会影响布局
         */
//        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN|WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
        /**
         * 点击可输入控件时的效果:
         * 不论输入控件与屏幕底部之间的距离是否足以放下一个软键盘的高度,软键盘的弹起都会改变布局,同时会修改总体布局的高度。
         * 软键盘布局会顶起软键盘弹起时会遮盖住的布局,同时折叠头部与尾部之间控件的布局
         */
//        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
        setContentView(R.layout.activity_main);

        dealKeyboard(getWindow(), this);
    }

    public void dealKeyboard(Window window, Activity activity) {
        // 监听软键盘的改变
        KeyboardUtils.registerSoftInputChangedListener(getWindow(), height -> {
            //如果软键盘显示
            boolean softInputVisible = KeyboardUtils.isSoftInputVisible(activity);
            if (softInputVisible) {
                addWindow(window, height);
            }
            if (inputLayout != null) {
                inputLayout.setVisibility(softInputVisible ? View.VISIBLE : View.GONE);
            }
        });


        findViewById(R.id.text_chat_content).setOnClickListener(v -> {
            KeyboardUtils.showSoftInput(this);
        });
    }

    /**
     * 监控软键盘弹出高度,设置控件
     *
     * @param window
     * @param height
     */
    public void addWindow(Window window, int height) {
        inputLayout = View.inflate(getApplicationContext(), R.layout.show_input_window_layout, null);
        FrameLayout layout = window.getDecorView().findViewById(android.R.id.content);
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        params.gravity = Gravity.BOTTOM;
        params.bottomMargin = height;
        layout.addView(inputLayout, params);
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        KeyboardUtils.unregisterSoftInputChangedListener(getWindow());
    }
}

源码地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值