0


Android Studio Kotlin 简单实现微信主界面UI

准备编写环境 Y v Y

操作系统:

windows10/11

  1. Android Studio 属性

文件版本 2023.2.0.0

产品版本 2023.2.0.AI-232.10227.8.2321.BUILD_NUMBER

  1. JAVA属性:

java version "17.0.10" 2024-01-16 LTS

  1. Java(TM) SE Runtime Environment (build 17.0.10+11-LTS-240)
  2. Java HotSpot(TM) 64-Bit Server VM (build 17.0.10+11-LTS-240, mixed mode, sharing)

Android Studio版本不需要跟我的一样,只要检查好JAVA属性(版本)就ok了

  1. win+R,打开CMD命令窗口,输入 java -version 查看java版本是否1.17 版本(或者高过)

开始新建项目

1、选择新建一个项目 New Project,在 Templates 选择到 Phone and Tablet

* (一般这里不用选择,一进来默认就选定了)*

* *2、找到并选择 Bottom Navigition Views Activity,然后下一步Next。

  1. 3、设置项目属性*(具体如下)*,设置完成之后点击 Finish 就可以
    1. (在新建过程尽量不要动这个窗口<最小化也行>,可能建项目的过程有些慢)
    2. ** 如果想省事的直接复制我的代码成功运行,项目名字尽量要跟我的一样 WeChat
    3. 如果你要坚持要自己名字的,那你注意我的代码出现 wechat 时看看需不需要更改*
    4. SDK如果想用低版本的,比如:我想用Android 10,记得在Minimum SDK下更改版本

4、以下就是整个项目的全貌,我展开的都是需要经常用的到文件

  1. 5、创建一个 Android 模拟器 运行项目的时候要使用

一、点击Device Manger 在右上角标题

** 二、点击那个 + 号**

三、选择模拟器,一般我选择的是 Pixel 模拟器(这个看个人习惯)

四、点击下一步 ,这个一定要选择 UpsideDownCake,最后点击 Finish

这样Android 模拟器就新建好了,这个项目也就新建好了

准备开始构建项目

** 1、找到 res/values/themes.xml*(后缀 后面 有个night不要选择),然后进行修改,shift+F10 运行一下*

  1. <resources xmlns:tools="http://schemas.android.com/tools">
  2. <!-- Base application theme. -->
  3. <style name="Theme.WeChat" parent="Theme.AppCompat">
  4. <!-- Primary brand color. -->
  5. <item name="colorOnPrimary">@color/white</item>
  6. <item name="colorOnSecondary">@color/black</item>
  7. </style>
  8. </resources>

2、将自己的图标(就是底部导航栏的图标)放到 res/drawable 文件目录下

    1. (具体路径查询看下方)这些是我在iconmonstr网站下载 下载格式 .PNG*


查看res/drawable路径查看res/drawable路径

** **

** 3、**找到 res/menu/bottom_nav_menu.xml 文件 进行修改

    1. (这时候运行一下,如果模拟器能显示出来界面,导航栏多了个东西,就差不多可以了,不过导航栏却动不了,这个是正常的,因为还没有设置到它)*
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android">
  3. <item
  4. android:id="@+id/navigation_WeChat"
  5. android:icon="@drawable/message"
  6. android:title="微信" />
  7. <item
  8. android:id="@+id/navigation_Friend"
  9. android:icon="@drawable/friend"
  10. android:title="通讯录" />
  11. <item
  12. android:id="@+id/navigation_Search"
  13. android:icon="@drawable/find"
  14. android:title="发现" />
  15. <item
  16. android:id="@+id/navigation_Self"
  17. android:icon="@drawable/self"
  18. android:title="我" />
  19. </menu>

4、现在开始设置底部导航栏的跳转,

找到 res/navigation/mobile_navigation.xml 文件修改

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <navigation xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:id="@+id/mobile_navigation"
  6. app:startDestination="@+id/navigation_WeChat">
  7. <fragment
  8. android:id="@+id/navigation_WeChat"
  9. android:name="com.example.wechat.ui.home.HomeFragment"
  10. android:label="@string/title_home"
  11. tools:layout="@layout/fragment_home" />
  12. <fragment
  13. android:id="@+id/navigation_Friend"
  14. android:name="com.example.wechat.ui.dashboard.DashboardFragment"
  15. android:label="@string/title_dashboard"
  16. tools:layout="@layout/fragment_dashboard" />
  17. <fragment
  18. android:id="@+id/navigation_Search"
  19. android:name="com.example.wechat.ui.notifications.NotificationsFragment"
  20. android:label="@string/title_notifications"
  21. tools:layout="@layout/fragment_notifications" />
  22. <fragment
  23. android:id="@+id/navigation_Self"
  24. android:name="com.example.wechat.ui.home.HomeFragment"
  25. android:label="@string/title_home"
  26. tools:layout="@layout/fragment_home" />
  27. </navigation>

