当前位置: 首页 > 知识库问答 >
问题:

Android自定义导航抽屉有奇怪的背景

桂宏旷
2023-03-14

我有一个类似Android Studios的应用程序导航抽屉活动:

我的活动使用Android架构导航组件

navController.navigate(R.id.myCorrespondingFragment)

到目前为止,一切正常。返回时问题开始:

让我们想象我从“家”——片段甲——导航

Android Studio示例正确运行:C-

我的实现没有:它只是弹出后台C-

我该怎么弥补?

缩小主布局:

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout  android:id="@+id/drawerLayout" >

    <LinearLayout android:orientation="vertical" >

            <androidx.appcompat.widget.Toolbar  android:id="@+id/toolbar" />
        
        <fragment
            android:id="@+id/container"
            android:name="androidx.navigation.fragment.NavHostFragment"
            app:defaultNavHost="true"
            app:navGraph="@navigation/nav_graph"
            />

    </LinearLayout>

    <fragment
        android:name="com.company.drawer.DrawerFragment"
        android:layout_gravity="start"
        />

</androidx.drawerlayout.widget.DrawerLayout>

导航图:

<?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"
    android:id="@+id/navigation_graph"
    app:startDestination="@id/doorFragment"
    >

    <fragment
        android:id="@+id/doorFragment"
        android:name="com.company.door.DoorFragment"
        android:label="@string/shared_empty"
        />

    <fragment
        android:id="@+id/historyFragment"
        android:name="com.company.history.HistoryFragment"
        android:label="@string/history"
        />

    <fragment
        android:id="@+id/settingsFragment"
        android:name="com.company.settings.SettingsFragment"
        android:label="@string/settings"
        />
</navigation>

与我的主要活动onCreate相关的所有导航:

setSupportActionBar(toolbar)     
val navController = (supportFragmentManager.findFragmentById(R.id.container) as NavHostFragment).navController
toolbar.setupWithNavController(navController, AppBarConfiguration(
    listOf(R.id.doorFragment, R.id.historyFragment, R.id.settingsFragment)
    , drawerLayout
))

共有2个答案

房项禹
2023-03-14

您可以使用全局操作,这样您就不必为片段导航的每个片段添加操作,而只需为每个片段目标添加操作。这在XML中看起来像这样:

<action android:id="@+id/action_global_doorFragment"
    app:destination="@id/doorFragment"
    app:popUpTo="@id/@id/doorFragment"
    app:restoreState="true"
    app:popUpToSaveState="true" />
<action android:id="@+id/action_global_historyFragment"
    app:destination="@id/historyFragment"
    app:popUpTo="@id/@id/doorFragment"
    app:restoreState="true"
    app:popUpToSaveState="true" />
<action android:id="@+id/action_global_settingsFragment"
    app:destination="@id/historyFragment"
    app:popUpTo="@id/@id/doorFragment"
    app:restoreState="true"
    app:popUpToSaveState="true" />

请注意,我总是将您的开始目标用于弹出窗口,并保存Backback状态。对于您的用例,您不一定需要后者(restoreState和poputsavestate),但当您有多个片段用于单个抽屉条目时,您可能希望以后使用它。这将使您获得与当前标准抽屉集成相同的行为。

下面是一个简单的示例,介绍如何使用全局操作转到设置片段。(文档还解释了如何将全局操作与SafeArgs-Gradle插件结合使用,这可能是更好的方法。)

navController.navigate(R.id.action_global_settingsFragment)

如果您不希望每个目的地都有额外的操作,并且您的抽屉菜单项与其目的地具有相同的id,您也可以像这样以编程方式执行此操作:

override fun onNavigationItemSelected(item: MenuItem): Boolean {
    navController.navigate(item.itemId, null, navOptions {
        restoreState = true
        popUpTo(navController.graph.findStartDestination().id) {
            saveState = true
        }
    })

    return true
}
松高爽
2023-03-14

你可以这样试试

<fragment
android:id="@+id/fragmentA"
android:name="com.package.FragmentA"
android:label="Fragment A">

<action
    android:id="@+id/action_fragmentA_to_fragmentB"
    app:destination="@id/fragmentB"
    app:popUpTo="@id/fragmentB"
    app:popUpToInclusive="true / false" />
</fragment>
 类似资料:
  • 我有一个在几个活动之间过渡的导航抽屉。在每个活动中,我都有一个基础片段,它可能启动其他片段。我希望导航抽屉切换图标显示时,我在基础片段,但当我添加另一个片段,我需要显示后箭头。 我一直在遵循riwnodennyk在的示例:使用片段时在Android导航抽屉图像和上插入符号之间切换 但这对我不起作用。箭头确实会出现,但我无法单击它。当点击它时,什么也不会发生。 非碱基片段中的OptionsMenuL

  • 有人能告诉我如何创建活动到这个主要活动,导航抽屉将看到在所有他们?我需要使用这个特定的MainActivity代码。我不需要使用碎片,只要3个简单的活动将添加到这个抽屉。 NavDrawer布局:

  • 我正在将新的Jetpack Android导航与抽屉布局结合使用。当在抽屉XML中使用相同的ID并结合导航图中的片段时,一切都按预期工作。我设置了所有内容: 我现在还想触发自定义操作/代码,而不是在单击抽屉菜单中的项目时执行片段事务。我有一个菜单,单击“注销”时想注销用户:

  • 我实现了双抽屉布局。我还建立了一个ActionBarDrawerToggle。 我的问题是当我点击主页按钮时,我的左抽屉打开并播放动画。打开时我的右抽屉也显示抽屉打开动画。这会导致与主页图标奇怪的同步问题,即使使用mDrawerToggle.sync状态(); 我要做的是拦截打开左侧抽屉的home button click事件,以便测试哪个抽屉打开,然后适当地关闭那个抽屉。有没有办法在主页图标上设

  • 我是android新手。我有一个关于Android导航抽屉的问题。我在我的应用程序中加入了导航抽屉,一切都很顺利,但我想知道是否有人能帮我在导航抽屉列表中获得惰性动画。 图像的来源。 非常感谢。

  • 问题内容: 我在使用Navigation Drawer时遇到问题,它太慢了,我要寻找的解决方案是先关闭抽屉,然后显示活动,但它不起作用,肯定是我遗漏了一些东西。 问题答案: 您可以通过这种方式来避免抽屉滞后,更改 onItemClick : 编辑: 首选方式应该是在DrawerLayout上设置DrawerListener,然后 像这样设置片段: