[英]How to achieve a modern Android Navigation implementation
我想在更新版本 (2.4.0-beta01) 中实现基于 Android 导航组件的导航逻辑,但我正面临与 Android 生命周期相关的某种问题(或非预期行为)。
我的主要问题是每次更改选项卡时,都会完全重新创建片段,这意味着每次更改选项卡时都会调用onCreate()方法。 我知道出于性能原因,每次离开与其关联的选项卡时,片段都会调用 onDestroyView() 方法,然后当您返回该选项卡时,将调用 onCreateView() 方法。 实际上,我不知道我对导航组件的实现及其行为是否正确,我想知道如何正确实现它。
我的实际实现是这样的:
摇篮文件:
def navigation = "2.4.0-alpha06"
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() 方法,因此这是正常行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.