Kotlin高仿微信-第53篇-添加好友

news2024/11/17 6:02:45

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

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

效果图:

实现代码:

<?xml version="1.0" encoding="utf-8"?>
<layout>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="true"
    android:focusable="true"
    android:background="@drawable/wc_base_bg">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/search_details_toplayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white"
        android:paddingVertical="50dp"
        android:layout_marginTop="20dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent">

        <androidx.appcompat.widget.AppCompatImageView
            android:id="@+id/search_details_icon"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:layout_marginStart="14dp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            android:src="@drawable/contacts_default_icon"/>

        <androidx.appcompat.widget.AppCompatTextView
            android:id="@+id/search_details_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintStart_toEndOf="@+id/search_details_icon"
            app:layout_constraintTop_toTopOf="@+id/search_details_icon"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="10dp"
            android:textColor="@color/black"
            android:textStyle="bold"
            android:textSize="26sp"
            android:text="顺宏"/>

        <androidx.appcompat.widget.AppCompatTextView
            android:id="@+id/search_details_account"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintStart_toEndOf="@+id/search_details_icon"
            app:layout_constraintBottom_toBottomOf="@+id/search_details_icon"
            android:layout_marginLeft="10dp"
            android:layout_marginBottom="10dp"
            android:textColor="@color/gray"
            android:textSize="18sp"
            android:text="账号:"/>

    </androidx.constraintlayout.widget.ConstraintLayout>

    <androidx.appcompat.widget.AppCompatTextView
        android:id="@+id/search_details_add"
        app:layout_constraintTop_toBottomOf="@+id/search_details_toplayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:paddingVertical="20dp"
        android:gravity="center"
        android:textColor="@color/blue"
        android:background="@color/white"
        android:textSize="20sp"
        android:text="添加到通讯录"/>

</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

/**
 * Author : wangning
 * Email : maoning20080809@163.com
 * Date : 2022/4/22 20:01
 * Description : 查询朋友详情-添加到通讯录
 */
class SearchFriendsDetailsFragment : BaseDataBindingFragment<WcFragmentContactsSearchDetailsBinding>() {

    override fun getLayoutRes()= R.layout.wc_fragment_contacts_search_details

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        super.builder().setTitleContent(R.string.wc_base_top_add_friends)

        //var account = arguments?.getString("account")?:"默认值demo1"
        var userBean = arguments?.getSerializable("userbean") as UserBean
        TagUtils.d("接收的值:${userBean}")
        search_details_add.setOnClickListener {
            if(!NetWorkUtils.isNetworkConnected()){
                ToastUtils.makeText(R.string.wc_base_network_error)
            } else {
                showLoadingDialog()
                addFriend(userBean?.account)
            }
        }

        userBean.let {
            search_details_account.text = "账号:${it.account}"
            search_details_name.text = "${it.nickName}"
            //var avatar = if(TextUtils.isEmpty(it.avatar)) "" else it.avatar
            var avatar = it.avatar ?:""
            TagUtils.d("头像:${avatar}")
            GlideUtils.load(search_details_icon, CommonUtils.Base.getReallyImage(avatar))
        }

    }

    //添加好友
    fun addFriend(toAccount : String){
        CoroutineScope(Dispatchers.IO).launch {
            var result = UserRepository.getUserServer(toAccount)
            if(result.isSuccess){
                //插入朋友账户到用户表
                UserRepository.insertUser(GsonUtils.getUserBean(result.data!!))
                //插入朋友账户到通讯录表
                var fromAccount = DataStoreUtils.getAccount()
                var contactsBean = ContactsBean(fromAccount, toAccount)
                ContactsRepository.insertContactsLocal(contactsBean)
                ContactsRepository.insertContactsServer(contactsBean)
                //先保证本地数据库有好友账户信息, 再关联xmpp账户,否则很容易出现xmpp成功了,本地数据库没数据。
                var subscription = Presence(Presence.Type.subscribe)
                subscription.to = toAccount +"@" + BaseUtils.SERVER_NAME
                var connection = WcApp.getXmppConnection()
                var roster = connection.roster
                roster.setSubscriptionMode(Roster.SubscriptionMode.accept_all)
                TagUtils.d("我的添加好友:${toAccount}")
                //添加好友
                roster.createEntry(toAccount +"@" + BaseUtils.SERVER_NAME, toAccount, null)
                connection.sendPacket(subscription)
                //刷新好友列表
                EventBus.getDefault().post(EventMsgBean(EventMsgBean.TYPE_REFRESH_CONTACTS))
                CoroutineScope(Dispatchers.Main).launch {
                    ToastUtils.makeText(requireActivity(), "添加好友:${toAccount}")
                    Navigation.findNavController(search_details_add).popBackStack()
                }
            } else {
                CoroutineScope(Dispatchers.Main).launch {
                    ToastUtils.makeText(R.string.wc_add_friend_failure)
                }
            }
            dismissLoadingDialog()
        }
    }

    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()
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/55526.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数商云SRM系统询比价有何优势?供应商平台助力汽车零部件企业快速查找供应商

