我有一个包含三个 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) 我尝试通过导航抽屉活动创建一个新项目。使用视图模型自动生成片段。单击导航菜单时,它不会导航到相应的片段。
构建.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
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
我试图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
所以我有一个名为“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
我正在尝试膨胀一个视图,该视图包含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
我需要将相同的片段添加到不同的导航图。这是第一张图( 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)时,问题就消失了。问题是我需要第二段代码,因为我需要调用片段并与其共享捆绑包,与其他信息并显示不同的内容......如何实现这一点?
我也分享一下图表的设计:
移动导航
导航_初始
navigation android android-safe-args android-navigation-graph
我只有一项活动和几个片段。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
我使用navigation和SafeArgs到switch screens和pass data。
当在屏幕上选择数据时A,数据在屏幕切换的同时传输。
但是,有时屏幕会在没有任何操作的情况下A切换到屏幕B。
null我决定在这种情况下发送。
但我不断收到以下错误:
\nE/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)\nRun 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
我有一个带有 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
android ×9
kotlin ×3
android-architecture-navigation ×2
navigation ×2
dagger-hilt ×1
viewmodel ×1