使用导航架构组件时动画错误

时间:2019-02-02 20:27:30

标签: android androidx android-jetpack android-architecture-navigation

我正在构建一个使用BottomNavigationView和导航架构组件(https://github.com/fkshiba/POCNavigation)的应用程序。 我为每个选项卡使用一个graph.xml,并且由于多个后退Activityissue无需导航AC即可完成选项卡之间的转换。我在home_graph.xml上执行了从Home2到Home3的过渡动画操作。 问题是,一旦运行此转换并跳回到Home2,然后导航到另一个选项卡。即使没有为它指定任何动画,当我从另一个选项卡过渡时,它也会为Home2片段再次运行弹出动画。

有人知道这个问题的解决方案吗?

2 个答案:

答案 0 :(得分:0)

我在GitHub上看到了您的代码,并且我认为您错误地使用了Android导航。首先,您不需要为以下情况创建不同的图形(在您的情况下为四个) 不同的片段。只需创建一个图并在其中添加所有必须在底部导航中使用的片段以及其他事务即可。 其次,您不需要手动执行片段交易(在您的活动代码中),您可以但不必要。 您更新的代码: 只有一张图:

<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_graph"
app:startDestination="@id/home2Fragment">
<fragment
    android:id="@+id/home2Fragment"
    android:name="com.felipeshiba.pocnavigation.Home2Fragment"
    android:label="fragment_home2"
    tools:layout="@layout/fragment_home2" >
    <action
            android:id="@+id/action_home2Fragment_to_home3Fragment"
            app:destination="@id/home3Fragment"
            app:enterAnim="@anim/nav_default_enter_anim"
            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/home3Fragment"
    android:name="com.felipeshiba.pocnavigation.Home3Fragment"
    android:label="fragment_home3"
    tools:layout="@layout/fragment_home3" >
    <deepLink
        android:id="@+id/deepLink"
        app:uri="ifood://home/" />
</fragment>
<fragment
    android:id="@+id/orders2Fragment"
    android:name="com.felipeshiba.pocnavigation.Orders2Fragment"
    android:label="fragment_orders2"
    tools:layout="@layout/fragment_orders2" />
<fragment
    android:id="@+id/profile2Fragment"
    android:name="com.felipeshiba.pocnavigation.Profile2Fragment"
    android:label="fragment_profile2"
    tools:layout="@layout/fragment_profile2" />
<fragment
    android:id="@+id/search2Fragment"
    android:name="com.felipeshiba.pocnavigation.Search2Fragment"
    android:label="fragment_search2"
    tools:layout="@layout/fragment_search2" /></navigation>

您更新的活动代码:

class NavigationActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_navigation)
    val host: NavHostFragment = supportFragmentManager
            .findFragmentById(R.id.navigation_container) as NavHostFragment? ?: return

    val navController = host.navController
    bottom_navigation.setupWithNavController(navController)

}}

现在,您可以在菜单中调用botton导航项(片段),方法是将菜单项ID替换为片段ID,如下所示: 更新的menu.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
    android:id="@+id/home2Fragment"
    android:icon="?android:attr/actionModeCopyDrawable"
    android:title="Home" />

<item
    android:id="@+id/search2Fragment"
    android:icon="@android:drawable/ic_menu_search"
    android:title="Search" />

<item
    android:id="@+id/orders2Fragment"
    android:icon="?android:attr/actionModePasteDrawable"
    android:title="Orders" />

<item
    android:id="@+id/profile2Fragment"
    android:icon="?android:attr/actionModeCutDrawable"
    android:title="Profile" /></menu>

您的activity.xml:

<android.support.constraint.ConstraintLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".NavigationActivity">

<fragment
    android:id="@+id/navigation_container"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:visibility="gone"
    app:defaultNavHost="true"
    app:navGraph="@navigation/home_graph"
    app:layout_constraintBottom_toTopOf="@id/bottom_navigation"
    app:layout_constraintTop_toTopOf="parent" />

<android.support.design.widget.BottomNavigationView
    android:id="@+id/bottom_navigation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_constraintBottom_toBottomOf="parent"
    app:menu="@menu/bottom_navigation"></android.support.constraint.ConstraintLayout>

对于其他更新(工作)的代码,例如清单检查here

答案 1 :(得分:0)

在进入BottomNavigationView中的其他选项卡之前,NavigationUI始终会弹出以启动目标位置,这就是导航库的工作方式。设置自定义OnNavigationItemSelectedListener并进行自我导航,然后通过NavOptions传递动画。