- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我创建了一个特殊的密封类来验证我的可为空 URL,这样我就可以安全、轻松地知道它的状态(无、无效、有效)
sealed class UrlType : Parcelable {
@Parcelize class Valid private constructor(val url: String) : UrlType() {
companion object : CompanionTest<UrlType.Valid, String>(::Valid)
}
@Parcelize object None : UrlType()
@Parcelize class Invalid(val invalidUrl: String) : UrlType()
companion object {
fun getUrlType(url: String?): UrlType {
return if (url == null) {
UrlType.None
} else if (!url.isValidUrl()) {
UrlType.Invalid(url)
} else {
Valid.create(url)
}
}
}
}
<小时/>
open class CompanionTest<out T, in A>(creator: (A) -> T) {
private var creator: ((A) -> T)? = creator
fun create(arg1: A): T {
return creator!!(arg1)
}
}
<小时/>
@Parcelize
data class NewsPost(
val id: String,
val title: String,
val description: String?,
val webContentUrl: UrlType,
val imageUrl: UrlType,
val created: String,
val updated: String,
val feeds: List<Feed>
) : Parcelable
当我第一次尝试这个想法时,我怀疑它不会工作,因为私有(private)构造函数和 Parcelize,但我做了一些测试,它确实工作了。
我还有一个密封类来指示我的事件的启动类型,可以从多个路径输入
sealed class NewsLaunchType : Parcelable {
@Parcelize object FeedList : NewsLaunchType()
@Parcelize class FeedDetail(val newsFeedType: NewsFeedType) : NewsLaunchType()
@Parcelize class PostDetail(val newsPost: NewsPost) : NewsLaunchType()
}
当我使用 NewsLaunchType.PostDetail(newsPost)
启动 Activity 时,应用程序崩溃并出现以下错误
fun startActivity(){
val intent = Intent(context, NewsActivity::class.java).apply {
putExtra("key", NewsLaunchType.PostDetail(newsPost))
}
startActivity(intent)
}
<小时/>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_news)
val newsActivityLaunchType = intent.getParcelableExtra<NewsLaunchType>("key")
}
<小时/>
2018-11-08 11:08:33.897 17030-17030/com.something.internal E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.something.internal, PID: 17030
java.lang.IllegalAccessError: Method 'void com.something.somethingkit.helper.UrlType$Valid.<init>(java.lang.String)' is inaccessible to class 'com.something.somethingkit.helper.UrlType$Valid$Creator' (declaration of 'com.something.somethingkit.helper.UrlType$Valid$Creator' appears in /data/app/com.something.internal-QTiupS4yw25rZK5uXP7UCQ==/base.apk:classes2.dex)
at com.something.somethingkit.helper.UrlType$Valid$Creator.createFromParcel(Unknown Source:11)
at android.os.Parcel.readParcelable(Parcel.java:2798)
at com.something.somethingkit.model.news.local.NewsPost$Creator.createFromParcel(Unknown Source:25)
at android.os.Parcel.readParcelable(Parcel.java:2798)
at com.something.screens.news.NewsLaunchType$PostDetail$Creator.createFromParcel(Unknown Source:13)
at android.os.Parcel.readParcelable(Parcel.java:2798)
at android.os.Parcel.readValue(Parcel.java:2692)
at android.os.Parcel.readArrayMapInternal(Parcel.java:3059)
at android.os.BaseBundle.unparcel(BaseBundle.java:257)
at android.os.Bundle.getParcelable(Bundle.java:888)
at android.content.Intent.getParcelableExtra(Intent.java:7734)
at com.something.screens.news.NewsActivity.onCreate(NewsActivity.kt:31)
at android.app.Activity.performCreate(Activity.java:7183)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2908)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3030)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6938)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
现在这并不完全出乎意料,只是如果我尝试将它拉出到我创建它的同一位置,它确实会起作用
fun startActivity(){
val intent = Intent(context, NewsActivity::class.java).apply {
putExtra("key", NewsLaunchType.PostDetail(newsPost))
}
val test = intent.getParcelableExtra<NewsLaunchType>("key")
startActivity(intent)
}
如果我将其添加到片段包中,并将新片段添加/替换到我的事件中,它也可以工作。
companion object {
fun newInstance(newsPost: NewsPost): NewsDetailFragment {
val bundle = Bundle()
bundle.putParcelable(extraNewsPost, newsPost)
val fragment = NewsDetailFragment()
fragment.arguments = bundle
return fragment
}
}
<小时/>
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val newsPost = arguments?.getParcelable<NewsPost>(extraNewsPost)
}
注意 - 当跨事件传递它时,会产生额外的密封类层,但如果我只是尝试跨事件传递 NewsPost,它也会崩溃,因此额外的层不是问题。
这似乎可能是 Kotlin Parcelize 功能的一个错误。
是否有任何原因可以解释为什么在事件之间传递它会引发错误,但在片段之间传递它却不会?如果有原因...关于如何在事件之间传递它有什么建议吗?
最佳答案
docs明确指出:
The primary constructor should be accessible (non-private)
不知道为什么它在传递到片段时起作用,而在传递到事件时不起作用。就我而言,我通过将类构造函数设置为内部来解决这个问题。
关于kotlin - 带有私有(private)构造函数的分片密封类在从新事件中的 Intent 获取时会抛出无法访问的错误,但在其他地方都可以工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53215095/
新的媒体管理器看起来很棒,非常好,但是,在以前的版本中,它在附件详细信息中有几个字段我想避免使用,我曾经使用以下代码: add_filter('attachment_fields_to_edit',
当您使用 IDE 构造函数(new->activity)创建新 Activity 时 - 在 Android Studio 和 Eclipse 中 - 它会创建新的 java 文件、布局文件、添加 A
我使用了 PDF 渲染问题中的代码 How to render PDF in Android 而且有效!回答者的 Prop ,但我的问题是关于做同样的事情,但也发送关键字以在 pdf 中搜索。我不知道
我试图让用户能够循环浏览视频,即时更改 AVPlayer URL 而无需刷新 View 。但是,现在我只是在每次播放视频时实例化 AVPlayer 对象(导致音频相互播放),我觉得这不是最好的方法。有
当您向 ASP.NET MVC 项目添加新 View 时,您可以通过在对话框中选择它应该使用的模型类来强类型化 View 。问题在于该下拉菜单中包含所有引用项目和 dll 中的所有类和接口(inter
简而言之: 从新 git 存储库 上的远程分支 pull 代码后,我能否将代码重置为执行 git pull 之前的状态? 长话短说: 我有两个包含脚本的文件夹,一个文件夹代表另一个文件夹中文件的另一个
如何导出 ARMeshGeometry新生成的SceneReconstruction最新 iPad Pro 上的 API .obj文件? 这是SceneReconstruction文档。 最佳答案 从
我是一名优秀的程序员,十分优秀!