繁体   English   中英

如何实现现代 Android 导航实现

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM