我刚刚将 Android Studio 更新到 v3.5 并且我的项目停止运行,给我以下异常:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mcampana.turle/com.mcampana.turle.MainActivity}: android.view.InflateException: Binary XML file line #10: Binary XML file line #10: Error inflating class fragment
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: android.view.InflateException: Binary XML file line #10: Binary XML file line #10: Error inflating class fragment
Caused by: android.view.InflateException: Binary XML file line #10: Error inflating class …Run Code Online (Sandbox Code Playgroud) 我在单独的文件中创建了多个图表。
第一个是GraphA,它包括GraphB。GraphBstartDestination的FragmentB具有名为AnID的参数
现在我想将AnID从GraphA传递到GraphB ( FragmentB )
尽管编辑器知道该参数,但生成的代码不考虑该参数:
val directionB = FragmentADirections.actionFragmentAToGraphB(/* HAS NOT ARGUMENT */)
findNavController().navigate(directionB)
Run Code Online (Sandbox Code Playgroud)
如何将参数传递给嵌套图?
我有一个像这样的导航图
它是一个文件夹/文件列表应用程序,当单击文件夹时,它将通过图形定义的操作导航到具有新实例的同一片段。当我导航到一些文件夹并当前位于文件夹 D 中后,会出现如下所示的按钮面包屑。
根目录 -> 文件夹 A -> 文件夹 B -> 文件夹 C -> 文件夹 D
当我单击面包屑上的文件夹 B 时,如何弹出或导航回返回堆栈中的“文件夹 B”片段?
编辑:导航代码
// Handle click a folder, navigate to new listing fragment
private fun onItemClick(
adapter: BaseQuickAdapter<Any, BaseViewHolder>,
view: View,
position: Int
){
val item = adapter.getItem(position) as? CloudFile ?: return
if (item.isDirectory){
findNavController().navigate(R.id.action_cloudFileListing, bundleOf(ARG_CLOUD_FOLDER to item), getNavOptions())
}
}
private fun getNavOptions(): NavOptions? {
return NavOptions.Builder()
.setEnterAnim(R.anim.enter_from_right)
.setExitAnim(R.anim.exit_to_left)
.setPopEnterAnim(R.anim.enter_from_left)
.setPopExitAnim(R.anim.exit_to_right)
.build()
}
Run Code Online (Sandbox Code Playgroud) android android-architecture-components android-architecture-navigation android-navigation-graph
我在我的 android 项目中使用导航组件。我启用了 Gradle 的类型安全 args 插件,这里是我的build.gradle(app)文件。
apply plugin: 'com.android.application'
apply plugin: "androidx.navigation.safeargs"
apply plugin: 'com.google.gms.google-services'
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.example.nibotransporti"
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
dataBinding.enabled = true
compileOptions {
sourceCompatibility = 1.8
targetCompatibility = 1.8
};
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.legacy:legacy-support-core-utils:1.0.0' …Run Code Online (Sandbox Code Playgroud) java android android-architecture-navigation android-navigation-graph android-studio-3.6.1
我为我的 Kotlin 应用程序构建了一项 FCM 服务,这是一个活动和多个片段类型的应用程序。我正在使用导航图从一个片段转到下一个片段。我可以看到推送通知用于数据和通知。每个通知都有一个自定义值调用notify_type。我可以在服务中很好地看到并读取这个变量。根据notify_type值,我想打开不同的片段。我想使用导航图控制器打开。有人可以帮我弄清楚需要做什么才能从 FCM 服务打开片段吗?蒂亚!
override fun onMessageReceived(remoteMessage: RemoteMessage?) {
remoteMessage?.let {
it.data?.let { itDT ->
Log.d(TAG, "Message data payload: $itDT")
val notifyType = itDT["notify_type"]
when (notifyType) {
"public_profile" -> {
val userId = itDT["user_id"]
//need to open public profile fragment sending user id
//would normally use this. Obviously doesn't work in a service
val navController = it.findNavController()
val action = HomeFragmentDirections.actionNavigationHomeToPublicProfileFragment(
userId
)
navController.navigate(action)
} else -> {
Log.d(TAG, "Unsupported notifyType: $notifyType")
}
}
}
it.notification?.let { …Run Code Online (Sandbox Code Playgroud) push-notification android-fragments kotlin firebase-cloud-messaging android-navigation-graph
在我的应用程序中,用户可以选择一个类别,然后在该类别中选择一个项目以最终查看项目详细信息。标准/转发流程是:
SelectCategoryFragment->SelectItemFragment->ViewItemDetailsFragment
在选择类别时,selectedCatId通过Bundlefrom SelectCategoryFragmentto传递SelectItemFragment:
NavController navController = Navigation.findNavController(v);
Bundle args = new Bundle();
args.putLong(SelectItemFragment.ARG_CATEGORY_ID, selectedCatId);
navController.navigate(R.id.action_nav_categories_to_items, args);
Run Code Online (Sandbox Code Playgroud)
SelectItemFragment然后将使用该getArguments().getLong(ARG_CATEGORY_ID)值来查询和显示所选类别中的相应项目。
这很好用。但是我现在正在尝试在用户点击通知时实现深度链接,将他们直接跳转到ViewItemDetailsFragment一个可以将他们带到SelectItemFragment, then的后台堆栈SelectCategoryFragment。
我的问题是,如上所述,SelectItemFragment取决于ARG_CATEGORY_ID传递给它的参数以检索/显示其数据。我已经阅读了深层链接和嵌套导航图,但真的不知道如何通过ARG_CATEGORY_ID深层链接/反向堆栈。
当用户按回时,是否有一种整洁的方式可以将数据从 传递ViewItemDetailsFragment到SelectItemFragment?
android android-architecture-components android-architecture-navigation android-deep-link android-navigation-graph
我目前所处的情况是,重构整个应用程序以形成一个更有凝聚力的整体可能是不可行的,但当前使用 Jetpack Navigation 的方法正在导致崩溃。
该应用程序有多个图表,为了简单起见,我们将它们称为:
图A、
图B、
图C
图形 A 通过app:navGraph在活动布局中设置,如果它仍然是唯一使用的图形,则应用程序可以并将在进程死亡后恢复其状态。
然而,在某些时刻,应用程序通过使用 FragmentContainerView 的 navController 并使用提供的新图形 id调用setGraph(graphResId: Int)以编程方式切换图形。在此之前,也使用手动膨胀图表。
设置图表的两种方法都会导致进程死亡后第一次重新启动后崩溃,并抛出异常:
Unable to start activity ComponentInfo{com.appname.dev/com.appname.activity.MainActivity}: java.lang.IllegalStateException: Restoring the Navigation back stack failed: destination com.appname.dev:id/graph_b cannot be found from the current destination null
Run Code Online (Sandbox Code Playgroud)
异常发生在MainActivity onCreate调用super.onCreate()
我能想到的唯一解决方案是将其他图形包含在第一个图形中,使用操作导航到其他图形,从而避免切换图形。然而,由于申请的制作方式,最终可能会非常耗时。
我想知道我是否错过了可以调解这次崩溃的重要步骤。
android android-fragments kotlin android-jetpack-compose android-navigation-graph
实际上 DetailActivity(需要传递参数)存在于库模块中,我需要从应用程序(FragmentA)启动它,但我收到构建错误,如下所示:
Too many arguments for public final fun actionFragmentAToDetailActivity()
Run Code Online (Sandbox Code Playgroud)
我正在使用 SafeArgs 库来传递数据。
片段A
findNavController().navigate(
FragmentADirections.actionFragmentAToDetailActivity(
"id",
"name"
)
)
Run Code Online (Sandbox Code Playgroud)
nav_graph_app.xml(存在于应用程序模块中)
<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/fragment_a_navigation"
app:startDestination="@id/fragmentA">
<fragment
android:id="@+id/fragmentA"
android:name="com.abhishek.fragmentA"
android:label="WeeklyWorkListFragment"
tools:layout="@layout/fragment_a">
<action
android:id="@+id/action_fragmentA_to_DetailActivity"
app:destination="@id/detail_activity" />
</fragment>
</navigation>
Run Code Online (Sandbox Code Playgroud)
nav_graph_common_component.xml(存在于库项目中,作为库模块包含在应用程序的 build.gradle 中)
<navigation
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/common_component_navigation"
<activity
android:id="@+id/detail_activity"
android:name="com.components.DetailActivity"
android:label="DetailActivity"
tools:layout="@layout/activity_detail">
<argument
android:name="id"
app:argType="string" />
<argument
android:name="name"
app:argType="string" />
</activity>
</navigation>
Run Code Online (Sandbox Code Playgroud)
任何帮助或指导将不胜感激。
android android-architecture-navigation android-safe-args android-navigation-graph
我在 firebase 上看到了这个崩溃,并且在相同操作系统的模拟器中无法重现。不知道是什么原因造成的。三星 M32 OS 11 发生崩溃。
崩溃是
Caused by java.lang.RuntimeException: java.lang.ClassNotFoundException: com.octave.data.offer.Classes
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/offer_nav_graph"
app:startDestination="@id/offersFragment">
<fragment
android:id="@+id/availableOfferDetailFragment"
android:name="com.octave.offers.available.detail.AvailableOfferDetailFragment"
android:label="fragment_available_offer_detail"
tools:layout="@layout/fragment_available_offer_detail">
<action
android:id="@+id/action_availableOfferDetailFragment_to_applyOfferFragment"
app:destination="@id/applyOfferFragment">
<argument
android:name="classes"
app:argType="com.octave.data.offer.Classes[]" />
<argument
android:name="paymentPlans"
app:argType="com.octave.data.offer.PaymentPlan[]" />
<argument
android:name="offerName"
app:argType="string" />
</action>
</fragment></navigation>
Run Code Online (Sandbox Code Playgroud)
我的数据类如下
@Parcelize
data class Classes(
val id: Int,
val name: String,
val totalEquity: Int,
val reservedEquity: Int,
val expectedReturn: Float,
val subscribed: Int
):Parcelable
@Parcelize
data class PaymentPlan(
val id: String?=null,
val name: String,
var payment: Int,
val …Run Code Online (Sandbox Code Playgroud) android classnotfoundexception kotlin android-navigation android-navigation-graph
我使用导航组件和底部导航栏,并为了处理选项卡栏导航,请调用以下代码
绑定.bottomNavigationView.setupWithNavController(navController)
在上一个版本之前,我在使用 setupWithNavController() 时保存每个片段的状态时遇到了一个大问题,但是由于最新版本的导航 API(>=:2.4.0),它支持多个返回堆栈,我可以轻松在选项卡之间导航,无需担心再次加载所有数据。
但我发现每次导航每个选项卡时,都会调用 OnViewCreated 函数!这给我带来了一些问题。
例如,OnViewCreated是一个使用repeatOnLifeCycle来收集流量的地方,而OnViewCreated的这种重复调用导致了很多流量的订阅者!
甚至在文件中说:
最佳实践是在生命周期初始化时调用此函数。例如,Activity 中的 onCreate 或 Fragment 中的 onViewCreated。否则,可能会创建多个重复执行相同操作的协程并同时执行。
它假定 OnViewCreated 是一个被调用一次的地方!
明显的问题是,首先,这种行为是一个问题还是预期的?如果是预期的话,我们可以在哪里收集流量?请详细说明为什么会发生这种情况?
android android-navigation android-bottomnav android-navigation-graph
android ×9
android-architecture-navigation ×4
kotlin ×3
android-architecture-components ×2
java ×1
navigation ×1