在我的应用程序中,我有以下类:
RestaurantDto
import android.os.Parcel
import android.os.Parcelable
import java.io.Serializable
class RestaurantDto() : Serializable, Parcelable {
var lat: Float = 0.toFloat()
var lng: Float = 0.toFloat()
var id: String? = null
var open_now: Boolean? = false
var weekdayText: Array<String>? = null
var name: String? = null
var place_id: String? = null
var rating: Float? = null
var vicinity: String? = null
var international_phone_number: String? = null
var website: String? = null
var reviews: Array<ReviewDto>? = null
var formatted_address: String? = null
var photoReferences: Array<PhotoReference>? = null
var image: ByteArray? = null
constructor(parcel: Parcel) : this() {
lat = parcel.readFloat()
lng = parcel.readFloat()
id = parcel.readString()
open_now = parcel.readValue(Boolean::class.java.classLoader) as? Boolean
weekdayText = parcel.createStringArray()
name = parcel.readString()
place_id = parcel.readString()
rating = parcel.readValue(Float::class.java.classLoader) as? Float
vicinity = parcel.readString()
international_phone_number = parcel.readString()
website = parcel.readString()
reviews = parcel.createTypedArray(ReviewDto.CREATOR)
formatted_address = parcel.readString()
photoReferences = parcel.createTypedArray(PhotoReference.CREATOR)
image = parcel.createByteArray()
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeFloat(lat)
parcel.writeFloat(lng)
parcel.writeString(id)
parcel.writeValue(open_now)
parcel.writeStringArray(weekdayText)
parcel.writeString(name)
parcel.writeString(place_id)
parcel.writeValue(rating)
parcel.writeString(vicinity)
parcel.writeString(international_phone_number)
parcel.writeString(website)
parcel.writeTypedArray(reviews, flags)
parcel.writeString(formatted_address)
parcel.writeTypedArray(photoReferences, flags)
parcel.writeByteArray(image)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<RestaurantDto> {
override fun createFromParcel(parcel: Parcel): RestaurantDto {
return RestaurantDto(parcel)
}
override fun newArray(size: Int): Array<RestaurantDto?> {
return arrayOfNulls(size)
}
}
}
ReviewDto
import android.os.Parcel
import android.os.Parcelable
import java.io.Serializable
class ReviewDto() : Serializable, Parcelable {
var author_name: String? = null
var author_url: String? = null
var language: String? = null
var profile_photo_url: String? = null
var rating: Int? = null
var text: String? = null
var time: Long? = null
var relative_time_description: String? = null
constructor(parcel: Parcel) : this() {
author_name = parcel.readString()
author_url = parcel.readString()
language = parcel.readString()
profile_photo_url = parcel.readString()
rating = parcel.readValue(Int::class.java.classLoader) as? Int
text = parcel.readString()
time = parcel.readValue(Long::class.java.classLoader) as? Long
relative_time_description = parcel.readString()
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(author_name)
parcel.writeString(author_url)
parcel.writeString(language)
parcel.writeString(profile_photo_url)
parcel.writeValue(rating)
parcel.writeString(text)
parcel.writeValue(time)
parcel.writeString(relative_time_description)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<ReviewDto> {
override fun createFromParcel(parcel: Parcel): ReviewDto {
return ReviewDto(parcel)
}
override fun newArray(size: Int): Array<ReviewDto?> {
return arrayOfNulls(size)
}
}
}
PhotoReference
import android.os.Parcel
import android.os.Parcelable
import java.io.Serializable
class PhotoReference() : Serializable, Parcelable{
var height: Int = 0
var width: Int = 0
var photo_reference: String? = null
constructor(parcel: Parcel) : this() {
height = parcel.readInt()
width = parcel.readInt()
photo_reference = parcel.readString()
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeInt(height)
parcel.writeInt(width)
parcel.writeString(photo_reference)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<PhotoReference> {
override fun createFromParcel(parcel: Parcel): PhotoReference {
return PhotoReference(parcel)
}
override fun newArray(size: Int): Array<PhotoReference?> {
return arrayOfNulls(size)
}
}
}
当我尝试从其他类创建一个新活动时,我收到错误消息
java.lang.RuntimeException:无法启动活动ComponentInfo {wizypay.brantner.wizy / wizypay.brantner.wizy.activities.AllRestaurantsBarsActivity}:java.lang.ClassCastException:android.os.Parcelable []无法强制转换为wizypay.brantner .wizy.models.RestaurantDto []在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2911)的android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2989)android.app.ActivityThread.-wrap11(未知来源) :0)在Android.app.Loper.loop(Looper.java:164)上的android.app.A活动线程中的android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1688)处于android.os.Handler.dispatchMessage(Handler.java:106)在android.app.ActivityThread.main(ActivityThread.java:6753)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:482)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)引起:java.lang.ClassCastException:android.os.Parcelable []无法强制转换为wizyp ay.brantner.wizy.models.RestaurantDto []位于android.app的android.app.Activity.performCreate(Activity.java:7036)的wizypay.brantner.wizy.activities.AllRestaurantsBarsActivity.onCreate(AllRestaurantsBarsActivity.kt:25) . Activity.performCreate(Activity.java:7027)在android.app.Anstrumentation.callActivityCnate(Activitymentation.java:1231)android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2864)android.app.ActivityThread.handleLaunchActivity(ActivityThread) .java:2989)在Android.app.Handler.dispatchMessage(Handler.java:)的android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1688)的android.app.ActivityThread.-wrap11(未知来源:0) 106)在android.app.AooTloread.main(ActivityThread.java:6753)的android.os.Looper.loop(Looper.java:164)
我创建活动的方法:
public void onClick(View v) {
Intent intent = new Intent(activity, AllRestaurantsBarsActivity.class);
intent.putExtra("Restaurants", allRestaurants);
intent.putExtra("Title", title);
activity.startActivity(intent);
}
allRestaurants是一系列的RestaurantDto(RestaurantDto [] allRestaurants)
在我的活动中,我有以下代码:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_all_restaurants_bars)
val restaurants: Array<RestaurantDto> = intent.extras.getParcelableArray("Restaurants") as Array<RestaurantDto>
}}
有趣的是,当我将数组转换为数组列表时,一切正常 . 包含数组列表的代码:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_all_restaurants_bars)
val restaurants: ArrayList<RestaurantDto> = intent.extras.getParcelableArrayList<RestaurantDto>("Restaurants") as ArrayList<RestaurantDto>
}}
public void onClick(View v) {
Intent intent = new Intent(activity, AllRestaurantsBarsActivity.class);
intent.putParcelableArrayListExtra("Restaurants", new ArrayList<RestaurantDto>(Arrays.asList(allRestaurants)));
intent.putExtra("Title", title);
activity.startActivity(intent);
}
你能告诉我我的初始代码有什么问题,或者我的两次尝试之间的区别是什么?