您好,我正在研究导航架构组件,并以编程方式为我的活动设置 NavHostFragment。
主活动.xml :
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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:context=".MainActivity">
<fragment
android:id="@+id/nav_host"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
/>
</android.support.constraint.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)
MainActivity.kt :
package com.andor.navigate.demonavigation
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import androidx.navigation.Navigation
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.NavigationUI
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setupNavigation()
NavigationUI.setupActionBarWithNavController(this, NavHostFragment.findNavController(nav_host))
}
override fun onSupportNavigateUp(): Boolean = Navigation.findNavController(
this,
R.id.nav_host
).navigateUp()
private fun setupNavigation() {
val navHostFragment = nav_host as NavHostFragment
val navController = navHostFragment.navController
val navInflater = …Run Code Online (Sandbox Code Playgroud) 我正在按照这篇文章为我的项目设置 Jacoco 代码覆盖率。
但我在编写生成报告的任务时遇到错误。
task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest', 'createDebugCoverageReport']) {
reports {
xml.enabled = true
html.enabled = true
}
def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*', 'android/**/*.*']
def debugTree = fileTree(dir: "$project.buildDir/intermediates/javac/debug", excludes: fileFilter)
def mainSrc = "$project.projectDir/src/main/java"
sourceDirectories = files([mainSrc])
classDirectories = files([debugTree])
executionData = fileTree(dir: project.buildDir, includes: [
'jacoco/testDebugUnitTest.exec', 'outputs/code_coverage/debugAndroidTest/connected/**/*.ec'
])
}
Run Code Online (Sandbox Code Playgroud)
我收到的错误是:
无法为 org.gradle.testing.jacoco.tasks.JacocoReport 类型的任务 ':app:jacocoTestReport' 设置只读属性 'sourceDirectories' 的值。
jacoco我相信下面的字段现在是私有的。
我的依赖:classpath "org.jacoco:org.jacoco.core:0.8.4"
另外,我尝试更改版本但没有帮助。
我正在尝试在应用程序中使用Nav Component的最新更新
我可以在其中添加dialog(BottomSheetDialogFragment)nav graph
nav_version = "2.1.0-alpha05"
Run Code Online (Sandbox Code Playgroud)
来自我的部分代码nav_graph:
<dialog
android:id="@+id/settingFragment"
android:name="com.andor.navigate.notepad.listing.fragment.SettingFragment"
tools:layout="@layout/fragment_setting">
<action
android:id="@+id/action_settingFragment_to_confirmationFragment"
app:destination="@id/confirmationFragment" />
</dialog>
<dialog
android:id="@+id/confirmationFragment"
android:name="com.andor.navigate.notepad.ConfirmationFragment"
tools:layout="@layout/fragment_confirmation" />
Run Code Online (Sandbox Code Playgroud)
在我的设置片段中,我有一个button(logout_btn)来触发动作:action_settingFragment_to_confirmationFragment
OnActivityCreated设置片段中的代码:
logout_btn.setOnClickListener {
Navigation.findNavController(view!!).navigate(R.id.action_settingFragment_to_confirmationFragment)
}
Run Code Online (Sandbox Code Playgroud)
当我单击按钮时,出现运行时异常:
java.lang.IllegalStateException:查看androidx.constraintlayout.widget.ConstraintLayout {550ae09 VE ............. 1,1-719,526}在androidx.navigation.Navigation.findNavController上未设置NavController (Navigation.java:84)在com.andor.navigate.notepad.listing.fragment.SettingFragment $ onActivityCreated $ 2.onClick(SettingFragment.kt:56)在android.view.View.performClick(View.java:7352) .view.View.performClickInternal(View.java:7318)在android.view.View.access $ 3200(View.java:846)在android.view.View $ PerformClick.run(View.java:27800)在android.os android.os.Handler.dispatchMessage(Handler.java:99)位于android.os.Looper.loop(Looper.java:214)位于android.app.ActivityThread处的.Handler.handleCallback(Handler.java:873)。com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:493)的java.lang.reflect.Method.invoke(本机方法)的main(ActivityThread.java:7045) os.ZygoteInit.main(ZygoteInit.java:965)
我的目的是从另一个对话框打开一个对话框,但是由于某种原因,我的对话框没有(缺少)NavController。
我已经提到了源代码
android kotlin android-navigation android-architecture-navigation androidx
我在视图(自定义视图)中使用协程,这些视图被添加到回收器视图中。
大部分计算(复杂且漫长)我都在协程上运行scopeIO并更新scopeMain.
但是,当这些视图添加到回收器视图时,它工作得很好,但当我快速滚动时,即使视图不再可见,作业也会在后台运行。
我不知道在哪里取消该工作。我见过的大多数示例代码都是活动中的协程,其中生命周期被正确定义。
我尝试取消其中的作业
onDetachedFromWindow,但是当我在回收器视图中快速滚动时,它会取消作业,而当视图再次附加到窗口时,它会变成空视图。
下面是我的协程声明
CustomView{
....
....
private val job = Job()
private val scopeMain = CoroutineScope(job + Dispatchers.Main)
private val scopeIO = CoroutineScope(job + Dispatchers.IO)
....
....
}
Run Code Online (Sandbox Code Playgroud)
由于上述原因,许多作业都处于活动状态,整个应用程序变得缓慢,并且在某些时候还会崩溃。
PS-是否有可能有一个可用于渲染整个 recyclerView 的作业,即所有子视图(CustomView)的相同作业,我相信 new Job() 创建导致了滞后。
我正在开发的演示项目:
已经提到过这个