更新代码
This commit is contained in:
parent
062bd2de0d
commit
e4f8cd1949
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="Android Studio default JDK" project-jdk-type="JavaSDK">
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" project-jdk-name="Android Studio default JDK" project-jdk-type="JavaSDK">
|
||||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectType">
|
<component name="ProjectType">
|
||||||
|
@ -6,11 +6,11 @@ apply plugin: 'kotlin-android'
|
|||||||
apply plugin: 'kotlin-kapt'
|
apply plugin: 'kotlin-kapt'
|
||||||
//apply plugin: 'realm-android'
|
//apply plugin: 'realm-android'
|
||||||
android {
|
android {
|
||||||
namespace 'com.navinfo.vivo'
|
namespace 'com.navinfo.volvo'
|
||||||
compileSdk 32
|
compileSdk 32
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "com.navinfo.vivo"
|
applicationId "com.navinfo.volvo"
|
||||||
minSdk 24
|
minSdk 24
|
||||||
targetSdk 32
|
targetSdk 32
|
||||||
versionCode 1
|
versionCode 1
|
||||||
@ -74,4 +74,6 @@ dependencies {
|
|||||||
// implementation "android.arch.lifecycle:extensions:1.1.1"
|
// implementation "android.arch.lifecycle:extensions:1.1.1"
|
||||||
// annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
|
// annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
|
||||||
implementation 'com.tencent.wcdb:wcdb-android:1.1-19'
|
implementation 'com.tencent.wcdb:wcdb-android:1.1-19'
|
||||||
|
implementation 'com.google.code.gson:gson:2.10'
|
||||||
|
implementation 'com.yanzhenjie.recyclerview:x:1.3.2'
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package com.navinfo.vivo
|
package com.navinfo.volvo
|
||||||
|
|
||||||
import androidx.test.platform.app.InstrumentationRegistry
|
import androidx.test.platform.app.InstrumentationRegistry
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
@ -19,6 +19,6 @@ class ExampleInstrumentedTest {
|
|||||||
fun useAppContext() {
|
fun useAppContext() {
|
||||||
// Context of the app under test.
|
// Context of the app under test.
|
||||||
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
|
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
|
||||||
assertEquals("com.navinfo.vivo", appContext.packageName)
|
assertEquals("com.navinfo.volvo", appContext.packageName)
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -4,16 +4,17 @@
|
|||||||
|
|
||||||
<application
|
<application
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
|
android:configChanges="locale"
|
||||||
android:dataExtractionRules="@xml/data_extraction_rules"
|
android:dataExtractionRules="@xml/data_extraction_rules"
|
||||||
android:fullBackupContent="@xml/backup_rules"
|
android:fullBackupContent="@xml/backup_rules"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:roundIcon="@mipmap/ic_launcher_round"
|
android:roundIcon="@mipmap/ic_launcher_round"
|
||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
android:theme="@style/Theme.NavinfoVivo"
|
android:theme="@style/Theme.NavinfoVolvo"
|
||||||
tools:targetApi="31">
|
tools:targetApi="31">
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name="com.navinfo.volvo.MainActivity"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:label="@string/app_name">
|
android:label="@string/app_name">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
|
@ -1,4 +0,0 @@
|
|||||||
package com.navinfo.vivo.db.dao.entity
|
|
||||||
|
|
||||||
class Attachment {
|
|
||||||
}
|
|
@ -1,44 +0,0 @@
|
|||||||
package com.navinfo.vivo.db.dao.entity
|
|
||||||
|
|
||||||
import androidx.room.Entity
|
|
||||||
import androidx.room.PrimaryKey
|
|
||||||
|
|
||||||
@Entity(tableName = "message")
|
|
||||||
class Message(
|
|
||||||
@PrimaryKey(autoGenerate = true)
|
|
||||||
var id: Long = 0,
|
|
||||||
/**
|
|
||||||
*标题
|
|
||||||
*/
|
|
||||||
var title: String,
|
|
||||||
/**
|
|
||||||
* 信息内容
|
|
||||||
*/
|
|
||||||
var message: String,
|
|
||||||
/**
|
|
||||||
* 操作时间
|
|
||||||
*/
|
|
||||||
var optionDate: String,
|
|
||||||
/**
|
|
||||||
* 发送时间
|
|
||||||
*/
|
|
||||||
var sendDate: String,
|
|
||||||
/**
|
|
||||||
* 信息状态
|
|
||||||
*/
|
|
||||||
var status: Int,
|
|
||||||
/**
|
|
||||||
* 发送者ID
|
|
||||||
*/
|
|
||||||
var fromId: String,
|
|
||||||
/**
|
|
||||||
* 接收者ID
|
|
||||||
*/
|
|
||||||
var toId: String,
|
|
||||||
/**
|
|
||||||
* 附件列表
|
|
||||||
*/
|
|
||||||
var attachment: MutableList<Attachment>
|
|
||||||
) {
|
|
||||||
|
|
||||||
}
|
|
@ -1,42 +0,0 @@
|
|||||||
package com.navinfo.vivo.ui.home
|
|
||||||
|
|
||||||
import android.os.Bundle
|
|
||||||
import android.view.LayoutInflater
|
|
||||||
import android.view.View
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import android.widget.TextView
|
|
||||||
import androidx.fragment.app.Fragment
|
|
||||||
import androidx.lifecycle.ViewModelProvider
|
|
||||||
import com.navinfo.vivo.databinding.FragmentHomeBinding
|
|
||||||
|
|
||||||
class HomeFragment : Fragment() {
|
|
||||||
|
|
||||||
private var _binding: FragmentHomeBinding? = null
|
|
||||||
|
|
||||||
// This property is only valid between onCreateView and
|
|
||||||
// onDestroyView.
|
|
||||||
private val binding get() = _binding!!
|
|
||||||
|
|
||||||
override fun onCreateView(
|
|
||||||
inflater: LayoutInflater,
|
|
||||||
container: ViewGroup?,
|
|
||||||
savedInstanceState: Bundle?
|
|
||||||
): View {
|
|
||||||
val homeViewModel =
|
|
||||||
ViewModelProvider(this).get(HomeViewModel::class.java)
|
|
||||||
|
|
||||||
_binding = FragmentHomeBinding.inflate(inflater, container, false)
|
|
||||||
val root: View = binding.root
|
|
||||||
|
|
||||||
val textView: TextView = binding.textHome
|
|
||||||
homeViewModel.text.observe(viewLifecycleOwner) {
|
|
||||||
textView.text = it
|
|
||||||
}
|
|
||||||
return root
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDestroyView() {
|
|
||||||
super.onDestroyView()
|
|
||||||
_binding = null
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
package com.navinfo.vivo.ui.home
|
|
||||||
|
|
||||||
import androidx.lifecycle.LiveData
|
|
||||||
import androidx.lifecycle.MutableLiveData
|
|
||||||
import androidx.lifecycle.ViewModel
|
|
||||||
|
|
||||||
class HomeViewModel : ViewModel() {
|
|
||||||
|
|
||||||
private val _text = MutableLiveData<String>().apply {
|
|
||||||
value = "This is home Fragment"
|
|
||||||
}
|
|
||||||
val text: LiveData<String> = _text
|
|
||||||
}
|
|
@ -1,4 +1,4 @@
|
|||||||
package com.navinfo.vivo
|
package com.navinfo.volvo
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import com.google.android.material.bottomnavigation.BottomNavigationView
|
import com.google.android.material.bottomnavigation.BottomNavigationView
|
||||||
@ -7,7 +7,8 @@ import androidx.navigation.findNavController
|
|||||||
import androidx.navigation.ui.AppBarConfiguration
|
import androidx.navigation.ui.AppBarConfiguration
|
||||||
import androidx.navigation.ui.setupActionBarWithNavController
|
import androidx.navigation.ui.setupActionBarWithNavController
|
||||||
import androidx.navigation.ui.setupWithNavController
|
import androidx.navigation.ui.setupWithNavController
|
||||||
import com.navinfo.vivo.databinding.ActivityMainBinding
|
import com.navinfo.volvo.R
|
||||||
|
import com.navinfo.volvo.databinding.ActivityMainBinding
|
||||||
|
|
||||||
class MainActivity : AppCompatActivity() {
|
class MainActivity : AppCompatActivity() {
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package com.navinfo.vivo.db.dao;
|
package com.navinfo.volvo.db.dao;
|
||||||
|
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@ -10,7 +10,9 @@ import androidx.room.RoomDatabase;
|
|||||||
import androidx.sqlite.db.SupportSQLiteDatabase;
|
import androidx.sqlite.db.SupportSQLiteDatabase;
|
||||||
import androidx.sqlite.db.SupportSQLiteOpenHelper;
|
import androidx.sqlite.db.SupportSQLiteOpenHelper;
|
||||||
|
|
||||||
import com.navinfo.vivo.db.dao.entity.Message;
|
import com.navinfo.volvo.db.dao.entity.Attachment;
|
||||||
|
import com.navinfo.volvo.db.dao.entity.Message;
|
||||||
|
import com.navinfo.volvo.db.dao.entity.User;
|
||||||
import com.tencent.wcdb.database.SQLiteCipherSpec;
|
import com.tencent.wcdb.database.SQLiteCipherSpec;
|
||||||
import com.tencent.wcdb.database.SQLiteDatabase;
|
import com.tencent.wcdb.database.SQLiteDatabase;
|
||||||
|
|
||||||
@ -23,7 +25,7 @@ import com.tencent.wcdb.repair.BackupKit;
|
|||||||
import com.tencent.wcdb.repair.RecoverKit;
|
import com.tencent.wcdb.repair.RecoverKit;
|
||||||
import com.tencent.wcdb.room.db.WCDBDatabase;
|
import com.tencent.wcdb.room.db.WCDBDatabase;
|
||||||
|
|
||||||
@Database(entities = {Message.class}, version = 1, exportSchema = false)
|
@Database(entities = {Message.class, Attachment.class, User.class}, version = 1, exportSchema = false)
|
||||||
public abstract class MapLifeDataBase extends RoomDatabase {
|
public abstract class MapLifeDataBase extends RoomDatabase {
|
||||||
// marking the instance as volatile to ensure atomic access to the variable
|
// marking the instance as volatile to ensure atomic access to the variable
|
||||||
/**
|
/**
|
@ -1,10 +1,10 @@
|
|||||||
package com.navinfo.vivo.db.dao
|
package com.navinfo.volvo.db.dao
|
||||||
|
|
||||||
import androidx.room.Dao
|
import androidx.room.Dao
|
||||||
import androidx.room.Insert
|
import androidx.room.Insert
|
||||||
import androidx.room.OnConflictStrategy
|
import androidx.room.OnConflictStrategy
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import com.navinfo.vivo.db.dao.entity.Message
|
import com.navinfo.volvo.db.dao.entity.Message
|
||||||
|
|
||||||
@Dao
|
@Dao
|
||||||
interface MessageDao {
|
interface MessageDao {
|
@ -0,0 +1,41 @@
|
|||||||
|
package com.navinfo.volvo.db.dao.entity
|
||||||
|
|
||||||
|
import androidx.room.Entity
|
||||||
|
import androidx.room.PrimaryKey
|
||||||
|
import androidx.room.TypeConverter
|
||||||
|
import com.google.gson.reflect.TypeToken
|
||||||
|
import com.navinfo.volvo.tools.GsonUtil
|
||||||
|
|
||||||
|
@Entity(tableName = "Attachment")
|
||||||
|
data class Attachment(
|
||||||
|
@PrimaryKey()
|
||||||
|
var id: String
|
||||||
|
)
|
||||||
|
|
||||||
|
class AttachmentConverters() {
|
||||||
|
@TypeConverter
|
||||||
|
fun stringToAttachment(value: String): Attachment {
|
||||||
|
val type = object : TypeToken<Attachment>() {
|
||||||
|
|
||||||
|
}.type
|
||||||
|
return GsonUtil.getInstance().fromJson(value, type)
|
||||||
|
}
|
||||||
|
|
||||||
|
@TypeConverter
|
||||||
|
fun attachmentToString(attachment: Attachment): String {
|
||||||
|
return GsonUtil.getInstance().toJson(attachment)
|
||||||
|
}
|
||||||
|
|
||||||
|
@TypeConverter
|
||||||
|
fun listToString(list: MutableList<Attachment>): String {
|
||||||
|
return GsonUtil.getInstance().toJson(list)
|
||||||
|
}
|
||||||
|
|
||||||
|
@TypeConverter
|
||||||
|
fun stringToList(value: String): MutableList<Attachment> {
|
||||||
|
val type = object : TypeToken<MutableList<Attachment>>() {
|
||||||
|
|
||||||
|
}.type
|
||||||
|
return GsonUtil.getInstance().fromJson(value, type)
|
||||||
|
}
|
||||||
|
}
|
46
app/src/main/java/com/navinfo/volvo/db/dao/entity/Message.kt
Normal file
46
app/src/main/java/com/navinfo/volvo/db/dao/entity/Message.kt
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
package com.navinfo.volvo.db.dao.entity
|
||||||
|
|
||||||
|
import androidx.room.Entity
|
||||||
|
import androidx.room.PrimaryKey
|
||||||
|
import androidx.room.TypeConverters
|
||||||
|
|
||||||
|
@Entity(tableName = "message")
|
||||||
|
@TypeConverters(AttachmentConverters::class)
|
||||||
|
data class Message @JvmOverloads constructor(
|
||||||
|
@PrimaryKey(autoGenerate = true)
|
||||||
|
var id: Long = 0,
|
||||||
|
|
||||||
|
var netId: String = "",
|
||||||
|
/**
|
||||||
|
*标题
|
||||||
|
*/
|
||||||
|
var title: String = "",
|
||||||
|
/**
|
||||||
|
* 信息内容
|
||||||
|
*/
|
||||||
|
var message: String = "",
|
||||||
|
/**
|
||||||
|
* 操作时间
|
||||||
|
*/
|
||||||
|
var optionDate: String = "",
|
||||||
|
/**
|
||||||
|
* 发送时间
|
||||||
|
*/
|
||||||
|
var sendDate: String = "",
|
||||||
|
/**
|
||||||
|
* 信息状态
|
||||||
|
*/
|
||||||
|
var status: Int = 1,
|
||||||
|
/**
|
||||||
|
* 发送者ID
|
||||||
|
*/
|
||||||
|
var fromId: String = "",
|
||||||
|
/**
|
||||||
|
* 接收者ID
|
||||||
|
*/
|
||||||
|
var toId: String = "",
|
||||||
|
/**
|
||||||
|
* 附件列表
|
||||||
|
*/
|
||||||
|
var attachment: MutableList<Attachment> = mutableListOf()
|
||||||
|
)
|
@ -1,13 +1,13 @@
|
|||||||
package com.navinfo.vivo.db.dao.entity
|
package com.navinfo.volvo.db.dao.entity
|
||||||
|
|
||||||
|
import androidx.room.Entity
|
||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
import java.net.IDN
|
|
||||||
|
|
||||||
class User(
|
@Entity(tableName = "User")
|
||||||
|
data class User(
|
||||||
@PrimaryKey()
|
@PrimaryKey()
|
||||||
val id:String,
|
val id:String,
|
||||||
var name:String,
|
var name:String,
|
||||||
var nickname:String,
|
var nickname:String,
|
||||||
|
|
||||||
) {
|
)
|
||||||
}
|
|
44
app/src/main/java/com/navinfo/volvo/tools/DisplayUtil.kt
Normal file
44
app/src/main/java/com/navinfo/volvo/tools/DisplayUtil.kt
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
package com.navinfo.volvo.tools
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
|
||||||
|
class DisplayUtil {
|
||||||
|
companion object {
|
||||||
|
/**
|
||||||
|
* 获取屏幕宽度
|
||||||
|
*/
|
||||||
|
fun getScreenWidth(context: Context): Int {
|
||||||
|
return context.resources.displayMetrics.widthPixels
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取屏幕高度
|
||||||
|
*/
|
||||||
|
fun getScreenHeight(context: Context): Int {
|
||||||
|
return context.resources.displayMetrics.heightPixels
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取屏幕分辨率
|
||||||
|
*/
|
||||||
|
fun getScreenRatio(context: Context): String {
|
||||||
|
return getScreenHeight(context).toString() + "X" + getScreenWidth(context).toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dp转px
|
||||||
|
*/
|
||||||
|
fun dip2px(context: Context, dipValue: Float): Int {
|
||||||
|
val scale = context.resources.displayMetrics.density
|
||||||
|
return (dipValue * scale + 0.5f).toInt()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* px转dp
|
||||||
|
*/
|
||||||
|
fun px2dip(context: Context, pxValue: Float): Int {
|
||||||
|
val scale = context.resources.displayMetrics.density
|
||||||
|
return (pxValue / scale + 0.5f).toInt()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
13
app/src/main/java/com/navinfo/volvo/tools/GsonUtil.kt
Normal file
13
app/src/main/java/com/navinfo/volvo/tools/GsonUtil.kt
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
package com.navinfo.volvo.tools
|
||||||
|
|
||||||
|
import com.google.gson.Gson
|
||||||
|
|
||||||
|
class GsonUtil {
|
||||||
|
companion object {
|
||||||
|
fun getInstance() = InstanceHelper.gson
|
||||||
|
}
|
||||||
|
|
||||||
|
object InstanceHelper {
|
||||||
|
val gson: Gson = Gson()
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,54 @@
|
|||||||
|
package com.navinfo.volvo.ui.adapter
|
||||||
|
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.ImageView
|
||||||
|
import android.widget.TextView
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import com.navinfo.volvo.R
|
||||||
|
import com.navinfo.volvo.db.dao.entity.Message
|
||||||
|
|
||||||
|
class MessageAdapter : RecyclerView.Adapter<MessageAdapter.MyViewHolder>() {
|
||||||
|
|
||||||
|
var itemList: MutableList<Message> = mutableListOf()
|
||||||
|
|
||||||
|
fun addItem(message: Message) {
|
||||||
|
itemList.add(message)
|
||||||
|
notifyItemInserted(itemList.size - 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setItem(messageList: MutableList<Message>){
|
||||||
|
itemList = messageList
|
||||||
|
notifyDataSetChanged()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
|
||||||
|
val view =
|
||||||
|
LayoutInflater.from(parent.context).inflate(R.layout.adapter_message, parent, false)
|
||||||
|
var viewHolder = MyViewHolder(view)
|
||||||
|
viewHolder.itemView.setOnClickListener {
|
||||||
|
|
||||||
|
}
|
||||||
|
return viewHolder
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
|
||||||
|
val message = itemList[position]
|
||||||
|
holder.toName.text = message.fromId
|
||||||
|
holder.messageText.text = message.message
|
||||||
|
holder.sendTime.text = message.sendDate
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getItemCount(): Int {
|
||||||
|
return itemList.size
|
||||||
|
}
|
||||||
|
|
||||||
|
inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
|
||||||
|
var image: ImageView = itemView.findViewById(R.id.message_head_icon)
|
||||||
|
var toName: TextView = itemView.findViewById(R.id.message_to_username)
|
||||||
|
var sendTime: TextView = itemView.findViewById(R.id.message_send_time)
|
||||||
|
var status: TextView = itemView.findViewById(R.id.message_status)
|
||||||
|
var messageText: TextView = itemView.findViewById(R.id.message_text)
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package com.navinfo.vivo.ui.dashboard
|
package com.navinfo.volvo.ui.dashboard
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
@ -7,7 +7,7 @@ import android.view.ViewGroup
|
|||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
import com.navinfo.vivo.databinding.FragmentDashboardBinding
|
import com.navinfo.volvo.databinding.FragmentDashboardBinding
|
||||||
|
|
||||||
class DashboardFragment : Fragment() {
|
class DashboardFragment : Fragment() {
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package com.navinfo.vivo.ui.dashboard
|
package com.navinfo.volvo.ui.dashboard
|
||||||
|
|
||||||
import androidx.lifecycle.LiveData
|
import androidx.lifecycle.LiveData
|
||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
92
app/src/main/java/com/navinfo/volvo/ui/home/HomeFragment.kt
Normal file
92
app/src/main/java/com/navinfo/volvo/ui/home/HomeFragment.kt
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
package com.navinfo.volvo.ui.home
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.Display
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
|
import androidx.lifecycle.Observer
|
||||||
|
import androidx.lifecycle.ViewModelProvider
|
||||||
|
import androidx.recyclerview.widget.DividerItemDecoration
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
|
import com.navinfo.volvo.R
|
||||||
|
import com.navinfo.volvo.databinding.FragmentHomeBinding
|
||||||
|
import com.navinfo.volvo.tools.DisplayUtil
|
||||||
|
import com.navinfo.volvo.ui.adapter.MessageAdapter
|
||||||
|
import com.yanzhenjie.recyclerview.*
|
||||||
|
import com.yanzhenjie.recyclerview.SwipeRecyclerView.LoadMoreListener
|
||||||
|
|
||||||
|
class HomeFragment : Fragment(), OnItemClickListener, OnItemMenuClickListener {
|
||||||
|
|
||||||
|
private var _binding: FragmentHomeBinding? = null
|
||||||
|
|
||||||
|
// This property is only valid between onCreateView and
|
||||||
|
// onDestroyView.
|
||||||
|
private val binding get() = _binding!!
|
||||||
|
|
||||||
|
override fun onCreateView(
|
||||||
|
inflater: LayoutInflater,
|
||||||
|
container: ViewGroup?,
|
||||||
|
savedInstanceState: Bundle?
|
||||||
|
): View {
|
||||||
|
val homeViewModel =
|
||||||
|
ViewModelProvider(this).get(HomeViewModel::class.java)
|
||||||
|
|
||||||
|
_binding = FragmentHomeBinding.inflate(inflater, container, false)
|
||||||
|
val root: View = binding.root
|
||||||
|
|
||||||
|
val recyclerview: SwipeRecyclerView = binding.homeMessageRecyclerview
|
||||||
|
recyclerview.adapter = null //先设置null,否则会报错
|
||||||
|
//创建菜单选项
|
||||||
|
//注意:使用滑动菜单不能开启滑动删除,否则只有滑动删除没有滑动菜单
|
||||||
|
var mSwipeMenuCreator =
|
||||||
|
SwipeMenuCreator { _, rightMenu, position ->
|
||||||
|
//添加菜单自动添加至尾部
|
||||||
|
var deleteItem = SwipeMenuItem(context)
|
||||||
|
deleteItem.height = DisplayUtil.dip2px(context!!, 60f)
|
||||||
|
deleteItem.width = DisplayUtil.dip2px(context!!, 80f)
|
||||||
|
deleteItem.background = context!!.getDrawable(R.color.red)
|
||||||
|
deleteItem.text = context!!.getString(R.string.delete)
|
||||||
|
rightMenu.addMenuItem(deleteItem)
|
||||||
|
|
||||||
|
//分享
|
||||||
|
var shareItem = SwipeMenuItem(context)
|
||||||
|
shareItem.height = DisplayUtil.dip2px(context!!, 60f)
|
||||||
|
shareItem.width = DisplayUtil.dip2px(context!!, 80f)
|
||||||
|
shareItem.background = context!!.getDrawable(R.color.gray)
|
||||||
|
shareItem.text = context!!.getString(R.string.share)
|
||||||
|
shareItem.setTextColor(R.color.white)
|
||||||
|
rightMenu.addMenuItem(shareItem)
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
val layoutManager = LinearLayoutManager(context)
|
||||||
|
val adapter = MessageAdapter()
|
||||||
|
recyclerview.layoutManager = layoutManager
|
||||||
|
recyclerview.addItemDecoration(DividerItemDecoration(context, layoutManager.orientation))
|
||||||
|
recyclerview.setSwipeMenuCreator(mSwipeMenuCreator)
|
||||||
|
recyclerview.setOnItemClickListener(this)
|
||||||
|
recyclerview.useDefaultLoadMore()
|
||||||
|
recyclerview.setLoadMoreListener {
|
||||||
|
|
||||||
|
}
|
||||||
|
recyclerview.adapter = adapter
|
||||||
|
homeViewModel.getMessageList().observe(viewLifecycleOwner, Observer { contacts ->
|
||||||
|
adapter.setItem(contacts)
|
||||||
|
})
|
||||||
|
return root
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDestroyView() {
|
||||||
|
super.onDestroyView()
|
||||||
|
_binding = null
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onItemClick(view: View?, adapterPosition: Int) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onItemClick(menuBridge: SwipeMenuBridge?, adapterPosition: Int) {
|
||||||
|
}
|
||||||
|
}
|
34
app/src/main/java/com/navinfo/volvo/ui/home/HomeViewModel.kt
Normal file
34
app/src/main/java/com/navinfo/volvo/ui/home/HomeViewModel.kt
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
package com.navinfo.volvo.ui.home
|
||||||
|
|
||||||
|
import androidx.lifecycle.LiveData
|
||||||
|
import androidx.lifecycle.MutableLiveData
|
||||||
|
import androidx.lifecycle.ViewModel
|
||||||
|
import com.navinfo.volvo.db.dao.entity.Message
|
||||||
|
|
||||||
|
class HomeViewModel : ViewModel() {
|
||||||
|
|
||||||
|
private val messageList: LiveData<MutableList<Message>> =
|
||||||
|
MutableLiveData<MutableList<Message>>().apply {
|
||||||
|
value = mutableListOf<Message>()
|
||||||
|
value!!.add(Message())
|
||||||
|
value!!.add(Message())
|
||||||
|
value!!.add(Message())
|
||||||
|
value!!.add(Message())
|
||||||
|
value!!.add(Message())
|
||||||
|
value!!.add(Message())
|
||||||
|
value!!.add(Message())
|
||||||
|
value!!.add(Message())
|
||||||
|
value!!.add(Message())
|
||||||
|
value!!.add(Message())
|
||||||
|
value!!.add(Message())
|
||||||
|
value!!.add(Message())
|
||||||
|
value!!.add(Message())
|
||||||
|
value!!.add(Message())
|
||||||
|
value!!.add(Message())
|
||||||
|
value!!.add(Message())
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getMessageList(): LiveData<MutableList<Message>> {
|
||||||
|
return messageList
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package com.navinfo.vivo.ui.notifications
|
package com.navinfo.volvo.ui.notifications
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
@ -7,7 +7,7 @@ import android.view.ViewGroup
|
|||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
import com.navinfo.vivo.databinding.FragmentNotificationsBinding
|
import com.navinfo.volvo.databinding.FragmentNotificationsBinding
|
||||||
|
|
||||||
class NotificationsFragment : Fragment() {
|
class NotificationsFragment : Fragment() {
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package com.navinfo.vivo.ui.notifications
|
package com.navinfo.volvo.ui.notifications
|
||||||
|
|
||||||
import androidx.lifecycle.LiveData
|
import androidx.lifecycle.LiveData
|
||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
@ -0,0 +1,187 @@
|
|||||||
|
package com.navinfo.volvo.ui.widget
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.Context
|
||||||
|
import android.graphics.Rect
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import android.view.*
|
||||||
|
import android.widget.Scroller
|
||||||
|
import androidx.core.view.forEach
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import java.lang.Math.abs
|
||||||
|
|
||||||
|
class SlideRecyclerView @JvmOverloads constructor(
|
||||||
|
context: Context,
|
||||||
|
attrs: AttributeSet? = null,
|
||||||
|
defStyleAttr: Int = 0
|
||||||
|
) : RecyclerView(context, attrs, defStyleAttr) {
|
||||||
|
//系统最小移动距离
|
||||||
|
private val mTouchSlop = ViewConfiguration.get(context).scaledTouchSlop
|
||||||
|
|
||||||
|
//最小有效速度
|
||||||
|
private val mMinVelocity = 600
|
||||||
|
|
||||||
|
//增加手势控制,双击快速完成侧滑
|
||||||
|
private var isDoubleClick = false
|
||||||
|
private var mGestureDetector: GestureDetector =
|
||||||
|
GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
|
||||||
|
override fun onDoubleTap(e: MotionEvent?): Boolean {
|
||||||
|
e?.let { event ->
|
||||||
|
getSelectItem(event)
|
||||||
|
mItem?.let {
|
||||||
|
val deleteWith = it.getChildAt(it.childCount - 1).width
|
||||||
|
//触发移动至完全展开deleteWidth
|
||||||
|
if (it.scrollX == 0) {
|
||||||
|
mScroller.startScroll(0, 0, deleteWith, 0)
|
||||||
|
} else {
|
||||||
|
mScroller.startScroll(it.scrollX, 0, -it.scrollX, 0)
|
||||||
|
}
|
||||||
|
isDoubleClick = true
|
||||||
|
invalidate()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//不进行拦截,只作为工具判断下双击
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
//使用速度控制器,增加侧滑速度判定滑动成功,
|
||||||
|
//VelocityTracker 由native实现,需要及时释放内存
|
||||||
|
private var mVelocityTracker: VelocityTracker? = null
|
||||||
|
|
||||||
|
//流畅滑动
|
||||||
|
private var mScroller = Scroller(context)
|
||||||
|
|
||||||
|
//当前选中item
|
||||||
|
private var mItem: ViewGroup? = null
|
||||||
|
|
||||||
|
//上次按下的横坐标
|
||||||
|
private var mLastX = 0f
|
||||||
|
|
||||||
|
//当前RecyclerView被上层ViewGroup分发到事件,所有事件都会通过dispatchTouchEvent给到
|
||||||
|
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
|
||||||
|
mGestureDetector.onTouchEvent(ev)
|
||||||
|
return super.dispatchTouchEvent(ev)
|
||||||
|
}
|
||||||
|
|
||||||
|
//viewGroup对子控件的事件拦截,一旦拦截,后续事件序列不会再调用onInterceptTouchEvent
|
||||||
|
override fun onInterceptTouchEvent(e: MotionEvent?): Boolean {
|
||||||
|
e?.let {
|
||||||
|
when (e.action) {
|
||||||
|
MotionEvent.ACTION_DOWN -> {
|
||||||
|
getSelectItem(e)
|
||||||
|
mLastX = e.x
|
||||||
|
}
|
||||||
|
MotionEvent.ACTION_MOVE -> {
|
||||||
|
//移动控件
|
||||||
|
return moveItem(e)
|
||||||
|
}
|
||||||
|
// MotionEvent.ACTION_UP -> {
|
||||||
|
// stopMove(e)
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return super.onInterceptTouchEvent(e)
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("ClickableViewAccessibility")
|
||||||
|
override fun onTouchEvent(e: MotionEvent?): Boolean {
|
||||||
|
e?.let {
|
||||||
|
when (e.action) {
|
||||||
|
MotionEvent.ACTION_MOVE -> {
|
||||||
|
moveItem(e)
|
||||||
|
mLastX = e.x
|
||||||
|
}
|
||||||
|
MotionEvent.ACTION_UP -> {
|
||||||
|
stopMove()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return super.onTouchEvent(e)
|
||||||
|
}
|
||||||
|
|
||||||
|
//活动结束
|
||||||
|
//判断一下结束的位置,补充或恢复位置
|
||||||
|
private fun stopMove() {
|
||||||
|
mItem?.let {
|
||||||
|
//如果移动过半,判定左划成功
|
||||||
|
val deleteWidth = it.getChildAt(it.childCount - 1).width
|
||||||
|
//如果整个移动过程速度大于600,也判定滑动成功
|
||||||
|
//注意如果没有拦截ACTION_MOVE,mVelocityTracker是没有初始化的
|
||||||
|
var velocity = 0f
|
||||||
|
mVelocityTracker?.let { tracker ->
|
||||||
|
tracker.computeCurrentVelocity(1000)
|
||||||
|
velocity = tracker.xVelocity
|
||||||
|
}
|
||||||
|
//判断结束情况,移动过半或者向左速度很快都展开
|
||||||
|
if ((abs(it.scrollX) >= deleteWidth / 2f) || (velocity < -mMinVelocity)) {
|
||||||
|
//触发移动至完全展开
|
||||||
|
mScroller.startScroll(it.scrollX, 0, deleteWidth - it.scrollX, 0)
|
||||||
|
invalidate()
|
||||||
|
} else {
|
||||||
|
//如果移动未过半应恢复状态
|
||||||
|
mScroller.startScroll(it.scrollX, 0, -it.scrollX, 0)
|
||||||
|
invalidate()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//清除状态
|
||||||
|
mLastX = 0f
|
||||||
|
//mVeloctityTracker由native实现,需要及时释放
|
||||||
|
mVelocityTracker?.apply {
|
||||||
|
clear()
|
||||||
|
recycle()
|
||||||
|
}
|
||||||
|
mVelocityTracker = null
|
||||||
|
}
|
||||||
|
|
||||||
|
//移动Item
|
||||||
|
//绝对值小于删除按钮长度随便移动,大于则不移动
|
||||||
|
@SuppressLint("Recycle")
|
||||||
|
private fun moveItem(e: MotionEvent): Boolean {
|
||||||
|
mItem?.let {
|
||||||
|
val dx = mLastX - e.x
|
||||||
|
//最小的移动距离应该舍弃,onInterceptTouchEvent不拦截,onTouchEvent内才更新mLastX
|
||||||
|
// if (abs(dx) > mTouchSlop) {
|
||||||
|
//检查mItem移动后应该在【-deleteLength,0】内
|
||||||
|
val deleteWith = it.getChildAt(it.childCount - 1).width
|
||||||
|
if ((it.scrollX + dx) <= deleteWith && (it.scrollX + dx) >= 0) {
|
||||||
|
//触发移动
|
||||||
|
it.scrollBy(dx.toInt(), 0)
|
||||||
|
//触发速度计算
|
||||||
|
//这里Rectycle不存在问题,一旦返回true,就会拦截事件,就会到达ACTION_UP去回收
|
||||||
|
mVelocityTracker = mVelocityTracker ?: VelocityTracker.obtain()
|
||||||
|
mVelocityTracker!!.addMovement(e)
|
||||||
|
return true
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取点击位置
|
||||||
|
//通过点击的y坐标除以Item高度得出
|
||||||
|
private fun getSelectItem(e: MotionEvent) {
|
||||||
|
val frame = Rect()
|
||||||
|
mItem = null
|
||||||
|
forEach {
|
||||||
|
if (it.visibility != GONE) {
|
||||||
|
it.getHitRect(frame)
|
||||||
|
if (frame.contains(e.x.toInt(), e.y.toInt())) {
|
||||||
|
mItem = it as ViewGroup
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//流畅地滑动
|
||||||
|
override fun computeScroll() {
|
||||||
|
if (mScroller.computeScrollOffset()) {
|
||||||
|
mItem?.scrollBy(mScroller.currX, mScroller.currY)
|
||||||
|
postInvalidate()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -4,7 +4,7 @@
|
|||||||
android:id="@+id/container"
|
android:id="@+id/container"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:paddingTop="?attr/actionBarSize">
|
>
|
||||||
|
|
||||||
<com.google.android.material.bottomnavigation.BottomNavigationView
|
<com.google.android.material.bottomnavigation.BottomNavigationView
|
||||||
android:id="@+id/nav_view"
|
android:id="@+id/nav_view"
|
||||||
@ -22,7 +22,7 @@
|
|||||||
android:id="@+id/nav_host_fragment_activity_main"
|
android:id="@+id/nav_host_fragment_activity_main"
|
||||||
android:name="androidx.navigation.fragment.NavHostFragment"
|
android:name="androidx.navigation.fragment.NavHostFragment"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="0dp"
|
||||||
app:defaultNavHost="true"
|
app:defaultNavHost="true"
|
||||||
app:layout_constraintBottom_toTopOf="@id/nav_view"
|
app:layout_constraintBottom_toTopOf="@id/nav_view"
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
54
app/src/main/res/layout/adapter_message.xml
Normal file
54
app/src/main/res/layout/adapter_message.xml
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/message_head_icon"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="8dp"
|
||||||
|
android:src="@mipmap/ic_launcher"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/message_to_username"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="8dp"
|
||||||
|
android:text="问候对象"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:textSize="16sp"
|
||||||
|
android:textStyle="bold"
|
||||||
|
app:layout_constraintLeft_toRightOf="@id/message_head_icon"
|
||||||
|
app:layout_constraintTop_toTopOf="@id/message_head_icon" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/message_text"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="8dp"
|
||||||
|
android:text="信息内容"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@id/message_head_icon"
|
||||||
|
app:layout_constraintLeft_toRightOf="@id/message_head_icon" />
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/message_send_time"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginRight="8dp"
|
||||||
|
android:text="日期"
|
||||||
|
app:layout_constraintTop_toTopOf="@id/message_head_icon"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
/>
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/message_status"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="8dp"
|
||||||
|
android:text="状态"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@id/message_head_icon"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent" />
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -4,7 +4,7 @@
|
|||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
tools:context=".ui.dashboard.DashboardFragment">
|
tools:context="com.navinfo.volvo.ui.dashboard.DashboardFragment">
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/text_dashboard"
|
android:id="@+id/text_dashboard"
|
||||||
|
@ -1,22 +1,12 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<com.yanzhenjie.recyclerview.SwipeRecyclerView
|
||||||
|
android:id="@+id/home_message_recyclerview"
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
tools:context=".ui.home.HomeFragment">
|
tools:context=".ui.home.HomeFragment"
|
||||||
|
>
|
||||||
|
|
||||||
<TextView
|
</com.yanzhenjie.recyclerview.SwipeRecyclerView>
|
||||||
android:id="@+id/text_home"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginStart="8dp"
|
|
||||||
android:layout_marginTop="8dp"
|
|
||||||
android:layout_marginEnd="8dp"
|
|
||||||
android:textAlignment="center"
|
|
||||||
android:textSize="20sp"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent" />
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
@ -7,19 +7,19 @@
|
|||||||
|
|
||||||
<fragment
|
<fragment
|
||||||
android:id="@+id/navigation_home"
|
android:id="@+id/navigation_home"
|
||||||
android:name="com.navinfo.vivo.ui.home.HomeFragment"
|
android:name="com.navinfo.volvo.ui.home.HomeFragment"
|
||||||
android:label="@string/title_home"
|
android:label="@string/title_home"
|
||||||
tools:layout="@layout/fragment_home" />
|
tools:layout="@layout/fragment_home" />
|
||||||
|
|
||||||
<fragment
|
<fragment
|
||||||
android:id="@+id/navigation_dashboard"
|
android:id="@+id/navigation_dashboard"
|
||||||
android:name="com.navinfo.vivo.ui.dashboard.DashboardFragment"
|
android:name="com.navinfo.volvo.ui.dashboard.DashboardFragment"
|
||||||
android:label="@string/title_dashboard"
|
android:label="@string/title_dashboard"
|
||||||
tools:layout="@layout/fragment_dashboard" />
|
tools:layout="@layout/fragment_dashboard" />
|
||||||
|
|
||||||
<fragment
|
<fragment
|
||||||
android:id="@+id/navigation_notifications"
|
android:id="@+id/navigation_notifications"
|
||||||
android:name="com.navinfo.vivo.ui.notifications.NotificationsFragment"
|
android:name="com.navinfo.volvo.ui.notifications.NotificationsFragment"
|
||||||
android:label="@string/title_notifications"
|
android:label="@string/title_notifications"
|
||||||
tools:layout="@layout/fragment_notifications" />
|
tools:layout="@layout/fragment_notifications" />
|
||||||
</navigation>
|
</navigation>
|
@ -1,6 +1,6 @@
|
|||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
<!-- Base application theme. -->
|
<!-- Base application theme. -->
|
||||||
<style name="Theme.NavinfoVivo" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
|
<style name="Theme.NavinfoVolvo" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
|
||||||
<!-- Primary brand color. -->
|
<!-- Primary brand color. -->
|
||||||
<item name="colorPrimary">@color/purple_200</item>
|
<item name="colorPrimary">@color/purple_200</item>
|
||||||
<item name="colorPrimaryVariant">@color/purple_700</item>
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
8
app/src/main/res/values-zh-rCN/strings.xml
Normal file
8
app/src/main/res/values-zh-rCN/strings.xml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<resources>
|
||||||
|
<string name="app_name">NavinfoVolvo</string>
|
||||||
|
<string name="title_home">Home</string>
|
||||||
|
<string name="title_dashboard">Dashboard</string>
|
||||||
|
<string name="title_notifications">Notifications</string>
|
||||||
|
<string name="delete">删除</string>
|
||||||
|
<string name="share">分享</string>
|
||||||
|
</resources>
|
@ -7,4 +7,6 @@
|
|||||||
<color name="teal_700">#FF018786</color>
|
<color name="teal_700">#FF018786</color>
|
||||||
<color name="black">#FF000000</color>
|
<color name="black">#FF000000</color>
|
||||||
<color name="white">#FFFFFFFF</color>
|
<color name="white">#FFFFFFFF</color>
|
||||||
|
<color name="red">#FFFF0000</color>
|
||||||
|
<color name="gray">#5E5E5E</color>
|
||||||
</resources>
|
</resources>
|
@ -1,6 +1,8 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">NavinfoVivo</string>
|
<string name="app_name">NavinfoVolvo</string>
|
||||||
<string name="title_home">Home</string>
|
<string name="title_home">Home</string>
|
||||||
<string name="title_dashboard">Dashboard</string>
|
<string name="title_dashboard">Dashboard</string>
|
||||||
<string name="title_notifications">Notifications</string>
|
<string name="title_notifications">Notifications</string>
|
||||||
|
<string name="delete">Del</string>
|
||||||
|
<string name="share">Share</string>
|
||||||
</resources>
|
</resources>
|
@ -1,6 +1,6 @@
|
|||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
<!-- Base application theme. -->
|
<!-- Base application theme. -->
|
||||||
<style name="Theme.NavinfoVivo" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
|
<style name="Theme.NavinfoVolvo" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
|
||||||
<!-- Primary brand color. -->
|
<!-- Primary brand color. -->
|
||||||
<item name="colorPrimary">@color/purple_500</item>
|
<item name="colorPrimary">@color/purple_500</item>
|
||||||
<item name="colorPrimaryVariant">@color/purple_700</item>
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package com.navinfo.vivo
|
package com.navinfo.volvo
|
||||||
|
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
@ -24,5 +24,5 @@ dependencyResolutionManagement {
|
|||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rootProject.name = "NavinfoVivo"
|
rootProject.name = "NavinfoVolvo"
|
||||||
include ':app'
|
include ':app'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user