簡體   English   中英

如何在 Android 中使用 kotlin 枚舉修復“java.lang.InstantiationError”

[英]How to fix 'java.lang.InstantiationError' with kotlin enum in Android

我正在嘗試從 Android 中的舊 Java 活動開始一個新的 kotlin 活動,並且需要傳遞一個枚舉(在 kotlin 中定義)作為額外的意圖。 從第一個 (java) 活動中,我可以看到額外的意圖,但從第二個 (kotlin) 活動中,應用程序崩潰了,因為額外的意圖消失了。 有沒有辦法直接傳遞枚舉,或者我必須恢復傳遞枚舉的名稱或序數?

請注意,如果枚舉類不包含其自身的任何抽象函數(在本例中為getTitle() ),則不會出現錯誤。 但是,我需要保留這些功能。

主活動.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                IntentExtension.putParcelableExtra(intent, "test", TestEnum.TWO);
                startActivityForResult(intent, 42);
            }
        });
    }
}

第二個活動.kt

@Parcelize
enum class TestEnum : Parcelable {
    ONE {
        override fun getTitle(): String = "Title One!"
    },

    TWO {
        override fun getTitle(): String = "Title Two!"
    };

    abstract fun getTitle(): String
}

class SecondActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)
        val extra = intent.getParcelableExtra<TestEnum>("test") // crash here
        welcomeText.text = getString(R.string.message, extra.name)
    }
}

意圖擴展.kt

@file:JvmName("IntentExtension")

fun Intent.putParcelableExtra(key: String, value: Parcelable) {
    this.putExtra(key, value)
}

錯誤日志

    java.lang.InstantiationError: com.example.myapplication.TestEnum
        at com.example.myapplication.TestEnum$Creator.createFromParcel(Unknown Source:5)
        at android.os.Parcel.readParcelable(Parcel.java:2782)
        at android.os.Parcel.readValue(Parcel.java:2676)
        at android.os.Parcel.readArrayMapInternal(Parcel.java:3043)
        at android.os.BaseBundle.unparcel(BaseBundle.java:257)
        at android.os.Bundle.getParcelable(Bundle.java:888)
        at android.content.Intent.getParcelableExtra(Intent.java:7075)
        at com.example.myapplication.SecondActivity.onCreate(SecondActivity.kt:27)
        at android.app.Activity.performCreate(Activity.java:6975)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

似乎 kotlin 注釋處理器無法為枚舉分塊生成正確的代碼。 像這樣編寫自己的代碼:

enum class TestEnum : Parcelable {
    ONE {
        override fun getTitle(): String = "Title One!"
    },

    TWO {
        override fun getTitle(): String = "Title Two!"
    };

    abstract fun getTitle(): String

    override fun describeContents(): Int {
        return 0
    }

    override fun writeToParcel(dest: Parcel?, flags: Int) {
        dest!!.writeInt(ordinal)
    }

    companion object CREATOR : Parcelable.Creator<TestEnum> {
        override fun createFromParcel(parcel: Parcel): TestEnum {
            return values()[parcel.readInt()]
        }

        override fun newArray(size: Int): Array<TestEnum?> {
            return newArray(size)
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM