(个人笔记)实现AI对话窗口,软键盘弹起输入框布局,对话列表上移

AndroidManifest如下,关键是软键盘配置:

<activity android:name=".mvp.view.AiChatActivity" android:windowSoftInputMode="adjustResize|stateHidden"/>

xml部分代码如下,关键是嵌套了2层LinearLayout:

<LinearLayout
    android:id="@+id/ll_ai_chat_bottom"
    android:background="@color/color_them_black_29293B"
    android:orientation="horizontal"
    android:gravity="bottom"
    android:layout_width="match_parent"
    android:padding="@dimen/dp_10"
    android:layout_height="wrap_content"
   >
    <ImageView
        android:id="@+id/iv_ai_chat_start"
        android:layout_width="47dp"
        android:layout_height="30dp"
        android:padding="6dp"
        android:src="@mipmap/icon_voice"
        android:background="@drawable/shape_3a3a4c_15dp"/>
    <LinearLayout
        android:background="@drawable/shape_bg_ai_chat_edit_view"
        android:gravity="bottom"
        android:orientation="horizontal"
        android:layout_marginStart="@dimen/dp_10"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <EditText
            android:id="@+id/et_ai_chat"
            android:text=""
            android:padding="7dp"
            android:layout_marginStart="7dp"
            android:background="@null"
            android:textSize="12sp"
            android:layout_width="0dp"
            android:textColor="@color/white"
            android:layout_weight="1"
            android:layout_height="wrap_content"/>
        <ImageView
            android:clickable="true"
            android:id="@+id/iv_ai_chat_send"
            android:layout_marginStart="@dimen/dp_10"
            android:layout_marginEnd="7dp"
            android:paddingStart="20dp"
            android:paddingBottom="6dp"
            android:paddingEnd="6dp"
            android:paddingTop="6dp"
            android:src="@mipmap/icon_send"
            android:layout_width="50dp"
            android:layout_height="30dp"/>
    </LinearLayout>
</LinearLayout>

activity部分代码如下,关键是布局变化监听、自动回到列表最底部:

// 获取 rootView,一般是最外层的布局
final View rootView = findViewById(android.R.id.content);

// 添加全局布局监听器
rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        // 获取当前窗口可见区域
        Rect rect = new Rect();
        rootView.getWindowVisibleDisplayFrame(rect);

        // 获取屏幕高度
        int screenHeight = rootView.getRootView().getHeight();

        // 计算出软键盘的高度
        int keypadHeight = screenHeight - rect.bottom;

        // 当键盘高度大于一定值时,说明键盘是可见的
        if (keypadHeight > screenHeight * 0.15) { // 一般认为键盘占屏幕高度的 15% 以上
            scrollToBottom();
            // 键盘弹出
            Log.d("Keyboard", "Keyboard is visible, height: " + keypadHeight);
        } else {
            // 键盘收起
            Log.d("Keyboard", "Keyboard is hidden");
        }
    }
});
private void scrollToBottom() {
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            if (!list.isEmpty()) {
                //先滑到最后一个,但是不一定是滑到底的
                rv.smoothScrollToPosition(list.size() - 1);
                //最后一个可见的item
                View childAt = manager.getChildAt(manager.findLastVisibleItemPosition());
                if (childAt != null) {
                    //至少有一个不可见了再滑,不然滑动会抽搐
                    if (manager.findFirstVisibleItemPosition() > 0) {
                        int height = childAt.getHeight();
                        //这里的偏移量,确保滑到底
                        manager.scrollToPositionWithOffset(manager.findLastVisibleItemPosition(), height);
                    }
                }
            }
        }
    }, 100);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值