【问题标题】:Why doesn't my Jetpack Navigation Component animate?为什么我的 Jetpack 导航组件没有动画?
【发布时间】:2020-03-27 13:45:43
【问题描述】:

我正在使用 Jetpack 导航组件 (v. 2.2.1),但我不确定为什么我的片段之间的转换无法动画。当我在导航主机内设置断点时,NavOptions 出来为空;我不确定这是不是因为我做错了什么。我尝试使用默认入口和出口,以及从示例项目中复制 @anim/ XML 文件夹资源,但无济于事。

当我初始化我的 NavigationUI 时,我应该做些什么不同的事情吗?还是我的 XML 有问题?非常感谢任何帮助。

设置我的NavigationUI

/**
 * Main activity. The rest of the app is fragments inside a nav graph.
 */
class MainActivity : AppCompatActivity() {

    private lateinit var appBarConfiguration: AppBarConfiguration

    // Location tracking
    private val model: HomeSharedViewModel by viewModels()
    private lateinit var host: NavHostFragment
    private lateinit var drawerLayout: DrawerLayout

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

        host = supportFragmentManager.findFragmentById(R.id.my_nav_host_fragment) as NavHostFragment? ?: return

        // Set up ActionBar
        val navController = host.navController
        drawerLayout = findViewById(R.id.drawer_layout)
        appBarConfiguration = AppBarConfiguration(setOf(R.id.home_dest, R.id.login_dest), drawerLayout)
        setupActionBar(navController, appBarConfiguration)
        setupNavigationMenu(navController)
    }

    private fun setupNavigationMenu(navController: NavController) {
        val sideNavView = findViewById<NavigationView>(R.id.nav_view)
        sideNavView?.apply {
            setupWithNavController(navController)
            val menu = this.menu
            val signOut = menu.findItem(R.id.sign_out)

            signOut.setOnMenuItemClickListener {
                onSignOut()
                false
            }

        }
    }

    private fun setupActionBar(navController: NavController,
                               appBarConfig : AppBarConfiguration) {
        setupActionBarWithNavController(navController, appBarConfig)
    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        val retValue = super.onCreateOptionsMenu(menu)
        return retValue
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return item.onNavDestinationSelected(findNavController(R.id.my_nav_host_fragment))
                || super.onOptionsItemSelected(item)
    }

    override fun onSupportNavigateUp(): Boolean {
        return findNavController(R.id.my_nav_host_fragment).navigateUp(appBarConfiguration)
    }

    private fun onSignIn() {
        host.navController.navigate(R.id.login_dest)
    }

    private fun onSignOut() {
        LoginFragment.setLoggedInTo(false)
        LoginFragment.clearCredentials()
        host.navController.navigate(R.id.login_dest)
        drawerLayout.closeDrawer(Gravity.LEFT)
    }
}

我的导航图:

