Android 微信聊天页面

 

记录一下关键点

布局最关键

<?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
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值