标签: android-navigation-graph

是否可以使用不同风格的不同导航图

我有一个包含三个 flavor_a 、 flavor_b 和 flavor_c 的 Android 项目。风味_a 和风味_b 使用相同的导航图。对于flavor_c 工作流程是不同的意味着只需要使用片段的子集。

是否可以对现有片段和源代码使用不同的导航图。

我尝试了一个带有现有片段的新导航图,但因错误而失败:

AAPT:错误:找不到资源 ID/splashFragment(又名 com.sample.app:id/splashFragment)。

源文件夹结构

-- main
   -- src
   -- res
      -- navigation
         --navigation_graph.xml
-- flavour_c
   --res
     --navigation
         --navigation_graph.xml
Run Code Online (Sandbox Code Playgroud)

navigation android android-navigation-graph

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

带有导航图的导航抽屉不起作用

我尝试通过导航抽屉活动创建一个新项目。使用视图模型自动生成片段。单击导航菜单时,它不会导航到相应的片段。

构建.gradle

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'com.google.android.material:material:1.0.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.navigation:navigation-fragment:2.0.0'
    implementation 'androidx.navigation:navigation-ui:2.0.0'
    implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
}
Run Code Online (Sandbox Code Playgroud)

主Activity.class

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);
        // Passing each menu …
Run Code Online (Sandbox Code Playgroud)

android navigation-drawer android-navigationview android-navigation-graph

4
推荐指数
1
解决办法
853
查看次数

Android Navigation Component Activity Intent Flags

I have created a navigation action from a fragment to an activity, but I have no way of clearing the back stack. When I execute the navigation action from my fragment to my new activity, and I press the back button, I am taken back to the previous activity and previous fragment. I have no way of setting Intent flags, using the navigation graph, to clear the previous activity from the back stack.

<fragment
    android:id="@+id/loginFragment"
    android:name="com.myapp.auth.LoginFragment"
    android:label="login_fragment"
    tools:layout="@layout/login_fragment" >
    <action …
Run Code Online (Sandbox Code Playgroud)

android android-architecture-navigation android-navigation-graph

4
推荐指数
2
解决办法
2920
查看次数

将 ArrayList 作为参数传递给 safeArgs

我试图ArrayList<String>在使用 safeArgs 时将 an作为参数传递。但是当我从可序列化和构建的列表中选择 ArrayList 时,它向我抛出这些异常

One type argument expected for class ArrayList<E : Any!>
One type argument expected. Use 'ArrayList<*>' if you don't want to pass type arguments
Run Code Online (Sandbox Code Playgroud)

我知道我必须为 ArrayList 设置数据类型,但在从导航图屏幕设置 safeArgs 时,我无法这样做,也没有选项。

在导航图 XML 中,代码生成为

<argument
            android:name="teamsToAdd"
            app:argType="java.util.ArrayList" />
Run Code Online (Sandbox Code Playgroud)

有没有办法在导航图的 XML 中声明 dataType?

android kotlin android-navigation android-safe-args android-navigation-graph

4
推荐指数
1
解决办法
3211
查看次数

如何在jetpack compose中获取带有刀柄外部活动的视图模型

所以我有一个名为“ListScreen”的 kotlin 文件(它不是一个类!只是一个具有可组合函数的 .kt 文件),我正在使用组合导航图系统处理事务。现在我正在尝试访问“ListScreen”文件中ViewModel指示的我的。@HiltViewModel显然,在过去,有一种方法ViewModels可以像这样使用刀柄进行访问: viewModel: PokemonListViewModel = hiltNavGraphViewModels() 但现在不起作用。我该怎么做?

这是我的ViewModel课:

@HiltViewModel
class PokemonListViewModel @Inject constructor(
private val repository: PokemonRepository
) : ViewModel() {


fun calcDominantColor(
    drawable: Drawable,
    onFinish: (Color) -> Unit
) {
    val bmp = (drawable as BitmapDrawable).bitmap.copy(Bitmap.Config.ARGB_8888, true)

    Palette.from(bmp).generate { palette ->
        palette?.dominantSwatch?.rgb?.let {
            onFinish(Color(it))

        }

    }
}
}
Run Code Online (Sandbox Code Playgroud)

这是不起作用的代码块:

 @Composable
fun PokedexEntry(
    entry: PokedexListEntry,
    navController: NavController,
    modifier: Modifier = Modifier,
    viewModel: PokemonListViewModel = hiltNavGraphViewModels()

) 
Run Code Online (Sandbox Code Playgroud)

android viewmodel android-jetpack-compose android-navigation-graph dagger-hilt

