I recently downloaded Android Studio Bumblebee and it helpfully asked whether I wanted to upgrade to Android Gradle Plugin 7.1.0, the version that shipped alongside Android Studio Bumblebee.
After upgrading, I get a build error:
Unable to load class 'com.android.build.api.extension.AndroidComponentsExtension'.
This is an unexpected error. Please file a bug containing the idea.log file.
Run Code Online (Sandbox Code Playgroud)
And looking at the idea.log
file, I see:
A problem occurred evaluating project ':main'.
at org.gradle.initialization.exception.DefaultExceptionAnalyser.transform(DefaultExceptionAnalyser.java:103)
...
Caused by: org.gradle.api.GradleScriptException: A problem occurred evaluating project ':main'.
at …
Run Code Online (Sandbox Code Playgroud) android android-gradle-plugin firebase-performance android-architecture-navigation android-safe-args
我正在BottomNavigationView
与导航组件一起使用。当显示片段不是根片段时,选项卡图标不会更新(选择)。
示例:
当我在带有片段 A(也是根片段)的Tab Home和带有片段 B(也是根片段)的Tab Star之间切换时,它工作正常。
但是,当我从Tab Home导航到另一个片段(例如片段 A2),然后点击Tab Star并再次返回Tab Home时,仍然在 中选择Tab StarBottomNavigationView
。
版本运行良好2.4.0-alpha05
,当我将其更新到2.5.0-alpha01
.
构建.gradle(应用程序)
implementation "androidx.navigation:navigation-fragment-ktx:2.5.0-alpha01"
implementation "androidx.navigation:navigation-ui-ktx:2.5.0-alpha01"
implementation "androidx.navigation:navigation-dynamic-features-fragment:2.5.0-alpha01"
Run Code Online (Sandbox Code Playgroud)
构建.gradle(根)
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.5.0-alpha01"
Run Code Online (Sandbox Code Playgroud)
<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/graph"
app:startDestination="@id/fragmentA">
<fragment
android:id="@+id/fragmentA"
android:name="ui.test.FragmentA"
tools:layout="@layout/fragment_test"
android:label="FragmentA" >
<action
android:id="@+id/action_fragmentA_to_fragmentA2"
app:destination="@id/fragmentA2" />
</fragment>
<fragment
android:id="@+id/fragmentA2"
android:name="ui.test.FragmentA2"
tools:layout="@layout/fragment_test"
android:label="FragmentA2" />
<fragment
android:id="@+id/fragmentB"
android:name="ui.test.FragmentB"
tools:layout="@layout/fragment_test"
android:label="FragmentB" />
</navigation>
Run Code Online (Sandbox Code Playgroud)
菜单:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"> …
Run Code Online (Sandbox Code Playgroud) 我正在做一个小项目并尝试使用新的导航架构组件。当我尝试向目的地添加一些参数时,出现“未解析的引用:NavArgs”错误。
我遵循了本指南https://developer.android.com/topic/libraries/architecture/navigation/navigation-pass-data#kotlin 并已添加
classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0-alpha11"
到我的项目gradle文件并添加
apply plugin: 'androidx.navigation.safeargs.kotlin'
到我的应用程序 gradle 文件。
如上面的指南所示,我想用它val args: AddKittenFragmentArgs by navArgs()
来获取传递的参数。但navArgs()
不被认可。
同样NavArgs
在生成的代码中没有解决。
data class MyFragmentArgs(val argOne: String? = "\"\"", val argTwo: String? = "\"\"") : NavArgs
Run Code Online (Sandbox Code Playgroud) navigation android android-architecture-components android-safe-args
我正在使用 dataBinding 开发一个 Android 应用程序,目前正在尝试添加安全参数插件,但在启用插件后,我无法再通过 binding.root 获取根视图 - Android Studio 给出错误:
Unresolved Reference
None of the following candidates is applicable because of a receiver type mismatch:
* internal val File.root: File defined in kotlin.io
Run Code Online (Sandbox Code Playgroud)
我怎样才能让数据绑定和安全参数一起玩得很好?
请注意,虽然代码片段在 Kotlin 中,但我很乐意接受 Java 答案。在 Java 中不太舒服,但我可以轻松阅读和翻译它。
通过谷歌搜索错误消息和“安全参数”,我无法找到其他有同样问题的人。我首先尝试使用 Android 文档中列出的类路径:https : //developer.android.com/guide/navigation/navigation-pass-data
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.1.0"
Run Code Online (Sandbox Code Playgroud)
然后还找到了一个教程,建议我使用:
classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0-alpha07"
Run Code Online (Sandbox Code Playgroud)
两者都有相同的问题:binding.root 在插件激活时出错
这是我的片段的 onCreateView() 。当安全参数未启用时,该返回行正常工作,并且在启用时不起作用
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_encoder, container, false)
return binding.root
}
Run Code Online (Sandbox Code Playgroud)
非常感谢任何帮助解决或理解这个问题!
在实现传参方案的过程中,在模块间的导航中,遇到了序列化错误。据我所知,Deeplinks 接受自定义参数类型,即 Parcelables 或 Serializable。
我使用的是最新版本的导航 2.2.0
错误信息:
java.lang.UnsupportedOperationException:Parcelables 不支持默认值。
我做错了什么还是仍在开发中?
这是一个简短的例子:
<fragment
android:id="@+id/sampleFragment"
android:name="com.testapp.app.samples.navigation.SampleFragment"
android:label="SampleFragment">
<argument
android:name="Args"
app:argType="com.testapp.navigation.SampleArgs" />
<deepLink app:uri="app://app/samples/navigation/SampleFragment?Args={Args}"/>
</fragment>
Run Code Online (Sandbox Code Playgroud)
@Parcelize
@Keep data class SampleArgs(
val text: String
) : NavArgs, Parcelable
Run Code Online (Sandbox Code Playgroud)
val x = SampleArgs("TEST")
val uri = Uri.parse("app://app/samples/navigation/SampleFragment?Args=$x")
navController.navigate(uri)
Run Code Online (Sandbox Code Playgroud)
我在这里发现了类似的东西Android Parcelable 不支持默认值 App Crash
这是我在堆栈上的第一篇文章,所以请保持温柔:)
编辑
这是答案:
我只是在学习 Android NavigationUI,并尝试使用 Safe Args 中的字符串默认值设置工具栏标题。但是有一些问题。
“字符串资源”文件:
<string name="title_add_item">Add new items</string>
Run Code Online (Sandbox Code Playgroud)
导航图文件。将标签设置为Title: {title}
参数。
<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/mainFragment">
<fragment
android:id="@+id/addNewItemFragment"
android:name="com.myapplication.AddNewItemFragment"
android:label="Title: {title}"
tools:layout="@layout/fragment_add_new_item" >
<argument
android:name="title"
app:argType="string"
android:defaultValue="@string/title_add_item" />
</fragment>
<fragment
android:id="@+id/mainFragment"
android:name="com.myapplication.MainFragment"
android:label="fragment_main"
tools:layout="@layout/fragment_main" >
<action
android:id="@+id/action_to_add_items_fragment"
app:destination="@id/addNewItemFragment" />
</fragment>
Run Code Online (Sandbox Code Playgroud)
如果{app:argType="string"}
我遇到错误:
Caused by: org.xmlpull.v1.XmlPullParserException: unsupported value 'Add new items' for string. You must use a "reference" type to reference other resources.
Run Code Online (Sandbox Code Playgroud)
如果 {app:argType="reference"}
应用程序有效,但我在标题中有一个数字(我认为这是一个资源 ID):
当然,我可以通过从参数中获取它来分配代码中工具栏标题的值。但是是否可以更改此代码以便正确填写标题?
string android android-navigation androidx android-safe-args
我需要将 KotlinPair
作为参数传递。
<argument android:name="data" app:argType="kotlin.Pair" />
Run Code Online (Sandbox Code Playgroud)
e: CreateCodeFragmentDirections.kt: (16, 15): 2 type arguments expected for class Pair<out A, out B>
Run Code Online (Sandbox Code Playgroud)
<argument android:name="data" app:argType="kotlin.Pair<String, String>" />
Run Code Online (Sandbox Code Playgroud)
Cause: markup not allowed inside attribute value - illegal < (position: TEXT seen ...<argument android:name="data" app:argType="kotlin.Pair<... @132:30)
Run Code Online (Sandbox Code Playgroud)
<argument android:name="data" app:argType="kotlin.Pair<String, String>" />
Run Code Online (Sandbox Code Playgroud)
Can't escape identifier `Pair<String, String>` because it contains illegal characters: <>
Run Code Online (Sandbox Code Playgroud)
上述尝试均无效。我该怎么做?
我正在使用安全参数将参数从一个片段传递到另一个片段。Android studio 间歇性地生成带有所有参数的 fragmentArgs 类。
我尝试过并且确实有效的是更改导航图文件,制作项目,然后撤消这些更改,最后再次制作项目。
使用的依赖项:
项目模块:
ext.nav_version = '2.2.0-beta01'
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
应用模块:
apply plugin: "androidx.navigation.safeargs.kotlin"
<fragment
android:id="@+id/someFragment"
android:name="package_name.SomeFragment"
android:label="@string/some_fragment">
<argument
android:name="source"
android:defaultValue="-1"
app:argType="integer" />
<argument
android:name="nationalId"
android:defaultValue="-1"
app:argType="integer" />
<argument
android:name="hudumaNumber"
android:defaultValue="-1"
app:argType="string" />
<argument
android:name="middleName"
android:defaultValue="None"
app:argType="string" />
</fragment>
Run Code Online (Sandbox Code Playgroud)
我希望所有参数都可以在生成的类中找到,但事实并非如此。
我正在使用带有 SafeArgs 的 Android 导航组件,并且我想向操作添加共享元素转换。根据文档,我应该能够简单地将 Extras 对象作为参数添加到navigate()
,所以我尝试:
FragmentNavigator.Extras extras = new FragmentNavigator.Extras.Builder()
.addSharedElement(view, "group_transition")
.build();
NavDirections action = HomeFragmentDirections.actionHomeFragmentToViewFragment(title);
Navigation.findNavController(view).navigate(action, extras);
Run Code Online (Sandbox Code Playgroud)
但是Android Studio给出了一个错误,并说它无法解析该方法。我尝试使用
.navigate(int resId, Bundle args, NavOptions navOptions, Navigator.Extras navigatorExtras)
这将问题缩小到Navigator.Extras
. Android Studios 在该参数下给出了一个错误,告诉我:
必需类型:androidx.navigation.Navigator.Extras,
提供类型:androidx.navigation.fragment.FragmentNavigator.Extras”
我无法弄清楚。Navigator.Extras
是一个接口,它FragmentNavigator.Extras
实现. 除了放弃我想要的转变之外,我还能做什么呢?
我将使用带有片段的导航框架,但在依赖项步骤中,当我尝试从文档添加 SafeArgs 时,我发现新的顶级 gradle 文件与文档不同,因此我无法添加它。您能解释一下如何将 SafeArgs 添加到新的 kotlin 顶级 gradle 文件吗?
我的顶级 gradle 文件:
plugins {
id 'com.android.application' version '7.1.2' apply false
id 'com.android.library' version '7.1.2' apply false
id 'org.jetbrains.kotlin.android' version '1.6.10' apply false}
task clean(type: Delete) {
delete rootProject.buildDir}
Run Code Online (Sandbox Code Playgroud)
文档顶级 Gradle :
buildscript {
repositories {
google()
}
dependencies {
val nav_version = "2.4.1"
classpath("androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version")
}}
Run Code Online (Sandbox Code Playgroud)
提前致谢。
android ×9
navigation ×4
kotlin ×3
android-architecture-components ×1
android-architecture-navigation ×1
androidx ×1
deeplink ×1
gradle ×1
java ×1
parcelable ×1
string ×1