Kotlin高仿微信-第17篇-单聊-转账

2023-12-23 10:59

本文主要是介绍Kotlin高仿微信-第17篇-单聊-转账,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 Kotlin高仿微信-项目实践58篇详细讲解了各个功能点,包括:注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。

Kotlin高仿微信-项目实践58篇,点击查看详情

效果图:

 

 

实现代码:

我的转账页面

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:app="http://schemas.android.com/apk/res-auto"xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="right"><androidx.constraintlayout.widget.ConstraintLayoutandroid:id="@+id/transfer_me_root_layout"android:layout_width="240dp"android:layout_height="90dp"android:background="@drawable/wc_redpacket_right_normal"><TextViewandroid:id="@+id/transfer_me_balance"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:text="0.01"android:textColor="#ffffff"android:textSize="16sp"android:textStyle="bold"android:layout_marginTop="2dp"android:maxLines="1"android:ellipsize="end"android:singleLine="true"app:layout_constraintTop_toTopOf="@+id/transfer_me_icon"app:layout_constraintStart_toEndOf="@+id/transfer_me_icon"/><TextViewandroid:id="@+id/transfer_me_content"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:text="你发起了一笔转账"android:textColor="#ffffff"android:textSize="12sp"app:layout_constraintTop_toBottomOf="@+id/transfer_me_balance"app:layout_constraintStart_toEndOf="@+id/transfer_me_icon"/><TextViewandroid:layout_width="match_parent"android:layout_height="0.2dp"android:layout_marginLeft="20dp"android:layout_marginRight="10dp"android:background="#ffffff"app:layout_constraintBottom_toTopOf="@+id/redpacket_tip"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/transfer_me_icon" /><TextViewandroid:id="@+id/redpacket_tip"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="20dp"android:layout_marginBottom="6dp"android:text="@string/wc_chat_transfer_tip"android:textColor="#d9d6c3"android:textSize="10sp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintStart_toStartOf="parent" /><androidx.appcompat.widget.AppCompatImageViewandroid:id="@+id/transfer_me_icon"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="20dp"android:layout_marginTop="12dp"android:src="@drawable/wc_chat_transfer_icon"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout></RelativeLayout>

好友的转账页面:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto"><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/transfer_other_root_layout"android:layout_width="240dp"android:layout_height="90dp"android:background="@drawable/wc_redpacket_left_normal"><androidx.appcompat.widget.AppCompatImageViewandroid:id="@+id/other_transfer_icon"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="18dp"android:layout_marginTop="10dp"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"android:background="@drawable/wc_chat_transfer_icon"/><TextViewandroid:id="@+id/transfer_other_balance"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="0.01"android:textSize="16sp"android:textColor="#ffffff"android:textStyle="bold"android:layout_marginTop="2dp"android:layout_marginLeft="10dp"app:layout_constraintStart_toEndOf="@+id/other_transfer_icon"app:layout_constraintTop_toTopOf="@+id/other_transfer_icon"/><TextViewandroid:id="@+id/transfer_other_content"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="请收款"android:textSize="12sp"android:textColor="#ffffff"android:textStyle="bold"android:layout_marginLeft="10dp"app:layout_constraintStart_toEndOf="@+id/other_transfer_icon"app:layout_constraintTop_toBottomOf="@+id/transfer_other_balance"/><TextViewandroid:layout_width="match_parent"android:layout_height="0.2dp"android:background="#ffffff"android:layout_marginLeft="20dp"android:layout_marginRight="10dp"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/other_transfer_icon"app:layout_constraintBottom_toTopOf="@+id/transfer_tip"/><TextViewandroid:id="@+id/transfer_tip"android:layout_width="wrap_content"android:layout_height="wrap_content"app:layout_constraintStart_toStartOf="parent"app:layout_constraintBottom_toBottomOf="parent"android:layout_marginBottom="6dp"android:layout_marginLeft="20dp"android:text="@string/wc_chat_transfer_tip"android:textSize="10sp"android:textColor="#d9d6c3"/></androidx.constraintlayout.widget.ConstraintLayout>
</layout>