5、找到 MainActivity 进行修改

  1. package com.example.wechat
  2. import android.os.Bundle
  3. import com.google.android.material.bottomnavigation.BottomNavigationView
  4. import androidx.appcompat.app.AppCompatActivity
  5. import androidx.navigation.findNavController
  6. import androidx.navigation.ui.AppBarConfiguration
  7. import androidx.navigation.ui.setupActionBarWithNavController
  8. import androidx.navigation.ui.setupWithNavController
  9. import com.example.wechat.databinding.ActivityMainBinding
  10. class MainActivity : AppCompatActivity() {
  11. private lateinit var binding: ActivityMainBinding
  12. override fun onCreate(savedInstanceState: Bundle?) {
  13. super.onCreate(savedInstanceState)
  14. binding = ActivityMainBinding.inflate(layoutInflater)
  15. setContentView(binding.root)
  16. val navView: BottomNavigationView = binding.navView
  17. val navController = findNavController(R.id.nav_host_fragment_activity_main)
  18. // Passing each menu ID as a set of Ids because each
  19. // menu should be considered as top level destinations.
  20. val appBarConfiguration = AppBarConfiguration(
  21. setOf(
  22. R.id.navigation_WeChat,
  23. R.id.navigation_Friend,
  24. R.id.navigation_Search,
  25. R.id.navigation_Self
  26. )
  27. )
  28. setupActionBarWithNavController(navController, appBarConfiguration)
  29. navView.setupWithNavController(navController)
  30. }
  31. }

修改完成!直接运行项目running

恭喜你完成最最简单的微信主界面UI🎉🎉🎉

这似乎有点粗糙,那么接下来继续完善

(也就是把咖啡上别人的拉花,换成自己的拉花,内核没有什么大的改动)
主要都是 更改名字 为项目后面 操作流畅 打下基础

1、找到 res/values/string.xml 文件修改

  1. <resources>
  2. <string name="app_name">WeChat</string>
  3. <string name="title_WeiChat">WeChat</string>
  4. <string name="title_Friend">Friend</string>
  5. <string name="title_Search">Search</string>
  6. <string name="title_Self">Self</string>
  7. </resources>

2、修改 res/layout 文件夹下的文件

一、首先新建一个xml文件在 res/layout 目录下 fragment_self.xml

二、然后编写 fragment_self.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context=".ui.home.HomeFragment">
  8. <TextView
  9. android:id="@+id/text_self"
  10. android:layout_width="match_parent"
  11. android:layout_height="wrap_content"
  12. android:layout_marginStart="8dp"
  13. android:layout_marginTop="8dp"
  14. android:layout_marginEnd="8dp"
  15. android:textAlignment="center"
  16. android:textSize="20sp"
  17. app:layout_constraintBottom_toBottomOf="parent"
  18. app:layout_constraintEnd_toEndOf="parent"
  19. app:layout_constraintStart_toStartOf="parent"
  20. app:layout_constraintTop_toTopOf="parent" />
  21. </androidx.constraintlayout.widget.ConstraintLayout>

3、修改 ui 文件

一、修改self文件夹下文件名称(主要操作改名)如图


这时候运行一下项目看看是否改名成功,项目运行成功接着往下做

** 一般情况下这个Rename Variables只有一个选项直接勾选就可以,只不过因为我们是复制UI下同个文件夹,导致它判断出多个情况**

** 你可以根据这个顺序更改文件名:**

** home - > weichat**

** dashboard -> friend**

** notifiction - > search**

二、同理将ui下的另外三个文件夹都给改了名字

