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);
}