我有一个班级,我有Drawable一个成员.
我用这个类作为Parcelable额外的活动跨活动发送数据.
为此,我扩展了parceble,并实现了所需的功能.
我能够使用读/写int/string发送基本数据类型.
但是在编组Drawable对象时我遇到了问题.
为此我试图转换Drawable为byte array,但我得到类强制转换异常.
我使用以下代码将我的Drawable转换为Byte数组:
Bitmap bitmap = (Bitmap)((BitmapDrawable) mMyDrawable).getBitmap();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[]byteArray = stream.toByteArray();
out.writeInt(byteArray.length);
out.writeByteArray(byteArray);
Run Code Online (Sandbox Code Playgroud)
并将字节数组转换为Drawable我使用以下代码:
final int contentBytesLen = in.readInt();
byte[] contentBytes = new byte[contentBytesLen];
in.readByteArray(contentBytes);
mMyDrawable = new BitmapDrawable(BitmapFactory.decodeByteArray(contentBytes, 0, contentBytes.length));
Run Code Online (Sandbox Code Playgroud)
当我运行这个时,我得到了类强制转换异常.
我们如何使用HashMap编写/传递Drawable?
我们有什么方法可以通过Parcel传递Drawable.
谢谢.
我试图在两个活动之间传递一个对象的arraylist,但我的应用程序在第二个活动时崩溃.有人可以帮我解决这个问题......
这是我第一次活动的代码:
Intent i = new Intent();
Bundle b = new Bundle();
b.putParcelableArrayList("songs",(ArrayList<? extends Parcelable>) albumsArray.get(position).getSongs());
Log.v("--", "OK");
i.putExtras(b);
i.setClass(LatestAlbums.this, AlbumDetails.class);
startActivity(i);
Run Code Online (Sandbox Code Playgroud)
和第二个活动的代码:
songs=new ArrayList<Songs>();
Bundle b = this.getIntent().getExtras();
if(b!=null)
songs = b.getParcelable("songs");
Log.v("--", songs.size()+"");
Run Code Online (Sandbox Code Playgroud)
我的logcat输出:
04-03 16:37:03.513: E/AndroidRuntime(6576): FATAL EXCEPTION: main
04-03 16:37:03.513: E/AndroidRuntime(6576): java.lang.RuntimeException: Parcel: unable to marshal value com.musicapp.objects.Songs@419489e8
04-03 16:37:03.513: E/AndroidRuntime(6576): at android.os.Parcel.writeValue(Parcel.java:1137)
04-03 16:37:03.513: E/AndroidRuntime(6576): at android.os.Parcel.writeList(Parcel.java:524)
04-03 16:37:03.513: E/AndroidRuntime(6576): at android.os.Parcel.writeValue(Parcel.java:1097)
04-03 16:37:03.513: E/AndroidRuntime(6576): at android.os.Parcel.writeMapInternal(Parcel.java:493)
04-03 16:37:03.513: E/AndroidRuntime(6576): at android.os.Bundle.writeToParcel(Bundle.java:1612)
04-03 16:37:03.513: E/AndroidRuntime(6576): …Run Code Online (Sandbox Code Playgroud) android arraylist parcelable android-intent android-activity
我正在尝试创建一个Parcelable接口,因此我需要一个像这样的接口
interface AB : Parcelable {
companion object {
val CREATOR : Parcelable.Creator<AB>
}
}
Run Code Online (Sandbox Code Playgroud)
和我的两个A和B类看起来像
data class A (...): Parcelable{
...
companion object {
val CREATOR : Parcelable.Creator<AB> = object : Parcelable.Creator<AB> {
override fun newArray(size: Int): Array<AB?> {
return arrayOfNulls(size)
}
override fun createFromParcel(parcel: Parcel): AB {
return A(parcel)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在努力在kotlin中实现这样的接口.似乎接口类不允许CREATOR
也许我采取了错误的方法,
我有一个parcelable包含一个A或B类的列表,所以我在做
parcel.readTypedList(this.list, AB.CREATOR)
Run Code Online (Sandbox Code Playgroud)
我要求列表是A或B,这就是我使用接口的原因.
有人有任何建议或可能的解决方案吗?
在实现传参方案的过程中,在模块间的导航中,遇到了序列化错误。据我所知,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
这是我在堆栈上的第一篇文章,所以请保持温柔:)
编辑
这是答案:
我试图将HashMap扩展为Parcelable并且我获得了编译的语法,但是,在运行时它会抛出异常并返回一个空指针,试图取消编组数据.
发送者必须转换为(Parcelable)来解决歧义,然而,接收者抱怨预期Parcelable但找到了HashMap.
有没有人成功过这个?我的语法错了吗?有更好的解决方案吗?
以下是代码:
HomeActivity.java
package com.mobibob.android.studyparceable;
import java.util.HashMap;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.format.Time;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class HomeActivity extends Activity implements OnClickListener {
private static final String TAG = "HomeActivity";
private ContentItemSimple mContentItemSimple = null;
private ContentItemContainer mContentItemContainer = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) …Run Code Online (Sandbox Code Playgroud) 我正在努力创造public class MyClass<T extends Parcelable> implements Parcelable.我在实施方面遇到了麻烦Parcelable.是否可以创建一个实现的泛型类Parcelable?(注意这T是有限的,所以它也必须实现Parcelable).
我遇到的问题是Parcelable接口需要一个静态变量:public static final Parcelable.Creator<MyParcelable> CREATOR.因此,我不能做,public static final Parcelable.Creator<MyClass<T>> CREATOR因为MyParcelable<T>是非静态的.
安德烈
随着Kotlin RC的发布,我开始编写一个应用程序来学习它但是我无法弄清楚如何开始Parcelable工作.
数据类:
data class Project (val reponame:String,
val username:String,
val language:String,
val vcsUrl:String,
val branches:Map<String, Branch>) : Parcelable {
companion object {
val CREATOR = object : Parcelable.Creator<Project> {
override fun createFromParcel(`in`: Parcel): Project {
return Project(`in`)
}
override fun newArray(size: Int): Array<Project?> {
return arrayOfNulls(size)
}
}
}
protected constructor(parcelIn: Parcel) : this (
parcelIn.readString(),
parcelIn.readString(),
parcelIn.readString(),
parcelIn.readString(),
mapOf<String, Branch>().apply {
parcelIn.readMap(this, Branch::class.java.classLoader)
}
)
override fun describeContents(): Int {
throw UnsupportedOperationException()
}
override fun writeToParcel(dest: …Run Code Online (Sandbox Code Playgroud) 编写在 Android 中跨配置更改保持状态的自定义视图是冗长的,看看用于保存一个字段状态的样板代码的数量:
private class SavedState : BaseSavedState {
var amount: Int = 0
constructor(parcel: Parcel) : super(parcel) {
amount = parcel.readInt()
}
constructor (parcelable: Parcelable?) : super(parcelable)
override fun writeToParcel(parcel: Parcel, flags: Int) {
super.writeToParcel(parcel, flags)
parcel.writeInt(amount)
}
companion object CREATOR : Parcelable.Creator<SavedState> {
override fun createFromParcel(parcel: Parcel): SavedState {
return SavedState(parcel)
}
override fun newArray(size: Int): Array<SavedState?> {
return arrayOfNulls(size)
}
}
}
Run Code Online (Sandbox Code Playgroud)
Android Extensions 插件提供了@Parcelize可以用来自动生成 的实现的注释Parcelable,但是在自定义视图的情况下,我们必须BaseSavedState从Parcelable.
所以,有这样的东西不会编译:
@Parcelize
data …Run Code Online (Sandbox Code Playgroud) 我有一个序列化的类,我想添加一个位图,但Bitmap不支持序列化.
相反,我认为我会使用包裹,但无法让它工作.
这是使用局部变量的一些测试代码:
Parcel parcel;
Bitmap sourceBitmap;
Bitmap destinationBitmap;
parcel = Parcel.obtain();
sourceBitmap = Bitmap.createBitmap(200, 400, Config.ARGB_8888);
sourceBitmap.writeToParcel(parcel, 0);
destinationBitmap = Bitmap.CREATOR.createFromParcel(parcel);
Run Code Online (Sandbox Code Playgroud)
我在上面的最后一行收到以下错误:
09-06 21:18:20.463: DEBUG/skia(17716): Bitmap_createFromParcel unknown config: 0
09-06 21:18:20.473: DEBUG/AndroidRuntime(17716): Shutting down VM
09-06 21:18:20.483: WARN/dalvikvm(17716): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
09-06 21:18:20.493: ERROR/AndroidRuntime(17716): Uncaught handler: thread main exiting due to uncaught exception
09-06 21:18:20.513: ERROR/AndroidRuntime(17716): java.lang.RuntimeException: Failed to unparcel Bitmap
09-06 21:18:20.513: ERROR/AndroidRuntime(17716): at android.graphics.Bitmap$1.createFromParcel(Bitmap.java:899)
09-06 21:18:20.513: ERROR/AndroidRuntime(17716): at android.graphics.Bitmap$1.createFromParcel(Bitmap.java:903)
Run Code Online (Sandbox Code Playgroud) 我有一个类,我们称之为A类,它实现了Parcelable.
我有第二堂课,我们称之为B班,扩展到A班.
我的问题是:
如何将B类成员变量写入Parcel,然后将其父类(即:A类)成员变量写入Parcel(并随后将其读入)?
是否有一些漂亮的技巧,不需要重写A类的包裹代码?或者我只需要在A类中重写Parcel代码并为B类成员变量添加其他代码?