三、更改文件中的代码

  1. ----------------------------------------------------------------------------
  2. friendFragment文件::
  3. ----------------------------------------------------------------------------
  4. package com.example.wechat.ui.friend
  5. import android.os.Bundle
  6. import android.view.LayoutInflater
  7. import android.view.View
  8. import android.view.ViewGroup
  9. import android.widget.TextView
  10. import androidx.fragment.app.Fragment
  11. import androidx.lifecycle.ViewModelProvider
  12. import com.example.wechat.databinding.FragmentFriendBinding
  13. class friendFragment : Fragment() {
  14. private var _binding: FragmentFriendBinding? = null
  15. // This property is only valid between onCreateView and
  16. // onDestroyView.
  17. private val binding get() = _binding!!
  18. override fun onCreateView(
  19. inflater: LayoutInflater,
  20. container: ViewGroup?,
  21. savedInstanceState: Bundle?
  22. ): View {
  23. val friendViewModel =
  24. ViewModelProvider(this).get(friendViewModel::class.java)
  25. _binding = FragmentFriendBinding.inflate(inflater, container, false)
  26. val root: View = binding.root
  27. val textView: TextView = binding.textFriend
  28. friendViewModel.text.observe(viewLifecycleOwner) {
  29. textView.text = it
  30. }
  31. return root
  32. }
  33. override fun onDestroyView() {
  34. super.onDestroyView()
  35. _binding = null
  36. }
  37. }
  38. ----------------------------------------------------------------------------
  39. friendViewModel文件::
  40. ----------------------------------------------------------------------------
  41. package com.example.wechat.ui.friend
  42. import androidx.lifecycle.LiveData
  43. import androidx.lifecycle.MutableLiveData
  44. import androidx.lifecycle.ViewModel
  45. class friendViewModel : ViewModel() {
  46. private val _text = MutableLiveData<String>().apply {
  47. value = "This is Friend Fragment"
  48. }
  49. val text: LiveData<String> = _text
  50. }
  51. ---------------------------------------------------------------------------
  52. searchFragment文件::
  53. ---------------------------------------------------------------------------
  54. package com.example.wechat.ui.search
  55. import android.os.Bundle
  56. import android.view.LayoutInflater
  57. import android.view.View
  58. import android.view.ViewGroup
  59. import android.widget.TextView
  60. import androidx.fragment.app.Fragment
  61. import androidx.lifecycle.ViewModelProvider
  62. import com.example.wechat.databinding.FragmentSearchBinding
  63. class searchFragment : Fragment() {
  64. private var _binding: FragmentSearchBinding? = null
  65. // This property is only valid between onCreateView and
  66. // onDestroyView.
  67. private val binding get() = _binding!!
  68. override fun onCreateView(
  69. inflater: LayoutInflater,
  70. container: ViewGroup?,
  71. savedInstanceState: Bundle?
  72. ): View {
  73. val searchViewModel =
  74. ViewModelProvider(this).get(searchViewModel::class.java)
  75. _binding = FragmentSearchBinding.inflate(inflater, container, false)
  76. val root: View = binding.root
  77. val textView: TextView = binding.textSearch
  78. searchViewModel.text.observe(viewLifecycleOwner) {
  79. textView.text = it
  80. }
  81. return root
  82. }
  83. override fun onDestroyView() {
  84. super.onDestroyView()
  85. _binding = null
  86. }
  87. }
  88. ---------------------------------------------------------------------------
  89. searchViewModel文件::
  90. ---------------------------------------------------------------------------
  91. package com.example.wechat.ui.search
  92. import androidx.lifecycle.LiveData
  93. import androidx.lifecycle.MutableLiveData
  94. import androidx.lifecycle.ViewModel
  95. class searchViewModel : ViewModel() {
  96. private val _text = MutableLiveData<String>().apply {
  97. value = "This is Search Fragment"
  98. }
  99. val text: LiveData<String> = _text
  100. }
  101. ---------------------------------------------------------------------------
  102. selfFragment文件::
  103. ---------------------------------------------------------------------------
  104. package com.example.wechat.ui.self
  105. import android.os.Bundle
  106. import android.view.LayoutInflater
  107. import android.view.View
  108. import android.view.ViewGroup
  109. import android.widget.TextView
  110. import androidx.fragment.app.Fragment
  111. import androidx.lifecycle.ViewModelProvider
  112. import com.example.wechat.databinding.FragmentSelfBinding
  113. class selfFragment : Fragment() {
  114. private var _binding: FragmentSelfBinding? = null
  115. // This property is only valid between onCreateView and
  116. // onDestroyView.
  117. private val binding get() = _binding!!
  118. override fun onCreateView(
  119. inflater: LayoutInflater,
  120. container: ViewGroup?,
  121. savedInstanceState: Bundle?
  122. ): View {
  123. val selfViewModel =
  124. ViewModelProvider(this).get(selfViewModel::class.java)
  125. _binding = FragmentSelfBinding.inflate(inflater, container, false)
  126. val root: View = binding.root
  127. val textView: TextView = binding.textSelf
  128. selfViewModel.text.observe(viewLifecycleOwner) {
  129. textView.text = it
  130. }
  131. return root
  132. }
  133. override fun onDestroyView() {
  134. super.onDestroyView()
  135. _binding = null
  136. }
  137. }
  138. ---------------------------------------------------------------------------
  139. selfViewModel文件::
  140. ---------------------------------------------------------------------------
  141. package com.example.wechat.ui.self
  142. import androidx.lifecycle.LiveData
  143. import androidx.lifecycle.MutableLiveData
  144. import androidx.lifecycle.ViewModel
  145. class selfViewModel : ViewModel() {
  146. private val _text = MutableLiveData<String>().apply {
  147. value = "This is Self Fragment"
  148. }
  149. val text: LiveData<String> = _text
  150. }
  151. ---------------------------------------------------------------------------
  152. wechatFragment文件::
  153. ---------------------------------------------------------------------------
  154. package com.example.wechat.ui.wechat
  155. import android.os.Bundle
  156. import android.view.LayoutInflater
  157. import android.view.View
  158. import android.view.ViewGroup
  159. import android.widget.TextView
  160. import androidx.fragment.app.Fragment
  161. import androidx.lifecycle.ViewModelProvider
  162. import com.example.wechat.databinding.FragmentWechatBinding
  163. class wechatFragment : Fragment() {
  164. private var _binding: FragmentWechatBinding? = null
  165. // This property is only valid between onCreateView and
  166. // onDestroyView.
  167. private val binding get() = _binding!!
  168. override fun onCreateView(
  169. inflater: LayoutInflater,
  170. container: ViewGroup?,
  171. savedInstanceState: Bundle?
  172. ): View {
  173. val wechatViewModel =
  174. ViewModelProvider(this).get(wechatViewModel::class.java)
  175. _binding = FragmentWechatBinding.inflate(inflater, container, false)
  176. val root: View = binding.root
  177. val textView: TextView = binding.textWechat
  178. wechatViewModel.text.observe(viewLifecycleOwner) {
  179. textView.text = it
  180. }
  181. return root
  182. }
  183. override fun onDestroyView() {
  184. super.onDestroyView()
  185. _binding = null
  186. }
  187. }
  188. ---------------------------------------------------------------------------
  189. wechathViewModel文件::
  190. ---------------------------------------------------------------------------
  191. package com.example.wechat.ui.wechat
  192. import androidx.lifecycle.LiveData
  193. import androidx.lifecycle.MutableLiveData
  194. import androidx.lifecycle.ViewModel
  195. class wechatViewModel : ViewModel() {
  196. private val _text = MutableLiveData<String>().apply {
  197. value = "This is Wechat Fragment"
  198. }
  199. val text: LiveData<String> = _text
  200. }