package com.wn.wechatclientdemo.fragment.me.paymentimport android.os.Bundle
import android.view.View
import androidx.fragment.app.viewModels
import androidx.navigation.NavController
import androidx.navigation.fragment.findNavController
import com.wn.wechatclientdemo.R
import com.wn.wechatclientdemo.databinding.WcTransferMainBinding
import com.wn.wechatclientdemo.fragment.base.BaseDataBindingFragment
import com.wn.wechatclientdemo.utils.*
import com.wn.wechatclientdemo.view.BaseDialogUtils
import com.wn.wechatclientdemo.viewmodel.ChatViewModel
import com.wn.wechatclientdemo.viewmodel.UserViewModel
import kotlinx.android.synthetic.main.wc_transfer_main.*/*** Author : wangning* Email : maoning20080809@163.com* Date : 2022/5/22 16:43* Description : 查看转账详情*/
class TransferDetailsFragment : BaseDataBindingFragment<WcTransferMainBinding>(){override fun getLayoutRes() = R.layout.wc_transfer_mainprivate val userViewModel: UserViewModel by viewModels()private val chatViewModel: ChatViewModel by viewModels()private var navController : NavController? = nullprivate var balance: Float = 0.0fprivate var messageId = ""private var toUser = ""override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)super.builder().setTitleContent(R.string.wc_base_top_transfer)arguments?.let {toUser = it.get(CommonUtils.QRCommon.TO_USER) as StringmessageId = it.get(CommonUtils.Chat.MESSAGE_ID) as Stringvar balanceStr  = it.get(CommonUtils.QRCommon.TRANSFER_BALANCE) as StringTagUtils.d("转账:${toUser}, ${messageId}, ${balanceStr}")balance = balanceStr.toFloat()trans_main_balance.text = CommonUtils.Base.getFormatBalanceUnit(balance)}navController = findNavController()var account = DataStoreUtils.getAccount()var userBean = userViewModel.getUserLocalAsync(toUser)var chatBean = chatViewModel.getChatByMessageIdAsync(messageId)trans_main_time.text = CommonUtils.Date.getCurrentDate(chatBean.addTime)if(account.equals(toUser)){if(chatBean.isClick == 1){//已经领取trans_main_icon.setImageResource(R.drawable.wc_transfer_time_complete)trans_main_name.text = BaseUtils.getString(R.string.wc_transfer_receive_other)trans_main_receive.visibility = View.GONE} else {//待收款trans_main_name.text = BaseUtils.getString(R.string.wc_transfer_waitfor_other)trans_main_receive.visibility = View.VISIBLE}} else {trans_main_name.text = BaseUtils.getString(R.string.wc_transfer_name_me, userBean.nickName)trans_main_receive.visibility = View.GONE}userViewModel.balanceLiveData.observe(viewLifecycleOwner){dismissLoadingDialog()if(it >0){chatViewModel.updateChatClickByMessageIdLocal(1, messageId)navController?.popBackStack()} else {TagUtils.d("收款失败!")}}trans_main_receive.setOnClickListener {if(balance < 0){ToastUtils.makeText("转账金额不能小于0")} else {showLoadingDialog()userViewModel.updateBalanceServer(toUser, CommonUtils.User.OPERATOR_PLUS, balance)}}}override fun onDestroy() {super.onDestroy()}private var loadingUtils : BaseDialogUtils? = null//显示加载对话框private fun showLoadingDialog(){loadingUtils = BaseDialogUtils(requireActivity())loadingUtils!!.builder().hideCancel().hideConfirm().setCancelable(true).setOnLoadingClick(object : BaseDialogUtils.OnLoadingClick{override fun onClickCancel() {ToastUtils.makeText(requireActivity(), "对话框取消按钮")}override fun onClickConfirm() {ToastUtils.makeText(requireActivity(), "对话框确定按钮")}})loadingUtils?.show()}//隐藏加载对话框private fun dismissLoadingDialog(){loadingUtils?.dismiss()}}

/*** Author : wangning* Email : maoning20080809@163.com* Date : 2022/5/22 16:43* Description : 转账*/
class PaymentTransferFragment : BaseDataBindingFragment<WcPaymentTransferBinding>(), MyDispatchTouchEventListener {override fun getLayoutRes() = R.layout.wc_payment_transferprivate val userViewModel : UserViewModel by viewModels()private var navController : NavController? = nulloverride fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)super.builder().setTitleContent("")var toUser = arguments?.get(CommonUtils.QRCommon.TO_USER) as StringBaseUtils.showAvatarRounded(toUser, transfer_icon, transfer_name, BaseUtils.getDimension(R.dimen.distance_10))DispatchTouchEventUtils.registerDispatchTouchListener(this)navController = findNavController()transfer_balance.showSoftInputOnFocus = falsenum_keyboard_view.initEditText(transfer_balance)num_keyboard_view.setValue(R.string.wc_transfer_txt)transfer_balance.setOnClickListener {num_keyboard_view.visibility = View.VISIBLE}num_keyboard_item_recharge.setOnClickListener {TagUtils.d("转账金额:${transfer_balance.text}")var result = transfer_balance.text.toString()if(TextUtils.isEmpty(result)){ToastUtils.makeText(requireActivity(), "请输入金额")return@setOnClickListener}//减掉服务器金额userViewModel.updateBalanceServer(toUser, CommonUtils.User.OPERATOR_MINUS, transfer_balance.text.toString().toFloat())navController?.previousBackStackEntry?.savedStateHandle?.set(CommonUtils.QRCommon.TRANSFER_BALANCE, transfer_balance.text.toString().toFloat())//弹出的id为fragment,不能为actionnavController?.popBackStack()}}override fun onDestroy() {super.onDestroy()DispatchTouchEventUtils.unregisterDispatchTouchListener(this)}override fun dispatchTouchEvent(ev: MotionEvent) {if (ev.action == MotionEvent.ACTION_DOWN) {if (SoftInputUtils.isInput(transfer_balance, ev)) {num_keyboard_view?.visibility = View.GONE}}}override fun onResume() {super.onResume()transfer_balance.isFocusableInTouchMode = truetransfer_balance.requestFocus()transfer_balance.setOnKeyListener { view, i, keyEvent ->if (i == KeyEvent.KEYCODE_BACK && keyEvent.getAction() == KeyEvent.ACTION_DOWN) {if(num_keyboard_view.visibility == View.VISIBLE){hideNumKeyboardView()true} else {false}} else {false}}}private fun hideNumKeyboardView(){num_keyboard_view.visibility = View.GONE}private fun showNumKeyboardView(){num_keyboard_view.visibility = View.VISIBLE}}

//发送文本、红包、表情
private fun sendMessage(chatBean: ChatBean){if(chatBean == null){ToastUtils.makeText(requireActivity(), "发送信息不能为空")return}var content = chatBean.contentif(TextUtils.isEmpty(content)){ToastUtils.makeText(requireActivity(), "发送信息不能为空")} else {ChatManagerUtils.getInstance().sendMessage(toUserId, content)chat_content.setText("")CoroutineScope(Dispatchers.IO).launch {if(chatBean.contentType == ChatBean.CONTENT_TYPE_REDPACKET){var content = chatBean.contentchatBean.content = CommonUtils.Chat.getRedpacket(content).toString()} else if(chatBean.contentType == ChatBean.CONTENT_TYPE_TRANSFER){var content = chatBean.contentchatBean.content = CommonUtils.Chat.getTransfer(content).toString()}ChatRepository.insertChat(chatBean)}refreshBase(chatBean)}
}/*** 刷新发送、接收聊天信息* @param chatBean ChatBean*/
private fun refreshBase(chatBean: ChatBean){CoroutineScope(Dispatchers.Main).launch {//chatViewModel.insertChat(chatBean)TagUtils.d("ChatFragment refreshBase 刷新聊天信息 ")adapter.refresh(chatBean)if(chatBean.contentType == ChatBean.CONTENT_TYPE_LOCATION){delay(200)}swipe_target.scrollToPosition(adapter.itemCount -1)}
}

 

 

这篇关于Kotlin高仿微信-第17篇-单聊-转账的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/527794

相关文章

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

uniapp设置微信小程序的交互反馈

链接:uni.showToast(OBJECT) | uni-app官网 (dcloud.net.cn) 设置操作成功的弹窗: title是我们弹窗提示的文字 showToast是我们在加载的时候进入就会弹出的提示。 2.设置失败的提示窗口和标签 icon:'error'是设置我们失败的logo 设置的文字上限是7个文字,如果需要设置的提示文字过长就需要设置icon并给

17 通过ref代替DOM用来获取元素和组件的引用

重点 ref :官网给出的解释是: ref: 用于注册对元素或子组件的引用。引用将在父组件的$refs 对象下注册。如果在普通DOM元素上使用,则引用将是该元素;如果在子组件上使用,则引用将是组件实例: <!-- vm.$refs.p will be the DOM node --><p ref="p">hello</p><!-- vm.$refs.child will be the c

react笔记 8-17 属性绑定 class绑定 引入图片 循环遍历

1、绑定属性 constructor(){super()this.state={name:"张三",title:'我是一个title'}}render() {return (<div><div>aaaaaaa{this.state.name}<div title={this.state.title}>我是一个title</div></div></div>)} 绑定属性直接使用花括号{}   注

基于微信小程序与嵌入式系统的智能小车开发(详细流程)

一、项目概述 本项目旨在开发一款智能小车,结合微信小程序与嵌入式系统,提供实时图像处理与控制功能。用户可以通过微信小程序远程操控小车,并实时接收摄像头采集的图像。该项目解决了传统遥控小车在图像反馈和控制延迟方面的问题,提升了小车的智能化水平,适用于教育、科研和娱乐等多个领域。 二、系统架构 1. 系统架构设计 本项目的系统架构主要分为以下几个部分: 微信小程序:负责用户界面、控制指令的

微信小程序uniappvue3版本-控制tabbar某一个的显示与隐藏

1. 首先在pages.json中配置tabbar信息 2. 在代码根目录下添加 tabBar 代码文件 直接把微信小程序文档里面的四个文件复制到自己项目中就可以了   3. 根据自己的需求更改index.js文件 首先我这里需要判断什么时候隐藏某一个元素,需要引入接口 然后在切换tabbar时,改变tabbar当前点击的元素 import getList from '../

微信小程序(一)数据流与数据绑定

一、单向数据流和双向数据流 1、单项数据流:指的是我们先把模板写好,然后把模板和数据(数据可能来自后台)整合到一起形成HTML代码,然后把这段HTML代码插入到文档流里面 优点:数据跟踪方便,流向单一,追寻问题比较方便【主要体现:微信小程序】。 缺点:就是写起来不太方便,如果修改UI界面数据需要维护对应的model对象 2、双向数据流:值和UI是双向绑定的,大家都知道,只要UI里面的值发生

微信小程序学习网站

小程序--柯神博客 http://www.cnblogs.com/nosqlcoco 案例地址: https://github.com/cocoli/weixin_smallexe/tree/master/weixin_demo/pages/component/uploadfile

分享一个基于uniapp科技馆服务微信小程序 博物馆管理小程序(源码、调试、LW、开题、PPT)

💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流! 💕💕学习资料、程序开发、技术解答、文档报告 💕💕如需要源码,可以扫取文章下方二维码联系咨询 💕💕Java项目 💕💕微信小程序项目 💕💕Android项目 �

flutter开发实战-flutter build web微信无法识别二维码及小程序码问题

flutter开发实战-flutter build web微信无法识别二维码及小程序码问题 GitHub Pages是一个直接从GitHub存储库托管的静态站点服务,‌它允许用户通过简单的配置,‌将个人的代码项目转化为一个可以在线访问的网站。‌这里使用flutter build web来构建web发布到GitHub Pages。 最近通过flutter build web,通过发布到GitHu