<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:layout_constraintBottom_toTopOf="@id/nav_view"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/mobile_navigation" />
其次,定义
navigation/mobile_navigation.xml Activity
的添加,需要先在
Project
创建对应的
Activity
,即可在布局设计器处理。
<navigation
<fragment
android:id="@+id/navigation_home"
android:name="com.android.myapplication.ui.home.HomeFragment"
android:label="@string/title_home"
tools:layout="@layout/fragment_home">
<action
android:id="@+id/action_navigation_home_to_detail_activity"
app:destination="@id/detail_activity" />
</fragment>
<activity
android:id="@+id/detail_activity"
android:name="com.android.myapplication.ui.detail.DetailActivity"
android:label="DetailActivity">
<argument
android:name="detailId"
app:argType="string" />
</activity>
</navigation>
最后,页面跳转,参数传递
val direction = HomeFragmentDirections.actionNavigationHomeToDetailActivity(plantId)
view.findNavController().navigate(direction)
参数接收:
private val args: DetailActivityArgs by navArgs()
Databinding
onCreateView()
中直接使用控件,会报空指针异常,这个姿势
binding.tvNavigation
是可以的。
val binding = FragmentHomeBinding.inflate(inflater, container, false)
binding.tvNavigation.setOnClickListener {
navigateToDetailPage("1", it)
布局文件中,字符串拼接,如跟
ViewModel
一起使用:
android:text='@{"Data From Network-> "+viewModel.response}'
ViewModel
以生命周期的方式存储和管理界面相关的数据。
Kotlin
协程
viewModelScope
, 如果
ViewModel
已清除,则在此范围内启动的协程都会自动取消。
private val homeViewModel: HomeViewModel by viewModels {
InjectorUtils.provideHomeViewModelFactory(requireContext())
viewModelScope.launch {
LiveData
一种可观察的数据存储器类,具有生命周期感知能力,意指它遵循其他应用组件(如
Activity
、
Fragment
或
Service
)的生命周期。
var plantName = gardenPlantings.map {
map
实现
LiveData
的转换
创建应用数据的缓存,
SQLite
的基础上提供了一个抽象层,充分利用
SQLite
的强大功能,更强健的数据库访问机制。
Room
引用复杂数据,
Room
提供了在基本类型和包装类型之间进行转换的功能,但不允许实体之间进行对象引用。
要为自定义类型添加此类支持,您需要提供一个
TypeConverter
,它可以在自定义类与
Room
可以保留的已知类型之间来回转换。
class Converters {//TypeConverters
@TypeConverters
注释添加到
AppDatabase
类中,以便
Room
可以使用您为该
AppDatabase
中的每个实体和
DAO
定义的转换器:
@Database(entities = table, version = 1, exportSchema = false)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
@Insert suspend fun insertPlant(plant: Plant): Long
认为是协程
suspend
WorkManager
WorkManager API
可以轻松地调度即使在应用退出或设备重启时仍应运行的可延迟异步任务。
val workManagerConfiguration = Configuration.Builder()
.setWorkerFactory(RefreshDataWork.Factory())
.build()
WorkManager.initialize(appContext, workManagerConfiguration)
val constraints = Constraints.Builder()
.setRequiresCharging(true)
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
val work = PeriodicWorkRequestBuilder<RefreshDataWork>(2, TimeUnit.HOURS)
.setConstraints(constraints)
.build()
WorkManager.getInstance(appContext)
.enqueueUniquePeriodicWork(RefreshDataWork::class.java.name, KEEP, work)
PeriodicWorkRequest
用于重复或重复工作,最小间隔应为15分钟。
OneTimeWorkRequest
一次性申请,不重复工作。
WorkManager
按顺序执行,单例模式,
app
启动时执行一次。
对于进阶这条路而言,学习是会有回报的!
你把你的时间投资在学习上,就意味着你可以收获技能,更有机会增加收入。
附上我的Android核心技术学习大纲,获取相关内容来我的GitHub一起玩耍:
vx:xx1341452
分享我的Android学习PDF大全来学习,这份Android学习PDF大全真的包含了方方面面了,内含Java基础知识点、Android基础、Android进阶延伸、算法合集等等
我的这份学习合集,可以有效的帮助大家掌握知识点。
总之也是在这里帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习
获取方式:关注我看个人介绍,或直接
点击我免费领取
人生的长跑中,跑得最远的人,可能不是跑得最快的人,而是规划了最佳行程的人
Android学习也是如此,分享Android学习内容、面试精选等,关注我,需要学习计划大纲和学习内容:xx13414521
注册时间:2019-11-05
157614
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员