Skip to content Skip to sidebar Skip to footer

Passing An Object Instance Between Two Activities In Kotlin

I'm wondering if someone could help me to fix this error with Intent? I have 2 activities to connect between the: The first activity for Grid View 'MainActivity.kt', second for L

Solution 1:

Create an IntDef like:

@Retention(SOURCE)
@IntDef({ADAPTER_MODE_1, ADAPTER_MODE_2, ADAPTER_MODE_3})
public @interface AdapterMode {}
public static final int ADAPTER_MODE_1 = 0;
public static final int ADAPTER_MODE_2 = 1;
public static final int ADAPTER_MODE_3 = 2;
//...

and add the int to the bundle. For Kotlin you have to use a companion object to define the variables like

class FirstActivity {
    companion object { 
         val ADAPTER_MODE1 = 0
         val ADAPTER_MODE2 = 1
         val ADAPTER_MODE3 = 2
         //...
    }
}

So you can pass unlimited adapter cases to your 2nd activity

EDIT: Kotlin doesn't support @IntDef so you should use an enum for that:

enum class AdapterType {
    ADAPTER_TYPE_1,
    ADAPTER_TYPE_2,
    ADAPTER_TYPE_3;

    companion object {
        fun fromOrdinal(ordinal: Int): AdapterType? {
            return AdapterType.values().firstOrNull { it.ordinal == ordinal }
        }
    }
}

Then use it like:

class FirstActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val intent = Intent(this, SecondActivity::class.java)
        intent.putExtra(SecondActivity.EXTRA_ADAPTER_MODE, AdapterType.ADAPTER_TYPE_2.ordinal)
    }
}

And retrieve it like:

class SecondActivity : AppCompatActivity() {
    companion object {
        val EXTRA_ADAPTER_MODE = "extra_adapter_mode"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //...
        val adapterTypeOrdinal = intent?.getIntExtra(EXTRA_ADAPTER_MODE, AdapterType.ADAPTER_TYPE_1.ordinal)
        val adapterType = adapterTypeOrdinal?.let { AdapterType.fromOrdinal(it) }

        // do something with it
    }
}

Solution 2:

You can not pass Adapters between Activities. At least in a clean way, recommended by Google. Adapters implement neither Parcelable nor Serializable interface. So general rule, as Nino Handler pointed out - use Intent to send data (not Adapters itself) which should be used to create Adapter.


Post a Comment for "Passing An Object Instance Between Two Activities In Kotlin"