4
推荐指数
1
解决办法
4023
查看次数

是否可以在“Fragment”中膨胀包含“FragmentContainerView”的视图?

我正在尝试膨胀一个视图,该视图包含FragmentContainerView正在放入布局中的片段。

  • 根视图
    • 分段
      • 自定义视图
        • 片段容器视图

像这样:

val transaction = fragmentManager.beginTransaction()
transaction.replace(R.id.main_content, Frag(), "tag");
transaction.commitNowAllowingStateLoss()
Run Code Online (Sandbox Code Playgroud)

其中Frag创建一个视图,该视图会像这样扩展 xml:

<?xml version="1.0" encoding="utf-8"?>
<merge 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:parentTag="android.widget.FrameLayout">

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/nav_graph" />
</merge>
Run Code Online (Sandbox Code Playgroud)

但是当我执行代码时,我的应用程序崩溃了:

引起原因:java.lang.IllegalStateException:FragmentManager 已经在执行事务


如何在使用时避免此错误FragmentContainerView(观察:如果我使用<fragment>而不是<androidx.fragment.app.FragmentContainerView>,一切正常)

android android-fragments android-navigation android-navigation-graph

3
推荐指数
1
解决办法
1095
查看次数

当我将相同的片段添加到第二个导航图时,无法识别操作类

我需要将相同的片段添加到不同的导航图。这是第一张图( mobile_navigation)的代码片段

<fragment
    android:id="@+id/nav_contactanos"
    android:name="com.engie.mexico.micuenta.Fragments.FragmentContactanosCliente"
    tools:layout="@layout/fragment_contactanos_cliente" >
    <action
        android:id="@+id/action_nav_contactanos_to_nav_aviso_privacidad"
        app:destination="@id/nav_aviso_privacidad" />
    <action
        android:id="@+id/action_nav_contactanos_to_nav_terminos_condiciones"
        app:destination="@id/nav_terminos_condiciones" />
    <action
        android:id="@+id/action_nav_contactanos_to_nav_mensaje_usuario"
        app:destination="@id/nav_mensaje_usuario" />
</fragment>
Run Code Online (Sandbox Code Playgroud)

第二个导航图中的第二个代码片段 ( navigation_initial )

    <fragment
    android:id="@+id/nav_contactanos_cliente"
    android:name="com.engie.mexico.micuenta.Fragments.FragmentContactanosCliente"
    tools:layout="@layout/fragment_contactanos_cliente" >
    <action
        android:id="@+id/action_nav_contactanos_cliente_to_nav_mensaje_usuario"
        app:destination="@id/nav_mensaje_usuario" />
    <action
        android:id="@+id/action_nav_contactanos_cliente_to_nav_terminos_condiciones"
        app:destination="@id/nav_terminos_condiciones" />
    <action
        android:id="@+id/action_nav_contactanos_cliente_to_nav_aviso_privacidad"
        app:destination="@id/nav_aviso_privacidad" />
</fragment>
Run Code Online (Sandbox Code Playgroud)

当我尝试 MakeProject 时,构建输出向我显示错误:

C:\Android\MiCuenta\app\src\main\java\com\engie\mexico\micuenta\Fragments\FragmentContactanosCliente.java:478: error: cannot find symbol
            FragmentContactanosClienteDirections.ActionNavContactanosToNavMensajeUsuario action = symbol:   class ActionNavContactanosToNavMensajeUsuario
Run Code Online (Sandbox Code Playgroud)

位置:类 FragmentContactanosClienteDirections

但是当我评论第二段代码(navigation_initial)时,问题就消失了。问题是我需要第二段代码,因为我需要调用片段并与其共享捆绑包,与其他信息并显示不同的内容......如何实现这一点?

我也分享一下图表的设计:

移动导航

mobile_navigation.xml(设计)

导航_初始

navigation_initial.xml(设计)

navigation android android-safe-args android-navigation-graph

3
推荐指数
1
解决办法
2316
查看次数

如何在Fragment中设置BottomNavigationView

我只有一项活动和几个片段。NavController我使用这样的导航图设置我的活动:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)

    val navHostFragment = supportFragmentManager
                        .findFragmentById(R.id.nav_host_activity_main) as NavHostFragment
    navController = navHostFragment.findNavController()

}

override fun onSupportNavigateUp(): Boolean {
    return navController.navigateUp() || super.onSupportNavigateUp()
}
Run Code Online (Sandbox Code Playgroud)

在此导航图中,我负责启动屏幕、登录、注册片段以及转到具有BottomNavigationView两个子片段的主片段。

我为 BottomNavView 片段制作了一个菜单,并为它们制作了一个图表,菜单 id 与底部导航图 id 相匹配。

