android - 如何实现现代的 Android Navigation 实现
问题描述
我想在更新版本(2.4.0-beta02)中实现基于 Android 导航组件的导航逻辑,但我面临与 Android 生命周期相关的某种问题(或非预期行为)。
我的主要问题是每次更改选项卡时,都会完全重新创建片段,这意味着每次更改选项卡时都会调用onCreate()方法。我了解,出于性能原因,每次您离开与其关联的选项卡时,片段都会调用 onDestroyView() 方法,然后当您返回该选项卡时,将调用 onCreateView() 方法。实际上我不知道我的导航组件的实现及其行为是否正确,我想知道如何正确实现它。
我的实际实现如下所示:
摇篮文件:
def navigation = "2.4.0-beta02"
implementation "androidx.navigation:navigation-runtime-ktx:$navigation"
implementation "androidx.navigation:navigation-fragment-ktx:$navigation"
implementation "androidx.navigation:navigation-fragment-ktx:$navigation"
implementation "androidx.navigation:navigation-ui-ktx:$navigation"
包含我的标签的活动:
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var navController: NavController
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_container) as NavHostFragment
navController = navHostFragment.navController
binding.bottomNav.setupWithNavController(navController)
}
}
活动布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_host_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:name="androidx.navigation.fragment.NavHostFragment"
app:navGraph="@navigation/nav_graph"
app:defaultNavHost="true" />
<com.google.android.material.
bottomnavigation.BottomNavigationView
android:id="@+id/bottom_nav"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="0dp"
android:layout_marginEnd="0dp"
android:background="@android:color/white"
app:itemIconTint="@color/gray"
app:itemRippleColor="@android:color/transparent"
app:itemTextColor="@color/gray"
app:labelVisibilityMode="unlabeled"
app:menu="@menu/bottom_nav_menu" />
</LinearLayout>
图形:
<navigation
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/nav_graph"
app:startDestination="@+id/home">
<include app:graph="@navigation/home"/>
<include app:graph="@navigation/profile"/>
</navigation>
导航首页:
<navigation
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:id="@+id/home"
app:startDestination="@+id/homeFragmentNavigation">
<fragment
android:id="@+id/homeFragmentNavigation"
android:name="com.tayloring.android.view.page.tabs.HomeFragment"
android:label="@string/title_home"
tools:layout="@layout/fragment_home"/>
</fragment>
</navigation>
二级导航:
<navigation
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:id="@+id/profile"
app:startDestination="@+id/profileFragmentNavigation">
<fragment
android:id="@+id/profileFragmentNavigation"
android:name="com.tayloring.android.view
.page.user.ProfileFragment"
android:label="@string/title_profile"
tools:layout="@layout/fragment_profile"
</fragment>
</navigation>
次要片段:
class ProfileFragment : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
println("I'M ALWAYS CALLED")
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_profile, container, false)
}
}
我也试过这个存储库https://github.com/android/architecture-components-samples/tree/master/NavigationAdvancedSample这是一些现代媒体帖子在谈论导航组件时谈论的例子,但它是过时了,它的导航版本更旧。
解决方案
每次更改选项卡时,导航组件都会调用 onDestroy() 方法,因此这是正常行为。
推荐阅读
- nutch - 运行 apache nutch webservice 时的依赖关系问题
- python - 使用python从CSV文件中删除空白单元格
- ansible - 如何在变量中获取主机别名?
- pymysql - 需要查询以在没有 WHERE 约束的情况下在一列中更改更多行
- c++ - char 数组及其指针如何在 C++ 中准确工作?
- android - 视图或视图模型是否负责将模型中的数据转换为在 UI 中呈现?
- bash - 了解如何将输入重定向到从文件构造时
- c# - 在 Linq to Sql 中使用 ExecuteCommand 与事务
- spring - Spring Cloud Config - 从 Git 读取多个属性文件
- python - 我如何将数据保存到文本文件中,主要是我在记录中写的内容