1、我們在聊天頁面時候,往往會遇到,鍵盤、表情、其他選擇切換時候頁面會出現掉下來再彈起問題,這是因為,我們切換時候,鍵盤異步導致內容View高度變化,頁面掉下來后,又被其他內容頂起這種很差視覺效果。
要解決這個問題,最簡單方法就是切換時候,將內容View高度固定然后去操作鍵盤顯示后再去釋放內容View高度。
2、這里我們提供具體思路
2.1xml布局:(FrameLayout + RecyclerView,是為了讓鍵盤彈起時候,RecyclerView有個向上平移效果)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><!-- 標題View --><androidx.constraintlayout.widget.ConstraintLayoutandroid:layout_width="match_parent"android:layout_height="?actionBarSize"></androidx.constraintlayout.widget.ConstraintLayout><!-- 聊天展示View android:layout_weight="1" 讓聊天內容填充剩下內容--><com.scwang.smart.refresh.layout.SmartRefreshLayoutandroid:id="@+id/smartRefreshLayout"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"app:srlEnableLoadMore="false"app:srlEnableRefresh="true"><!-- 添加FrameLayout 是為了讓鍵盤彈起時候,聊天內容(RecyclerView)平移上去效果--><FrameLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyler"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="bottom"android:overScrollMode="never"android:scrollbars="none"android:visibility="invisible" /></FrameLayout></com.scwang.smart.refresh.layout.SmartRefreshLayout><!-- 按鈕:發送、輸入框等View --><LinearLayoutandroid:id="@+id/button_input"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"></LinearLayout><!-- 圖片選擇、語音、視頻等View --><androidx.constraintlayout.widget.ConstraintLayoutandroid:id="@+id/other_select"android:layout_width="match_parent"android:layout_height="@dimen/common_dp_114"android:visibility="gone"></androidx.constraintlayout.widget.ConstraintLayout><!-- emotion 表情選擇View 這個是自定義View--><EmotionViewandroid:id="@+id/emotion"android:layout_width="match_parent"android:layout_height="wrap_content"android:visibility="gone" /></LinearLayout>
2.2:當鍵盤需要彈起鎖內容View高度(這里重點講解參數:height,height =?smartRefreshLayoutMaxHeight(聊天內容最大高度) - supportSoftInputHeight(鍵盤的高度),這樣做的目前就是讓鍵盤彈起時候,頁面感覺聊天內容View平移上效果)
private void viewLockHeight(int height) {LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) smartRefreshLayout.getLayoutParams();layoutParams.height = height == 0 ? smartRefreshLayout.getHeight() : height;layoutParams.weight = 0.0F;smartRefreshLayout.setLayoutParams(layoutParams);}
2.3:延遲釋放高度(設置 layoutParams.weight = 1.0F)
private void viewReleaseLockHeight(int delayMillis) {if (smartRefreshLayout != null) {smartRefreshLayout.postDelayed(new Runnable() {@Overridepublic void run() {if (smartRefreshLayout != null) {LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) smartRefreshLayout.getLayoutParams();layoutParams.height = LinearLayout.LayoutParams.MATCH_PARENT;layoutParams.weight = 1.0F;smartRefreshLayout.setLayoutParams(layoutParams);}}}, delayMillis == 0 ? 200L : delayMillis);}}
2.4:RecyclerView展示最后一條數據(切換、鍵盤、表情等)
public void recyclerStopScroll() {recyclerView.stopScroll();layoutManager.scrollToPositionWithOffset(0, 0);}
3:切換流程
界面正常展示(此時聊天內容界面最大高度展示)--->彈起鍵盤
①、RecyclerView停止所有事件recyclerStopScrol()
②、內容View鎖高??viewLockHeight(contentViewMaxHeight)
③、起鍵盤
④、延遲釋放高度viewReleaseLockHeight()
彈起鍵盤——>表情
①、RecyclerView停止所有事件recyclerStopScrol()
②、內容View鎖高??viewLockHeight(0)
③、收鍵盤
④、展示表情
⑤、延遲釋放高度viewReleaseLockHeight()
表情——>彈起鍵盤
①、RecyclerView停止所有事件recyclerStopScrol()
②、內容View鎖高??viewLockHeight(0)
③、彈起鍵盤
④、收起表情
⑤、延遲釋放高度viewReleaseLockHeight()