<?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/nav_graph"
    app:startDestination="@id/home_dest">

    <fragment
        android:id="@+id/home_dest"
        android:name="com.company.app.features.home.HomeFragment"
        android:label="Home"
        tools:layout="@layout/fragment_home"
        >
        <action
            android:id="@+id/action_home_to_search"
            app:destination="@id/search_dest"
            app:enterAnim="@anim/slide_in_left"
            app:exitAnim="@anim/nav_default_exit_anim"
            />
        <action
            android:id="@+id/action_home_to_prefs"
            app:destination="@id/prefs_dest"
            app:enterAnim="@anim/slide_in_left"
            app:exitAnim="@anim/nav_default_exit_anim"
            />
        <action
            android:id="@+id/action_home_to_login"
            app:destination="@id/login_dest"
            app:enterAnim="@anim/slide_in_left"
            app:exitAnim="@anim/nav_default_exit_anim"
        />
        <action
            android:id="@+id/action_home_to_details"
            app:destination="@id/details_dest"
            app:popUpTo="@+id/homeFragment"
            app:enterAnim="@anim/slide_in_left"
            app:exitAnim="@anim/nav_default_exit_anim"
        />
        <action
            android:id="@+id/action_home_to_report"
            app:destination="@id/report_dest"
            app:enterAnim="@anim/slide_in_left"
            app:exitAnim="@anim/nav_default_exit_anim"
            app:popEnterAnim="@anim/nav_default_pop_enter_anim"
            app:popExitAnim="@anim/nav_default_pop_exit_anim" />
    </fragment>
    <fragment
        android:id="@+id/search_dest"
        android:name="com.company.app.features.search.SearchFragment"
        android:label="Search"
        tools:layout="@layout/fragment_search" >
        <action
            android:id="@+id/action_search_to_radio"
            app:enterAnim="@anim/nav_default_pop_enter_anim"
            app:destination="@id/radio_dest" />
        <action
            android:id="@+id/action_search_to_query"
            app:destination="@id/query_dest"
            app:enterAnim="@anim/slide_in_left"
            />
        <action
            android:id="@+id/action_search_to_results"
            app:destination="@id/results_dest"
        />
    </fragment>
    <fragment
        android:id="@+id/report_dest"
        android:name="com.company.app.features.report.ReportFragment"
        android:label="Report a Sighting"
        tools:layout="@layout/fragment_report" >
        <action
            android:id="@+id/action_report_to_query"
            app:destination="@id/query_dest"
            app:enterAnim="@anim/slide_in_left"
            app:exitAnim="@anim/nav_default_exit_anim"
            >

        </action>
        <action
            android:id="@+id/action_report_to_date"
            app:destination="@id/date_dest"
            app:enterAnim="@anim/nav_default_pop_enter_anim"
            />
        <action
            android:id="@+id/action_report_to_radio"
            app:enterAnim="@anim/nav_default_pop_enter_anim"
            app:destination="@id/radio_dest" />
        <action
            android:id="@+id/action_report_to_map"
            app:enterAnim="@anim/nav_default_pop_enter_anim"
            app:destination="@id/mappicker_dest" />
    </fragment>
    <fragment
        android:id="@+id/prefs_dest"
        android:name="com.company.app.features.prefs.UserPreferenceFragment"
        android:label="Preferences" >
    </fragment>
    <fragment
        android:id="@+id/login_dest"
        android:name="com.company.app.features.login.LoginFragment"
        android:label="Login"
        tools:layout="@layout/fragment_welcome_login" >

        <action
            android:id="@+id/action_login_to_home"
            app:destination="@id/home_dest"
            app:popUpTo="@+id/nav_graph"
            app:popUpToInclusive="true"
            app:enterAnim="@anim/slide_in_left"
            />

    </fragment>
    <dialog
        android:id="@+id/details_dest"
        android:name="com.company.app.features.details.DetailsFragment"
        android:label=""
        tools:layout="@layout/fragment_details" >
    </dialog>
    <fragment
        android:id="@+id/filters_dest"
        android:name="com.company.app.features.filters.MyFiltersFragment"
        android:label="My Filters"
        tools:layout="@layout/fragment_manage_filters" >
        <action
            android:id="@+id/action_filters_dest_to_edit_dest"
            app:destination="@id/filter_editor_dest" />
    </fragment>
    <fragment
        android:id="@+id/query_dest"
        android:name="com.company.app.features.queries.QueryFragment"
        android:label="{dynamicTitle}"
        tools:layout="@layout/query_fragment" >
        <argument
            android:name="dynamicTitle"
            app:argType="string"
        />
        <argument
            android:name="fieldId"
            app:argType="integer"
        />
    </fragment>
    <dialog
        android:id="@+id/date_dest"
        android:name="com.company.app.features.report.DateTimeFragment"
        android:label="fragment_date_picker"
        tools:layout="@layout/fragment_date_picker" />
    <fragment
        android:id="@+id/filter_editor_dest"
        android:name="com.company.app.features.filters.edit.FilterEditorFragment"
        android:label="{dynamicTitle}"
        tools:layout="@layout/fragment_edit_filter" >
        <argument
            android:name="dynamicTitle"
            app:argType="string"
            />
        <argument
            android:name="isNew"
            app:argType="boolean"
            android:defaultValue="true" />
    </fragment>
    <dialog
        android:id="@+id/radio_dest"
        android:name="com.company.app.features.commonUI.RadioButtonDialog"
        android:label="{dynamicTitle}"
        tools:layout="@layout/fragment_radio">
        <argument
            android:name="dynamicTitle"
            app:argType="string"
            />
        <argument
            android:name="fieldId"
            app:argType="integer"
            />
        <argument
            android:name="current"
            app:argType="integer"
            />
    </dialog>
    <fragment
        android:id="@+id/mappicker_dest"
        android:name="com.company.app.features.report.MapPickerFragment"
        android:label="Tap to locate this sighting"
        tools:layout="@layout/fragment_map_picker" />
    <fragment
        android:id="@+id/results_dest"
        android:name="com.company.app.features.search.SearchResultsFragment"
        android:label="Search Results"
        tools:layout="@layout/fragment_searchresult" >
        <action
            android:id="@+id/action_results_to_details"
            app:destination="@id/details_dest" />
    </fragment>

</navigation>

没有动画的典型导航语句:

private fun onSomethingClicked() {    
        navigate(HomeFragmentDirections.actionHomeToDetails())
    }



private fun navigate(action: NavDirections) {
        findNavController().navigate(action) // Should i be passing some extra argument here?
    }

【问题讨论】:

    标签: android animation kotlin android-jetpack android-jetpack-navigation


    【解决方案1】:

    DetailsFragment 是导航图中的对话框而不是 Fragment。您也可以通过here查看样品。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 2021-04-09
      • 2019-11-27
      • 2013-01-31
      • 1970-01-01
      相关资源
      最近更新 更多