我的布局如下所示:

<androidx.fragment.app.FragmentContainerView
    android:id="@+id/nav_host_fragment_main"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:defaultNavHost="true"
    app:layout_constraintBottom_toTopOf="@+id/bottom_Navigation_view"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:navGraph="@navigation/bottom_view_nav_graph" />

<com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/bottom_Navigation_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:menu="@menu/bottom_nav_menu" />

</androidx.constraintlayout.widget.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)

在主要片段中,我尝试使用导航图设置底部导航视图,如下所示:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    val appCompat …
Run Code Online (Sandbox Code Playgroud)

android android-fragments kotlin android-jetpack android-navigation-graph

3
推荐指数
1
解决办法
2778
查看次数

为什么在导航中切换屏幕时无法获取 null 作为参数?

我使用navigationSafeArgsswitch screenspass data

\n

当在屏幕上选择数据时A,数据在屏幕切换的同时传输。

\n

但是,有时屏幕会在没有任何操作的情况下A切换到屏幕B

\n

null我决定在这种情况下发送。

\n

但我不断收到以下错误:

\n
E/AndroidRuntime: FATAL EXCEPTION: main\n    Process: com.example.lightweight, PID: 9555\n    java.lang.RuntimeException: java.lang.reflect.InvocationTargetException\n        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:612)\n        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)\n     Caused by: java.lang.reflect.InvocationTargetException\n        at java.lang.reflect.Method.invoke(Native Method)\n        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)\n        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)\xc2\xa0\n     Caused by: java.lang.reflect.InvocationTargetException\n        at java.lang.reflect.Method.invoke(Native Method)\n        at androidx.navigation.NavArgsLazy.getValue(NavArgsLazy.kt:54)\n        at androidx.navigation.NavArgsLazy.getValue(NavArgsLazy.kt:35)\n        at com.example.lightweight.fragment.WriteRoutineFragment.getArgs(WriteRoutineFragment.kt:20)\n        at com.example.lightweight.fragment.WriteRoutineFragment.onViewCreated(WriteRoutineFragment.kt:44)\n        at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2985)\n
Run Code Online (Sandbox Code Playgroud)\n

导航.xml

\n
<fragment\n        android:id="@+id/writeRoutine"\n        android:name="com.example.lightweight.fragment.WriteRoutineFragment"\n        android:label="fragment_write_routine"\n        tools:layout="@layout/fragment_write_routine" >\n        <action\n            android:id="@+id/action_writeRoutineFragment_to_workoutListTabFragment"\n            app:destination="@id/workoutListTabFragment" />\n …
Run Code Online (Sandbox Code Playgroud)

android android-navigation android-safe-args android-navigation-graph

2
推荐指数
1
解决办法
2223
查看次数

使用导航组件从后台删除片段

我有一个带有 navHost 片段的 PinCreateActivity 和 2 个片段 PinSetup 和 PinCreate 片段。

当 Activity 启动时,PinSetup 是默认片段,之后通过单击按钮导航到 PinCreate 片段。我想要的是来自 PinCreate 片段,当用户单击后退按钮时,不要像 PinCreateActivity 那样转到 PinSetup 并导航到后退堆栈。所以我想当我从 PinSetup 导航到 PinCreate 片段时,我必须从 backStack 中删除 PinSetup。我怎样才能做到这一点?

导航图.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/pin_create_nav_graph"
    app:startDestination="@id/pinSetupFragment">

    <fragment
        android:id="@+id/pinSetupFragment"
        android:name="com.example.ui.fragments.pin.PinSetupFragment"
        android:label="Create PIN"
        tools:layout="@layout/fragment_pin_setup" >
        <action
            android:id="@+id/action_pinSetupFragment_to_pinCreateFragment"
            app:destination="@id/pinCreateFragment" />
    </fragment>
    <fragment
        android:id="@+id/pinCreateFragment"
        android:name="com.example.ui.fragments.pin.PinCreateFragment"
        android:label="Your PIN"
        tools:layout="@layout/fragment_pin_create" />
</navigation>
Run Code Online (Sandbox Code Playgroud)

Pin创建活动

private lateinit var navController: NavController

 override fun onCreate(savedInstanceState: Bundle?) {
 
    ...
    navController = Navigation.findNavController(this, R.id.pin_create_host_fragment)


    // onClick
    navController.navigate(R.id.action_pinSetupFragment_to_pinCreateFragment)

 }
Run Code Online (Sandbox Code Playgroud)

android-fragments kotlin android-architecture-navigation android-jetpack-navigation android-navigation-graph

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