Kotlin高仿微信-第16篇-单聊-红包
创始人
2024-03-04 15:49:38
0次

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

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

效果图:

 

 

实现代码:

我的红包页面


好友的红包页面:



/*** Author : wangning* Email : maoning20080809@163.com* Date : 2022/5/29 18:09* Description : 红包页面*/
class RedpacketFragment : BaseDataBindingFragment(),MyDispatchTouchEventListener {override fun getLayoutRes() = R.layout.wc_redpacket_mainprivate var navController : NavController? = nullcompanion object {const val REDPACKET_BALANCE = "redpacket_balance"}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)super.builder().setTitleContent(R.string.wc_base_top_redpacket)navController = findNavController()redpacket_balance.showSoftInputOnFocus = falsenum_keyboard_view.initEditText(redpacket_balance)num_keyboard_view.setRechargeBackground(R.drawable.wc_base_red_selector)num_keyboard_view.setValue(R.string.wc_confirm)num_keyboard_view.visibility = View.GONEredpacket_balance.setOnClickListener {showNumKeyboardView()SoftInputUtils.hideSoftInput(redpacket_greetings)}num_keyboard_item_recharge.setOnClickListener {hideNumKeyboardView()}redpacket_main_root.setOnClickListener {hideNumKeyboardView()SoftInputUtils.hideSoftInput(redpacket_greetings)}redpacket_greetings.setOnClickListener {hideNumKeyboardView()}redpacket_balance.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) {if(TextUtils.isEmpty(s)){redpacket_result_balance.text = ""} else {var balance = s.toString().toFloat()redpacket_result_balance.text = CommonUtils.Base.getFormatBalanceUnit(balance)}}override fun afterTextChanged(s: Editable?) {}})redpacket_ok.setOnClickListener {var balance = redpacket_balance.text?.toString()?.trim()!!if(TextUtils.isEmpty(balance)){ToastUtils.makeText(requireActivity(), "请输入红包金额")} else {TagUtils.d("发送红包:${balance}")if(!UserRepository.judgeBalanceAvailable(balance.toFloat())){ToastUtils.makeText(R.string.wc_payment_balance_available)} else {navController?.previousBackStackEntry?.savedStateHandle?.set(REDPACKET_BALANCE, redpacket_balance.text.toString().toFloat())navController?.popBackStack()}}}}override fun onResume() {super.onResume()redpacket_balance.isFocusableInTouchMode = trueredpacket_balance.requestFocus()redpacket_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}}}override fun dispatchTouchEvent(ev: MotionEvent) {if (ev.action == MotionEvent.ACTION_DOWN) {if (SoftInputUtils.isInput(rechange_balance, ev)) {num_keyboard_view?.visibility = View.GONE}}}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)}
}

插入本地数据库:

fun insertChat(chatBean: ChatBean) : Long {var chatListLocal = getAllChat()if(chatListLocal == null || chatListLocal.size < 1){return WcDatabase.getInstance(WcApp.getContext()).chatDao().insertChat(chatBean)}var resultList = chatListLocal.filter {it.messageId.equals(chatBean.messageId)}//过滤重复数据if(resultList.size > 0){return 0}return WcDatabase.getInstance(WcApp.getContext()).chatDao().insertChat(chatBean)
}

接收红包:

if(content.startsWith(CommonUtils.Chat.REDPACKET_MARK)){//发送红包, 去掉redpacket###写入数据库content = CommonUtils.Chat.getRedpacket(content).toString()var chatBean = CommonUtils.Chat.getChatBean(fromUser, toUser, userType, content, ChatBean.CONTENT_TYPE_REDPACKET, "",0.0, 0.0)ChatRepository.insertChat(chatBean)chatBean.isReceive = trueEventBus.getDefault().post(chatBean)
} 

 

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...