5、更改 res/layout文件下文件

一、更改文件名字


修改前

** 请根据这个顺序更改文件名(不要到后面会混乱的):**

** home - > wechat**

** dashboard -> friend**

** notifiction - > search**

二、更改文件中的代码

  1. fragment_wechat.xml
  2. android:id="@+id/text_home"
  3. 改成-------
  4. android:id="@+id/text_wechat"
  5. -------------------------------------------------------
  6. fragment_friend.xml
  7. android:id="@+id/text_dashboard"
  8. 改成-------
  9. android:id="@+id/text_friend"
  10. -------------------------------------------------------
  11. fragment_search.xml
  12. android:id="@+id/text_notifications"
  13. 改成-------
  14. android:id="@+id/text_friend"

5、找到 res/navigation/moobile_navigation.xml 文件修改

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <navigation xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:id="@+id/mobile_navigation"
  6. app:startDestination="@+id/navigation_WeChat">
  7. <fragment
  8. android:id="@+id/navigation_WeChat"
  9. android:name="com.example.wechat.ui.wechat.wechatFragment"
  10. android:label="@string/title_WeiChat"
  11. tools:layout="@layout/fragment_wechat" />
  12. <fragment
  13. android:id="@+id/navigation_Friend"
  14. android:name="com.example.wechat.ui.search.searchFragment"
  15. android:label="@string/title_Friend"
  16. tools:layout="@layout/fragment_friend" />
  17. <fragment
  18. android:id="@+id/navigation_Search"
  19. android:name="com.example.wechat.ui.friend.friendFragment"
  20. android:label="@string/title_Search"
  21. tools:layout="@layout/fragment_search" />
  22. <fragment
  23. android:id="@+id/navigation_Self"
  24. android:name="com.example.wechat.ui.self.selfFragment"
  25. android:label="@string/title_Self"
  26. tools:layout="@layout/fragment_self" />
  27. </navigation>

恭喜你完成最简单的微信主界面UI🎉🎉🎉


本文转载自: https://blog.csdn.net/oncegun_QAQ/article/details/137642636
版权归原作者 叽里呱啦QAQ 所有, 如有侵权,请联系我们删除。

“Android Studio Kotlin 简单实现微信主界面UI”的评论:

还没有评论