记录一下关键点
布局最关键
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".index.detail.blank.MessageActivity">
<LinearLayout
android:id="@+id/root"
android:clipChildren="false"
android:clipToPadding="false"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<View
android:id="@+id/statusbar"
android:layout_width="match_parent"
android:layout_height="@dimen/dp10"
android:background="@color/skyblue" />
<TextView
android:id="@+id/tvTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/skyblue"
android:gravity="center"
android:paddingTop="@dimen/dp10"
android:paddingBottom="@dimen/dp10"
android:text="二狗子"
android:textColor="@color/black"
android:textSize="20sp" />
<!-- android:background="#F9F5F5"-->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">
<ImageView
android:id="@+id/ivBg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
android:src="@drawable/messagebg" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/llBot"
android:layout_weight="1"
android:orientation="vertical">
<com.scwang.smart.refresh.layout.SmartRefreshLayout
android:id="@+id/smartrefresh"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.scwang.smart.refresh.header.ClassicsHeader
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</com.scwang.smart.refresh.layout.SmartRefreshLayout>
</FrameLayout>
<LinearLayout
android:id="@+id/llBot"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="#D3D1D1"
android:orientation="horizontal">
<ImageView
android:layout_width="@dimen/dp40"
android:layout_height="@dimen/dp40"
android:layout_gravity="bottom"
android:padding="@dimen/dp8"
android:src="@mipmap/ic_launcher" />
<FrameLayout
android:id="@+id/etFrame"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp4"
android:layout_marginBottom="@dimen/dp4"
android:layout_weight="1">
<EditText
android:id="@+id/etInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="@dimen/dp4"
android:layout_marginTop="@dimen/dp4"
android:layout_marginRight="@dimen/dp4"
android:layout_marginBottom="@dimen/dp4"
android:background="@null"
android:clickable="true"
android:focusable="true"
android:maxHeight="@dimen/dp100"
android:textColor="@color/black"
android:textSize="18sp" />
</FrameLayout>
<ImageView
android:layout_width="@dimen/dp40"
android:layout_height="@dimen/dp40"
android:layout_gravity="bottom"
android:padding="@dimen/dp8"
android:src="@mipmap/ic_launcher" />
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom">
<ImageView
android:id="@+id/ivSetting"
android:layout_width="@dimen/dp40"
android:layout_height="@dimen/dp40"
android:padding="@dimen/dp8"
android:src="@mipmap/ic_launcher" />
<TextView
android:id="@+id/tvSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginRight="@dimen/dp8"
android:background="#4CAF50"
android:paddingLeft="@dimen/dp10"
android:paddingTop="@dimen/dp4"
android:paddingRight="@dimen/dp10"
android:paddingBottom="@dimen/dp4"
android:text="发送"
android:textSize="16sp"
android:visibility="gone" />
</FrameLayout>
</LinearLayout>
</RelativeLayout>
</LinearLayout>
</layout>
关键点2.底部输入框的高度
获取到底部总高度
//获取控件的试图观察者,以便通过试图观察者得到控件的宽高参数
val viewTreeObserver: ViewTreeObserver = bind!!.llBot.getViewTreeObserver()
//添加观察者监听
viewTreeObserver.addOnGlobalLayoutListener(object :
ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
//回调监听后首先移除该监听 占资源
bind!!.tvTitle.getViewTreeObserver().removeOnGlobalLayoutListener(this)
//得到高度
llBotheight = bind!!.llBot.getHeight()
}
})
bind!!.etInput.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
}
override fun afterTextChanged(s: Editable?) {
val toString = s.toString()
val trim = toString.trim()
if (!TextUtils.isEmpty(trim)) {
bind!!.tvSend.visibility = View.VISIBLE
} else {
bind!!.tvSend.visibility = View.GONE
}
val layoutParams = bind!!.llBot.layoutParams as RelativeLayout.LayoutParams
layoutParams.bottomMargin = layoutParams.height + keyboardHeight
bind!!.rv.scrollToPosition(mutableListOf.size - 1)
val ivBglayoutParams = bind!!.ivBg.layoutParams as RelativeLayout.LayoutParams
ivBglayoutParams.bottomMargin = bind!!.llBot.height - llBotheight
if (keyboardHeight == 0) {
val ivBglayoutParams = bind!!.ivBg.layoutParams as RelativeLayout.LayoutParams
ivBglayoutParams.bottomMargin = 0
}
}
})
bind!!.tvSend.setOnClickListener {
var toString = bind!!.etInput.text.toString()
if (TextUtils.isEmpty(toString)) {
return@setOnClickListener
}
var subInt = 0
for (i in toString.length - 1 downTo 0) {
if (TextUtils.equals("\n".toString(), toString.get(i).toString())) {
subInt = i
} else {
break
}
}
if (subInt != 0) {
toString = toString.subSequence(0, subInt) as String;
}
mutableListOf.add(SessTypebean(SessTypebean.TYPE1, SessionBean(toString)))
sessionAdapter.notifyItemRemoved(mutableListOf.size - 1)
bind!!.rv.scrollToPosition(mutableListOf.size - 1)
// 重置
bind!!.etInput.setText("")
}
override fun onResume() {
super.onResume()
KeyboardUtils.registerSoftInputChangedListener(window,
object : KeyboardUtils.OnSoftInputChangedListener {
override fun onSoftInputChanged(height: Int) {
keyboardHeight = height
val layoutParams = bind!!.llBot.layoutParams as RelativeLayout.LayoutParams
layoutParams.bottomMargin = height
bind!!.rv.scrollToPosition(mutableListOf.size - 1)
if (height == 0) {
val ivBglayoutParams = bind!!.ivBg.layoutParams as RelativeLayout.LayoutParams
ivBglayoutParams.bottomMargin = 0
}
}
})
}
override fun onPause() {
super.onPause()
KeyboardUtils.unregisterSoftInputChangedListener(window)
val layoutParams = bind!!.llBot.layoutParams as RelativeLayout.LayoutParams
layoutParams.bottomMargin = 0
}