标签: parcelable

如何使用Parcelable传递Drawable

我有一个班级,我有Drawable一个成员.
我用这个类作为Parcelable额外的活动跨活动发送数据.

为此,我扩展了parceble,并实现了所需的功能.

我能够使用读/写int/string发送基本数据类型.
但是在编组Drawable对象时我遇到了问题.

为此我试图转换Drawablebyte 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.

谢谢.

android parcelable

15
推荐指数
1
解决办法
1万
查看次数

在活动之间传递对象的arraylist

我试图在两个活动之间传递一个对象的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

15
推荐指数
3
解决办法
6万
查看次数

Kotlin接口中的伴随对象

我正在尝试创建一个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,这就是我使用接口的原因.

有人有任何建议或可能的解决方案吗?

android parcelable kotlin

15
推荐指数
2
解决办法
1万
查看次数

Parcelables 不支持默认值。Android 导航深层链接参数

在实现传参方案的过程中,在模块间的导航中,遇到了序列化错误。据我所知,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

这是我在堆栈上的第一篇文章,所以请保持温柔:)

编辑

这是答案:

https://issuetracker.google.com/issues/148523779

navigation android parcelable deeplink android-safe-args

15
推荐指数
1
解决办法
1076
查看次数

是否可以在Android上创建可Parcelable的HashMap?

我试图将HashMap扩展为Parcelable并且我获得了编译的语法,但是,在运行时它会抛出异常并返回一个空指针,试图取消编组数据.

发送者必须转换为(Parcelable)来解决歧义,然而,接收者抱怨预期Parcelable但找到了HashMap.

有没有人成功过这个?我的语法错了吗?有更好的解决方案吗?

以下是代码:

  • HomeActivity.java - 发件人
  • ContentViewActivity.java - 接收器
  • ContentItemSimple.java - 顾名思义(包装String和Integer)
  • ContentItemCollection.java - 这是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)

android hashmap parcelable

14
推荐指数
1
解决办法
2万
查看次数

是否有可能包含泛型类?

我正在努力创造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>是非静态的.

安德烈

java generics android parcel parcelable

14
推荐指数
2
解决办法
6206
查看次数

Kotlin中的Android Parcelable:在Parcelable数据类中找不到CREATOR

随着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 parcel parcelable kotlin

14
推荐指数
1
解决办法
4941
查看次数

有没有一种优雅的方式来保存和恢复 Kotlin 中的视图状态?

编写在 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,但是在自定义视图的情况下,我们必须BaseSavedStateParcelable.

所以,有这样的东西不会编译:

@Parcelize
data …
Run Code Online (Sandbox Code Playgroud)

android parcelable kotlin

14
推荐指数
2
解决办法
1417
查看次数

如何:在Android中包裹位图

我有一个序列化的类,我想添加一个位图,但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)

android bitmap parcel parcelable

13
推荐指数
2
解决办法
1万
查看次数

扩展实现Parcelable的类

我有一个类,我们称之为A类,它实现了Parcelable.

我有第二堂课,我们称之为B班,扩展到A班.

我的问题是:

如何将B类成员变量写入Parcel,然后将其父类(即:A类)成员变量写入Parcel(并随后将其读入)?

是否有一些漂亮的技巧,不需要重写A类的包裹代码?或者我只需要在A类中重写Parcel代码并为B类成员变量添加其他代码?

android parcelable

13
推荐指数
1
解决办法
5321
查看次数