随着中国汽车行业的高速发展、汽车保有量的增加以及汽车零部件市场的扩大&#xff0c;我国汽车零部件行业得到了迅速发展&#xff0c;增长速度整体高于我国整车行业。数据显示&#xff0c;我国汽车零部件的销售收入从2016年3.46万亿元增长至2020年的4.57万亿元&#xff0c;年均…

世界杯——手动为梅西标名

梅西的铁粉来集赞啦。 今天带来了一个为图片添加字样的小功能&#xff0c;我们的测试目标图片是&#xff1a; 我们的测试目标是&#xff1a; 我们使用的是Python语言&#xff0c;使用了Image包用作图片处理&#xff0c;matplotlib包用作坐标查阅&#xff0c;这个坐标还是很好看…

微服务框架 SpringCloud微服务架构 8 Gateway 网关 8.5 全局过滤器

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构8 Gateway 网关8.5 全局过滤器8.5.1 全局过滤器 GlobalFilter8.5.2 案例8.…

segmentation

(用于医学图像分割的金字塔医学transformer) Pyramid Medical Transformer for Medical Image Segmentation 基于CNN的模型通过低效地堆叠卷积层来捕获长期依赖性&#xff0c;但基于注意力的模型明确地构建了所有范围的关系。然而&#xff0c;为全局关系分配可学习参数是昂贵…

WebAPI项目搭建及其发布测试

目录 1.创建项目 2.配置 3.发布 4.测试页面 1.创建项目 &#xff08;1&#xff09;创建ASP.NET Web应用程式&#xff0c;如下图&#xff1a; &#xff08;2&#xff09;选择Empty,勾选Web API&#xff0c;点击确定创建&#xff0c;如下图&#xff1a; &#xff08;3&#x…

解决Netty那些事儿之Reactor在Netty中的实现(创建篇)-上

本系列Netty源码解析文章基于 4.1.56.Final版本 在上篇文章深入讲解Netty那些事儿之从内核角度看IO模型中我们花了大量的篇幅来从内核角度详细讲述了五种IO模型的演进过程以及ReactorIO线程模型的底层基石IO多路复用技术在内核中的实现原理。 最后我们引出了netty中使用的主从…

代码随想录刷题day52 300.最长递增子序列;674. 最长连续递增序列;718. 最长重复子数组

代码随想录刷题day52 300.最长递增子序列&#xff1b;674. 最长连续递增序列&#xff1b;718. 最长重复子数组 二维dp的初次应用&#xff0c;关于子序列的一系列问题。 300.最长递增子序列 300. 最长递增子序列 - 力扣&#xff08;Leetcode&#xff09; 子序列的一个入门题…

java中set接口、哈希表、哈希值、HashSet、LinkedHashSet、方法的可变参数

set接口&#xff1a; set接口和list接口一样&#xff0c;都是继承于Collection接口&#xff0c;它与Collection接口中的方法基本一致。特点&#xff1a;不允许存储重复元素&#xff0c;元素没有索引。它主要有两个实现类&#xff1a;HashSet&#xff08;具有哈希表结构&#x…

微服务框架 SpringCloud微服务架构 9 初识 Docker 9.2 Docker 与虚拟机的差别

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构9 初识 Docker9.2 Docker 与虚拟机的差别9.2.1 Docker 与虚拟机9.2.2 总结…

基于Android的二维码识别系统的研究与实现(eclipse开发)

