繁体   English   中英

如何通过 android 中的抽屉在导航中的片段之间进行 animation 过渡

[英]how to make animation transition between fragments in navigation by drawer in android

我的应用程序中有一个抽屉,我通过导航切换片段。 当我单击抽屉中的按钮时,我想要 animation 过渡。 我知道如何使用常规按钮执行此操作,但我不知道如何使用导航抽屉执行此操作谢谢。

这是我的主要活动

class MainActivity : AppCompatActivity() {

    private lateinit var appBarConfiguration: AppBarConfiguration

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        setSupportActionBar(toolbar)

        val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
        val navView: NavigationView = findViewById(R.id.nav_view)
        val navController = findNavController(R.id.nav_host_fragment)

        appBarConfiguration = AppBarConfiguration(setOf(
            R.id.nav_food_text_analysis,
            R.id.nav_recipe_analysis
        ), drawerLayout)
        setupActionBarWithNavController(navController, appBarConfiguration)
        navView.setupWithNavController(navController)
    }

    override fun onSupportNavigateUp(): Boolean {
        val navController = findNavController(R.id.nav_host_fragment)
        return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
    }


}

这是我的导航 xml

<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/mobile_navigation"
    app:startDestination="@id/nav_food_text_analysis">

    <fragment
        android:id="@+id/nav_food_text_analysis"
        android:name="com.example.nutritionfacts.ui.foodTextAnalysis.FoodAnalysisFragment"
        android:label="Food analysis"
        tools:layout="@layout/fragment_food_text_analysis" >
        <action
            android:id="@+id/action_nav_food_text_analysis_to_nav_recipe_analysis"
            app:destination="@id/nav_recipe_analysis"
            app:enterAnim="@anim/enter_from_right"
            app:exitAnim="@anim/exit_to_right"
            app:popEnterAnim="@anim/enter_from_right"
            app:popExitAnim="@anim/exit_to_right" />
    </fragment>
    <fragment
        android:id="@+id/nav_recipe_analysis"
        android:name="com.example.nutritionfacts.ui.recipeAnalysis.RecipeAnalysisFragment"
        android:label="Recipe analysis"
        tools:layout="@layout/fragment_recipe_analysis" >
        <action
            android:id="@+id/action_nav_recipe_analysis_to_nav_food_text_analysis2"
            app:destination="@id/nav_food_text_analysis"
            app:enterAnim="@anim/enter_from_right"
            app:exitAnim="@anim/exit_to_right"
            app:popEnterAnim="@anim/enter_from_right"
            app:popExitAnim="@anim/exit_to_right" />
    </fragment>
</navigation>

我正在研究这个并且有一个解决方案可以监听导航抽屉的点击并以与按钮相同的方式做出反应。

我正在使用带有多个片段的单个活动。 确保为您的 Fragment 设置导航图,然后使用 Main Activity 中的setNavigationItemSelectedListener调用正确的FragmentDirections操作。

在我的示例中, settingsFragment将加载 animation,但aboutFragment不会,因为它不调用Directions.action function。

MainActivity(在 onCreate 函数内)

        /** Handle clicks in Nav Drawer **/
        val navigationView = findViewById<NavigationView>(R.id.navView)
        navigationView.setNavigationItemSelectedListener { menuItem ->
            Timber.d("Nav Drawer Item Clicked: %s", menuItem.title)
            when (menuItem.itemId) {
                R.id.settingsFragment -> {
                    navController.navigate(
                        RecipeListFragmentDirections
                        .actionRecipeListToSettingsFragment()
                    )
                }
                R.id.aboutFragment -> {
                    navController.navigate(R.id.aboutFragment)
                }
                R.id.refreshRecipes -> {
                    Timber.i("TODO: Implement repository refresh method call")
                }
            }

            true
        }

导航.xml

<?xml version="1.0" encoding="utf-8"?>
<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/navigation"
    app:startDestination="@id/recipeList">

    <fragment
        android:id="@+id/recipeList"
        android:name="com.jumptuck.recipebrowser2.recipelist.RecipeListFragment"
        tools:layout="@layout/fragment_recipe_list">
        <action
            android:id="@+id/action_recipeList_to_singleRecipeFragment"
            app:destination="@id/singleRecipeFragment"
            app:enterAnim="@anim/slide_in_right"
            app:exitAnim="@anim/slide_out_right"
            app:popEnterAnim="@anim/slide_in_left"
            app:popExitAnim="@anim/slide_out_left" />
        <action
            android:id="@+id/action_recipeList_to_aboutFragment"
            app:destination="@id/aboutFragment"
            app:enterAnim="@anim/slide_in_left"
            app:exitAnim="@anim/slide_out_left"
            app:popEnterAnim="@anim/slide_in_right"
            app:popExitAnim="@anim/slide_out_right" />
        <action
            android:id="@+id/action_recipeList_to_settingsFragment"
            app:destination="@id/settingsFragment"
            app:enterAnim="@anim/slide_in_right"
            app:exitAnim="@anim/slide_out_right"
            app:popEnterAnim="@anim/slide_in_left"
            app:popExitAnim="@anim/slide_out_left" />
    </fragment>

我使用这种方法的原因之一是因为我想从refreshRecipes菜单项启动服务,而不是导致导航,这会拦截点击。 缺点之一是导航栏项目本身在单击时不显示 animation(但我认为这可以修复)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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