Android Studio 制作聊天界面实践(Kotlin版)

简介: Android Studio 制作聊天界面实践(Kotlin版)

Android Studio 制作聊天界面实践


我们先看看效果


image.png


先创建文件,在阿里网站找到聊天气泡图片,https://www.iconfont.cn/

image.png

把图片放入到drawable里面,在bulid.gradle中写入,classpath 'com.android.tools.build:gradle:3.4.1'(要用RecyclerView)



image.png


然后在activity_main.xml中写



<LinearLayoutandroid:layout_width="match_parent"android:layout_height="50dp"android:background="@drawable/message_left"/>


发现图片被强行压缩了

image.png

然后开始写activity_main.xml了


<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#d8e0e8"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="50dp"android:background="@drawable/message_left"/><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><EditTextandroid:id="@+id/inputText"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:hint="Type something here"android:maxLines="2"/><Buttonandroid:id="@+id/send"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Send"/></LinearLayout></LinearLayout>




然后在app -> src -> main -> com -> 里面新建Msg类文件 写入代码


packagecom.example.uibestpracticeclassMsg(valcontent: String, valtype: Int) {
companionobject {
constvalTYPE_RECEIVED=0constvalTYPE_SENT=1    }
}




然后在app -> src -> main -> res -> layout  -> 里面新建message_left_item.xml文件 写入代码


<?xmlversion="1.0"encoding="utf-8"?><FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="wrap_content"android:padding="10dp"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="left"android:background="@drawable/message_left"><TextViewandroid:id="@+id/leftMsg"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_margin="10dp"android:textColor="#fff"/></LinearLayout></FrameLayout>



然后在app -> src -> main -> res -> layout  -> 里面新建message_rigtn_item.xml文件 写入代码


<?xmlversion="1.0"encoding="utf-8"?><FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="wrap_content"android:padding="10dp"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="right"android:background="@drawable/message_right"><TextViewandroid:id="@+id/rightMsg"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_margin="10dp"android:textColor="#000"/></LinearLayout></FrameLayout>


然后在app -> src -> main -> com -> 里面新建MsgAdapter类文件、MsgViewHolder.kt、Result 写入代码

packagecom.example.uibestpracticeimportandroid.view.LayoutInflaterimportandroid.view.ViewGroupimportandroidx.recyclerview.widget.RecyclerViewclassMsgAdapter(valmsgList: List<Msg>) : RecyclerView.Adapter<MsgViewHolder>() {
overridefungetItemViewType(position: Int): Int {
valmsg=msgList[position]
returnmsg.type    }
overridefunonCreateViewHolder(parent: ViewGroup, viewType: Int) =if (viewType==Msg.TYPE_RECEIVED) {
valview=LayoutInflater.from(parent.context).inflate(R.layout.msg_left_item, parent, false)
LeftViewHolder(view)
    } else {
valview=LayoutInflater.from(parent.context).inflate(R.layout.msg_right_item, parent, false)
RightViewHolder(view)
    }
overridefunonBindViewHolder(holder: MsgViewHolder, position: Int) {
valmsg=msgList[position]
when (holder) {
isLeftViewHolder->holder.leftMsg.text=msg.contentisRightViewHolder->holder.rightMsg.text=msg.content         }
    }
overridefungetItemCount() =msgList.size}



packagecom.example.uibestpracticeimportandroid.view.Viewimportandroid.widget.TextViewimportandroidx.recyclerview.widget.RecyclerViewsealedclassMsgViewHolder(view: View) : RecyclerView.ViewHolder(view)
classLeftViewHolder(view: View) : MsgViewHolder(view) {
valleftMsg: TextView=view.findViewById(R.id.leftMsg)
}
classRightViewHolder(view: View) : MsgViewHolder(view) {
valrightMsg: TextView=view.findViewById(R.id.rightMsg)
}
packagecom.example.uibestpracticesealedclassResultclassSuccess(valmsg: String) : Result()
classFailure(valerror: Exception) : Result()
fungetResultMsg(result: Result) =when (result) {
isSuccess->result.msgisFailure->"Error is ${result.error.message}"}




最后修改MainActivity,写上代码


packagecom.example.uibestpracticeimportandroidx.appcompat.app.AppCompatActivityimportandroid.os.Bundleimportandroid.view.Viewimportandroidx.recyclerview.widget.LinearLayoutManagerimportkotlinx.android.synthetic.main.activity_main.*classMainActivity : AppCompatActivity(), View.OnClickListener {
privatevalmsgList=ArrayList<Msg>()
privatelateinitvaradapter: MsgAdapteroverridefunonCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
initMsg()
vallayoutManager=LinearLayoutManager(this)
recyclerView.layoutManager=layoutManagerif (!::adapter.isInitialized) {
adapter=MsgAdapter(msgList)
        }
recyclerView.adapter=adaptersend.setOnClickListener(this)
    }