目 录 1 Android系统开发背景与意义 1 1.1 Android系统平台的出现 1 1.2 Android系统的发展 1 1.3 Android系统架构的介绍 1 1.4 Android开放系统 3 1.5 Android系统的特点 3 2 二维码识别系统背景介绍 3 2.1 二维码识别系统背景 3 2.1.1 二维码技术产生的背景 3 2.1.2 二维码分…

图像压缩原理-JPEG

搬来一个基础啊 给自己看~~ 非技术指正勿扰 图像的格式有很多种&#xff0c;比如PNG&#xff0c;JPEG等等&#xff0c;但当我们把一张图用工具变成各种其他格式时&#xff0c;其在计算机文件系统显示的文件大小各不一样&#xff0c;但是当你打开显示时&#xff0c;从视觉角度…

Android进阶之路 - Json解析异常

在App与H5交互时&#xff0c;有一个调原生分享的需求&#xff0c;交互方面没有问题&#xff0c;因为分享需要多值&#xff0c;所以采用json进行传递&#xff0c;在app接收进行解析时遇到了这个解析异常 Value &#xfeff; of type java.lang.String cannot be converted to JS…

【操作系统一】图解TCP/IP模型+实战

【操作系统一】OSI模型和TCP/IP模型一、OSI模型1、什么是OSI模型2、osi七层参考模型3、我更想介绍TCP/IP模型二、TCP/IP模型1、TCP/IP模型起源2、TCP/IP模型是五层还是四层&#xff1f;3、两层TCP/IP模型4、传输层&#xff08;也叫传输控制层&#xff09;4.1 TCP4.3、三次握手4…

【算法面试题汇总】LeetBook列表的算法面试题汇总---动态规划题目及答案

整理不易留个小心心呗&#x1f970; 如果有更好的或者是我有错的地方还请各位大佬指出哦 有些是copy的还望不要介意 动态规划至少有k个重复字符的最长子串二叉树中的最大路径和最长连续序列打家劫舍完全平方数最长上升子序列*零钱兑换矩阵中的最长递增路径至少有k个重复字符的最…

java计算机毕业设计ssm民宿管理系统设计7lky4(附源码、数据库)

java计算机毕业设计ssm民宿管理系统设计7lky4&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

Linux服务器上Neo4j的安装、迁移

目录 1、环境 2、下载 3、修改配置 4、启动及其他命令 5、客户端访问&#xff1a; 6、数据迁移 1、环境 Neo4j是基于Java的图形数据库&#xff0c;运行Neo4j需要启动JVM进程&#xff0c;因此必须安装JAVA SE的JDK。 neo4j版本&#xff1a;neo4j-community-3.5.6 2、下…

使用 Learner Lab - 使用 API Gateway 触发 AWS Lambda

使用 Learner Lab - 使用 API Gateway 触发 AWS Lambda AWS Academy Learner Lab 是提供一个帐号让学生可以自行使用 AWS 的服务&#xff0c;让学生可以在 100 USD的金额下&#xff0c;自行练习所要使用的 AWS 服务&#xff0c;如何进入 Learner Lab 请参考 使用 Learner Lab …

第十三章 DFS与BFS(保姆级教学!!超级详细的图示!!)

第十三章 DFS与BFS一、深度优先搜索1、什么是DFS&#xff1f;2、DFS代码模板&#xff08;1&#xff09;问题&#xff1a;&#xff08;2&#xff09;分析&#xff1a;&#xff08;3&#xff09;模板&#xff1a;3、DFS代码分析二、广度优先搜索1、什么是BFS&#xff1f;2、BFS代…

就是把一个数组中相同类别数据,组成新的数组

效果图如上&#xff0c;就是把一个数组中相同类别数据&#xff0c;组成新的数组&#xff0c;每个数组最后加一个空对象&#xff0c;对象对应的格式要做些许改变 分店 品牌 业绩(元) 订单个数 单值(元) {{item.shopname}} {{item.shopname}} {{item.shopname}} {{item.shopname}…

《InnoDB引擎九》InnoDB关键特性-自适应哈希索引

InnoDB 关键特性 InnoDB存储引擎的关键特性包括&#xff1a; Insert Buffer (插入缓冲)Double Write (两次写)Adaptive Hash Index (自适应哈希索引)Async IO (异步IO)Flush Neighbor Page (刷新领接页) 这些特性为InnoDB存储引擎带来了更好的性能以及更高的可靠性。 自适应哈…