Как исправить 'java.lang.InstantiationError' с помощью перечисления kotlin в Android - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь начать новую активность kotlin с устаревшей java-активности в Android, и мне нужно передать enum (определенный в kotlin) в качестве дополнительного намерения. Из первого (java) действия я вижу дополнительные намерения, но из второго (kotlin) действия приложение вылетает, потому что дополнительное намерение пропало. Есть ли способ передать перечисление напрямую или я должен вернуться к передаче имени или порядкового номера перечисления?

Обратите внимание, что ошибки нет, если класс enum не содержит собственных абстрактных функций (в данном случае getTitle()). Однако мне нужно сохранить эти функции.

MainActivity.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);
            }
        });
    }
}

SecondActivity.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)
    }
}

IntentExtension.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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...