overridefunonClick(v: View?) {
when (v) {
send-> {
valcontent=inputText.text.toString()
if (content.isNotEmpty()) {
valmsg=Msg(content, Msg.TYPE_SENT)
msgList.add(msg)
adapter.notifyItemInserted(msgList.size-1) // 当有新消息时,刷新RecyclerView中的显示recyclerView.scrollToPosition(msgList.size-1)  // 将RecyclerView定位到最后一行inputText.setText("") // 清空输入框中的内容                }
            }
        }
    }
privatefuninitMsg() {
valmsg1=Msg("Hello guy.", Msg.TYPE_RECEIVED)
msgList.add(msg1)
valmsg2=Msg("Hello. Who is that?", Msg.TYPE_SENT)
msgList.add(msg2)
valmsg3=Msg("This is Tom. Nice talking to you. ", Msg.TYPE_RECEIVED)
msgList.add(msg3)
    }
}



点击运行,ok完成了


image.png


相关文章
|
20天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
21天前
|
数据库 Android开发 开发者
构建高效Android应用:Kotlin协程的实践指南
【4月更文挑战第2天】随着移动应用开发的不断进步,开发者们寻求更流畅、高效的用户体验。在Android平台上,Kotlin语言凭借其简洁性和功能性赢得了开发社区的广泛支持。特别是Kotlin协程,作为一种轻量级的并发处理方案,使得异步编程变得更加简单和直观。本文将深入探讨Kotlin协程的核心概念、使用场景以及如何将其应用于Android开发中,以提高应用性能和响应能力。通过实际案例分析,我们将展示协程如何简化复杂任务,优化资源管理,并为最终用户提供更加流畅的体验。
|
22天前
|
Java Android开发 开发者
构建高效Android应用:Kotlin协程的实践与优化
在响应式编程范式日益盛行的今天,Kotlin协程作为一种轻量级的线程管理解决方案,为Android开发带来了性能和效率的双重提升。本文旨在探讨Kotlin协程的核心概念、实践方法及其在Android应用中的优化策略,帮助开发者构建更加流畅和高效的应用程序。通过深入分析协程的原理与应用场景,结合实际案例,本文将指导读者如何优雅地解决异步任务处理,避免阻塞UI线程,从而优化用户体验。
|
27天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
在开发高性能的Android应用时,选择合适的编程语言至关重要。近年来,Kotlin因其简洁性和功能性受到开发者的青睐,但其性能是否与传统的Java相比有所不足?本文通过对比分析Kotlin与Java在Android平台上的运行效率,揭示二者在编译速度、运行时性能及资源消耗方面的具体差异,并探讨在实际项目中如何做出最佳选择。
17 4
|
6天前
|
移动开发 Android开发 开发者
构建高效Android应用:采用Kotlin进行内存优化的策略
【4月更文挑战第18天】 在移动开发领域,性能优化一直是开发者关注的焦点。特别是对于Android应用而言,由于设备和版本的多样性,确保应用流畅运行且占用资源少是一大挑战。本文将探讨使用Kotlin语言开发Android应用时,如何通过内存优化来提升应用性能。我们将从减少不必要的对象创建、合理使用数据结构、避免内存泄漏等方面入手,提供实用的代码示例和最佳实践,帮助开发者构建更加高效的Android应用。
6 0
|
16天前
|
移动开发 API Android开发
构建高效Android应用:探究Kotlin协程的优势与实践
【4月更文挑战第7天】 在移动开发领域,性能优化和应用响应性的提升一直是开发者追求的目标。近年来,Kotlin语言因其简洁性和功能性在Android社区中受到青睐,特别是其对协程(Coroutines)的支持,为编写异步代码和处理并发任务提供了一种更加优雅的解决方案。本文将探讨Kotlin协程在Android开发中的应用,揭示其在提高应用性能和简化代码结构方面的潜在优势,并展示如何在实际项目中实现和优化协程。
|
25天前
|
Java Android开发
Android Studio的使用导入第三方Jar包
Android Studio的使用导入第三方Jar包
11 1
|
设计模式 自然语言处理 Java
使用Kotlin高效地开发Android App(五)完结篇
使用Kotlin高效地开发Android App(五)完结篇
442 0
|
Java Android开发 Kotlin
使用Kotlin高效地开发Android App(四)
使用Kotlin高效地开发Android App(四)
183 0
|
安全 Java Android开发
使用Kotlin高效地开发Android App(三)
使用Kotlin高效地开发Android App(三)
127 0