Я пытаюсь начать новую активность 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)