标签: android-navigation

当我选择其他项目时,BottomNavigationView 中的第一项保持高亮显示

导航栏中的第一项保持突出显示。

当我点击导航栏上的其他项目时,内容会发生变化但相应的项目不会高亮显示,只是继续高亮第一个项目。

        bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            Fragment fragment=null;
            switch (item.getItemId()){
                case R.id.number:
                    fragment=new data();
                    break;
                case R.id.graph:
                    fragment=new graph();
                    break;
            }
            FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.content_drawer, fragment);
            fragmentTransaction.commit();
            return true;
        }
    });
Run Code Online (Sandbox Code Playgroud)

这是听众

<RelativeLayout 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"
>

<android.support.design.widget.BottomNavigationView
    android:id="@+id/navigation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorPrimaryDark"
    android:layout_alignParentBottom="true"
    android:layout_gravity="bottom"
    app:menu="@menu/navigation" />

<LinearLayout
    android:id="@+id/graphlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@id/navigation"
    android:orientation="vertical"
    android:gravity="center_vertical">

</LinearLayout>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

这是 xml

<?xml version="1.0" encoding="utf-8"?>
Run Code Online (Sandbox Code Playgroud)

<item
    android:id="@+id/number"
    android:title="number"
    android:checkable="true"/>

<item
    android:id="@+id/graph"
    android:title="graph" …
Run Code Online (Sandbox Code Playgroud)

android android-navigation

5
推荐指数
2
解决办法
3267
查看次数

即使在添加到 gradle 之后也无法解析参考

我正在解决对这三个类的引用:

  • 木材

  • 泄漏金丝雀

  • 查找导航控制器

我在我的 gradle 中为这些添加了依赖项,我在其他项目中也有这些依赖项,但我在这里遇到了问题。

我试图:

  • 清理、重建、依赖构建、构建必要
  • 删除了 .gradle、.idea、build、app/build 文件夹并重建应用程序,但问题仍然存在
  • 我也试过 invalidate-cache 并重新启动它也没有帮助

摇篮文件:

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.oss.licenses.plugin'
apply plugin: 'androidx.navigation.safeargs'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

android {
compileSdkVersion 28
buildToolsVersion '28.0.0 rc2'
defaultConfig {
    applicationId "com.nrs.sid.creditcardsecurity"
    minSdkVersion 19
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    javaCompileOptions {
        annotationProcessorOptions {
            arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
        }
    }
}
sourceSets {
    androidTest.assets.srcDirs += files("$projectDir/schemas".toString())
}
sourceSets {
    main.java.srcDirs += 'src/main/kotlin'
}
buildTypes { …
Run Code Online (Sandbox Code Playgroud)

android android-navigation android-gradle-plugin leakcanary timber-android

5
推荐指数
1
解决办法
4580
查看次数

条件片段和导航重用

给定 N 个片段,代表同一实体的不同 UI。片段有条件地显示。该条件仅在运行时已知。每个片段应该有相同的导航流。

如何使用导航架构组件 XML 图从片段中概括/抽象导航流以进一步重用?目前,我只看到为每个片段创建单独的目的地或嵌套导航的方式,但就重用而言,这是一个糟糕的想法。另一种选择是在 Kotlin/Java 代码中进行所有条件转换,但在这种情况下,应用程序的流程将不会在导航图架构中描述。有没有更好的方法来重用导航?

关于这个主题的官方文档非常空洞:https : //developer.android.com/topic/libraries/architecture/navigation/navigation-conditional

android android-fragments android-navigation android-architecture-components android-architecture-navigation

5
推荐指数
1
解决办法
2514
查看次数

带有 NavigationDrawer 的导航组件

我正在尝试在我的项目中使用导航组件实现 NavigationDrawer。我有一个 MainActivity 作为入口点和多个片段目的地。我已将我的抽屉菜单项链接到我的 nav_graph.xml 中的目的地,一切正常。

我的 NavigationDrawer 中有一个“注销”菜单项选项,单击它我将启动 LoginActivity。我的问题是

  1. 我将 LoginActivity 添加到我的 nav_graph 并将其链接到抽屉中的注销菜单项,这是正确的方法吗?
  2. 一旦 LoginActivity 启动,当用户按下系统后退按钮时,我希望应用程序转到启动器屏幕而不是堆栈中的上一个目的地。这可以通过导航组件实现吗?

这是我的 nav_graph.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/nav_graph"
    app:startDestination="@id/dashboardFragment">

    <fragment
        android:id="@+id/dashboardFragment"
        android:name="com.example.fragment.DashboardFragment"
        android:label="DashboardFragment"
        tools:layout="@layout/fragment_dashboard" />
    <fragment
        android:id="@+id/profileFragment"
        android:name="com.example.fragment.ProfileFragment"
        android:label="ProfileFragment"
        tools:layout="@layout/fragment_profile" />
    <fragment
        android:id="@+id/settingsFragment"
        android:name="com.example.fragment.SettingsFragment"
        android:label="SettingsFragment"
        tools:layout="@layout/fragment_sale_edit" />
    <activity
        android:id="@+id/loginActivity"
        android:name="com.example.activity.LogoutActivity"
        android:label="LogoutActivity"></activity>
</navigation>
Run Code Online (Sandbox Code Playgroud)

这是我的 drawer_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:showIn="navigationView">

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/dashboardFragment"
            android:icon="@drawable/ic_menu_camera"
            android:title="Dashboard" />
        <item
            android:id="@+id/profileFragment"
            android:icon="@drawable/ic_menu_gallery"
            android:title="Profile" />
        <item
            android:id="@+id/settingsFragment"
            android:icon="@drawable/ic_menu_slideshow"
            android:title="Sale Edits" />
        <item …
Run Code Online (Sandbox Code Playgroud)

android navigation-drawer android-navigation android-architecture-navigation

5
推荐指数
1
解决办法
3043
查看次数

如何在一项活动中拥有多个 navHostFragment?

我想在一个活动中拥有三个 navHostFragment,它们都占用相同的空间,但每个都托管不同的导航图。然后使用片段管理器和底部导航栏,我想在需要时显示每个(并隐藏其他),并以这种方式保持用户在每个图中的当前位置。

我目前在尝试在一项活动中使用其中 3 个时遇到问题,我收到此错误:

Caused by: java.lang.IllegalArgumentException: Binary XML file line #38: Duplicate id 0x7f0a0086, tag container_fragment, or parent id 0xffffffff with another fragment for androidx.navigation.fragment.NavHostFragment

这是我的 xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".FeedActivity">




    <androidx.appcompat.widget.Toolbar
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:theme="@style/MyActionBar"
            android:minHeight="?attr/actionBarSize"
            android:id="@+id/my_toolbar"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"/>


    <fragment
            android:id="@+id/feed_nav_host_fragment"
            android:tag="container_fragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_height="0dp"
            app:defaultNavHost="false"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintBottom_toTopOf="@+id/feed_bottom_nav"
            app:navGraph="@navigation/feed_nav_graph"
            android:layout_width="0dp"
            app:layout_constraintTop_toBottomOf="@+id/my_toolbar"
    />

    <fragment
            android:id="@+id/board_nav_host_fragment2"
            android:tag="container_fragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_height="0dp"
            app:defaultNavHost="false"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintBottom_toTopOf="@+id/feed_bottom_nav"
            app:navGraph="@navigation/board_nav_graph"
            android:layout_width="0dp"
            app:layout_constraintTop_toBottomOf="@+id/my_toolbar"

    />

    <fragment
            android:id="@+id/profile_nav_host_fragment3"
            android:tag="container_fragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_height="0dp"
            app:defaultNavHost="false" …
Run Code Online (Sandbox Code Playgroud)

navigation android android-navigation jitpack android-architecture-navigation

5
推荐指数
1
解决办法
4456
查看次数

导航 Lint 错误:未从任何布局文件中引用此导航图

我的应用程序中有 2 个模块(应用程序模块和启动模块)。我正在尝试利用<include>标签来使FTUE自包含,而不是文档建议的主导航图的一部分。

我的主导航图在 app 模块中定义,如下所示:

<?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">

  <include app:graph="@navigation/splash_nav_graph"/>

  <fragment
      android:id="@+id/home"
      android:name="com.example.Home"
      android:label="fragment_home"
      tools:layout="@layout/fragment_home">
    <action
        android:id="@+id/action_home_to_splash_nav_graph"
        app:destination="@id/splash_nav_graph"/>
  </fragment>

</navigation>
Run Code Online (Sandbox Code Playgroud)

splash_nav_graph 在 splash 模块中定义(app 模块显然依赖于它):

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

  <fragment
      android:id="@+id/splashFragment"
      android:name="com.example.splash.SplashFragment"
      android:label="example"
      tools:layout="@layout/fragment_splash">
    <action
        android:id="@+id/action_splashFragment_to_signInFragment"
        app:destination="@id/signInFragment"
        app:enterAnim="@anim/slide_in_right"
        app:exitAnim="@anim/slide_out_left"
        app:popEnterAnim="@anim/slide_in_left"
        app:popExitAnim="@anim/slide_out_right"/>
  </fragment>

  <fragment
      android:id="@+id/signInFragment"
      android:name="com.example.splash.signin.ui.SignInFragment"
      android:label="fragment_sign_in"
      tools:layout="@layout/fragment_sign_in">
    <action
        android:id="@+id/action_signInFragment_pop"
        app:popUpTo="@id/splash_nav_graph"/>
  </fragment>
</navigation>
Run Code Online (Sandbox Code Playgroud)

最后,这是导航图与应用模块中的 NavHostFragment 绑定的布局:

<?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"
    xmlns:tools="http://schemas.android.com/tools" …
Run Code Online (Sandbox Code Playgroud)

android android-navigation android-architecture-navigation android-navigation-editor

5
推荐指数
1
解决办法
1636
查看次数

AS 3.5 中的 lint 无法识别 SafeArgs 生成的类(Directions/Args)

我正在迁移多个应用程序以使用导航组件,但遇到了一个问题 - android-safe-args-gradle-pluginAndroid Studio 无法识别由 生成的 Directions/Args 类。

演示此问题的代码位于github.com/wooldridgetm/android-navigation.git,但问题的关键是,在下面的代码中,无法识别HomeFragmentDirections。这取自 class HomeFragment,第 76 - 82 行。

val b2 = view.findViewById<Button>(R.id.navigate_action_button)
b2.setOnClickListener {
    // PROBLEM: HomeFragmentDirections isn't recognized.
    val action = HomeFragmentDirections.nextAction()
    // PROBLEM: results in Unresolved reference: flowStepNumber
    // action.flowStepNumber = 1
    findNavController().navigate(action)
}
Run Code Online (Sandbox Code Playgroud)

我知道文档说了什么 & 我知道该类HomeFragmentDirections是由插件生成的 & 位于 app/ build / generated / source / navigation-args / debug /code/example/android/codelabs/navigation,但无法识别由 AS。

我也知道这在插件的 v2 之前确实有效......但它现在不起作用,我什至无法得到一个简单的例子来按预期运行。

关于什么是错的任何想法?


背景

我在 MacOS Mojave 10.14.6 上使用 AS 3.5。 …

android kotlin android-navigation android-architecture-navigation

5
推荐指数
1
解决办法
3152
查看次数

带有 NavController 导航的片段标签名称

使用导航架构时,是否可以将片段标签名称显式分配给您导航到的片段,以便稍后在需要在返回堆栈上对它们执行某些操作时可以引用它们?我指的是这样的导航调用:NavController.navigate(R.id.exampleFragment)

如果不可能,那么NavController.navigate()添加到返回堆栈的片段的默认标签名称是什么?

android android-fragments android-navigation android-architecture-navigation

5
推荐指数
1
解决办法
260
查看次数

使用 NavGraph 替换目的地(使用 app:popUpTo 时的事务)

我们需要实现一个状态机驱动的导航,其中当前显示的屏幕取决于当前状态。因此,到目前为止,我们的方法是使用全局操作并在状态发生变化时导航到正确的屏幕。乍一看,一切似乎都很好,但是,当app:popUpTo在动作上使用属性时,我们开始注意到一些奇怪的行为。

在我们的具体案例中,我们有 2 个子导航图(让我们称它们为NG1NG2),其中NG2是状态机驱动的。假设我们在 screen AinNG1然后我们导航到NG2,它添加了 screen B。我们现在有两个选择:

  1. 如果我们使用 with (有效地旨在替换with )的操作导航到 screen C(in NG2) ,那么有时,Fragment 会短暂启动 ( ) 几十毫秒,然后在开始之前停止。因此,我们得到。带有 , 的操作似乎不是事务性的。app:popUpTo="@+id/NG2"BCAonStartCB -> CB -> A -> CpopUpTo
  2. 如果我们使用不带 的操作导航到 screen C(in NG2) app:popUpTo="@+id/NG2",则 screenA不会启动,而是B留在后堆栈中。因此,如果 screenB需要再次显示,我们最终会得到一个看起来像 的 backstack A / B / C / …

android android-navigation android-jetpack android-architecture-navigation

5
推荐指数
0
解决办法
100
查看次数

使用视图绑定导航

我正在尝试使用视图绑定替换所有 findViewById。但是,我无法使用View Binding更改 NavController 代码行。

val navController = findNavController(this, R.id.mainHostFragment)
Run Code Online (Sandbox Code Playgroud)

var binding : ActivityMainBinding
val navController = findNavController(this, binding.mainHostFragment)
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

android-navigation android-viewbinding

5
推荐指数
1
解决办法
4378
查看次数