在 Kotlin 中的两个活动之间传递对象实例
Passing an object instance between two activities in Kotlin
我想知道是否有人可以帮助我用 Intent 修复这个错误?
我有 2 个活动要连接:
第一个 activity 用于网格视图 "MainActivity.kt",
第二个列表视图 "Main2Activity.kt" 我有 2 个来自 "Main2Activity.kt" 的对象实例 (adapter1,adapter2) 我想在 [=31] 中单击特定图像时传递特定对象实例 (adapter1) 或 (adapter2) =]
注意:我使用的是 BaseAdapter
这是一个MainActivity.kt
class MainActivity : AppCompatActivity() {
var adapter:FoodAdapter?=null
var listOfFoods =ArrayList<Food>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(layout.activity_main)
// load foods
listOfFoods.add(Food("Coffee"," Coffee preparation is", a))
listOfFoods.add(Food("Coffee"," Coffee preparation is", b))
listOfFoods.add(Food("Coffee"," Coffee preparation is", c))
listOfFoods.add(Food("Coffee"," Coffee preparation is", d))
adapter= FoodAdapter(this,listOfFoods)
gvListFood.adapter =adapter
}
class FoodAdapter: BaseAdapter {
var listOfFood= ArrayList<Food>()
var context: Context?=null
constructor(context:Context,listOfFood:ArrayList<Food>):super(){
this.context=context
this.listOfFood=listOfFood
}
override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View? {
val food = this.listOfFood[p0]
var inflator = context!!.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
var foodView= inflator.inflate(layout.food_ticket,null)
foodView.ivFoodImage.setImageResource(food.image!!)
foodView.ivFoodImage.setOnClickListener {
if (foodView.ivFoodImage.context!!.equals(a) ) {
val intent = Intent(context, Main2Activity::class.java)
intent.putExtra(Main2Activity.EXTRA_ADAPTER_MODE, AdapterType.ADAPTER_TYPE_2.ordinal)
intent.putExtra("name", food.name!!)
intent.putExtra("des", food.des!!)
intent.putExtra("image", food.image!!)
context!!.startActivity(intent)
}
else if (foodView.ivFoodImage.context!!.equals(b)) {
val intent = Intent(context, Main2Activity::class.java)
intent.putExtra(Main2Activity.EXTRA_ADAPTER_MODE, AdapterType.ADAPTER_TYPE_2.ordinal)
intent.putExtra("name", food.name!!)
intent.putExtra("des", food.des!!)
intent.putExtra("image", food.image!!)
context!!.startActivity(intent)
}
}
return foodView
}
override fun getItem(p0: Int): Any {
return listOfFood[p0]
}
override fun getItemId(p0: Int): Long {
return p0.toLong()
}
override fun getCount(): Int {
return listOfFood.size
}
}
}
这是一个Main2Activity.kt
class Main2Activity : AppCompatActivity() {
companion object {
val EXTRA_ADAPTER_MODE = "extra_adapter_mode"
}
var adapter1: FoodAdapter? = null
var adapter2: FoodAdapter2? = null
var listOfFoods2 = ArrayList<Food>()
var listOfFoods3 = ArrayList<Food>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
val bundle = intent?.getIntExtra(EXTRA_ADAPTER_MODE, AdapterType.ADAPTER_TYPE_1.ordinal)
val name = bundle?.let { AdapterType.fromOrdinal(it) }
val des = bundle?.let { AdapterType.fromOrdinal(it) }
val image = bundle?.let { AdapterType.fromOrdinal(it) }
//val bundle = intent.extras
//val name = bundle.getString("name")
//val des = bundle.getString("des")
//val image = bundle.getInt("image")
/*
ivFoodImage2?.let {
it.setImageResource(image)
}
tvName2?.let {
it.text = name
}
tvDes2?.let {
it.text = des
}
*/
// load foods2
listOfFoods2.add(Food("Coffee", " Coffee1 preparation is", R.drawable.a))
listOfFoods2.add(Food("Coffee", " Coffee2 preparation is", R.drawable.b))
//listOfFoods2.add(Food("Coffee"," Coffee preparation is",R.drawable.c))
//listOfFoods2.add(Food("Coffee"," Coffee preparation is",R.drawable.d))
// load foods3
//listOfFoods3.add(Food("Coffee"," Coffee preparation is",R.drawable.a))
//listOfFoods3.add(Food("Coffee"," Coffee preparation is",R.drawable.b))
listOfFoods3.add(Food("Coffee", " Coffee3 preparation is", R.drawable.c))
listOfFoods3.add(Food("Coffee", " Coffee4 preparation is", R.drawable.d))
if(adapter1 ==lvFoods2.adapter) {
adapter1 = FoodAdapter(listOfFoods2, this)
lvFoods2.adapter = adapter1
} else if (adapter2==lvFoods2.adapter) {
adapter2 = FoodAdapter2(listOfFoods3, this)
lvFoods2.adapter = adapter2
}
}
class FoodAdapter : BaseAdapter {
var context: Context? = null
var listOfFoodsLocal2 = ArrayList<Food>()
constructor(listOfFoods2: ArrayList<Food>, context: Context) : super() {
this.listOfFoodsLocal2 = listOfFoods2
this.context = context
}
override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View {
val food = this.listOfFoodsLocal2[p0]
var inflator = context!!.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
val foodView = inflator.inflate(R.layout.food_ticket2, null)
foodView.ivFoodImage2?.let {
it.setImageResource(food.image!!)
}
foodView.tvName2?.let {
it.text = food.name!!
}
foodView.tvDes2?.let {
it.text = food.des!!
}
foodView.ivFoodImage2.setOnClickListener {
//move to next
val intent = Intent(context, FoodDetails::class.java)
intent.putExtra("name", food.name!!)
intent.putExtra("des", food.des!!)
intent.putExtra("image", food.image!!)
context!!.startActivity(intent)
}
return foodView
}
override fun getItem(p0: Int): Any {
return listOfFoodsLocal2[p0]
}
override fun getItemId(p0: Int): Long {
return p0.toLong()
}
override fun getCount(): Int {
return listOfFoodsLocal2.size
}
}
class FoodAdapter2 : BaseAdapter {
var context: Context? = null
var listOfFoodsLocal3 = ArrayList<Food>()
constructor(listOfFoods3: ArrayList<Food>, context: Context) : super() {
this.listOfFoodsLocal3 = listOfFoods3
this.context = context
}
override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View {
val food = this.listOfFoodsLocal3[p0]
var inflator = context!!.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
val foodView = inflator.inflate(R.layout.food_ticket2, null)
foodView.ivFoodImage2?.let {
it.setImageResource(food.image!!)
}
foodView.tvName2?.let {
it.text = food.name!!
}
foodView.tvDes2?.let {
it.text = food.des!!
}
foodView.ivFoodImage2.setOnClickListener {
//move to next
val intent = Intent(context, FoodDetails::class.java)
intent.putExtra("name", food.name!!)
intent.putExtra("des", food.des!!)
intent.putExtra("image", food.image!!)
context!!.startActivity(intent)
}
return foodView
}
override fun getItem(p0: Int): Any {
return listOfFoodsLocal3[p0]
}
override fun getItemId(p0: Int): Long {
return p0.toLong()
}
override fun getCount(): Int {
return listOfFoodsLocal3.size
}
}
}
这里是枚举class
enum class AdapterType {
ADAPTER_TYPE_1,
ADAPTER_TYPE_2,
ADAPTER_TYPE_3;
companion object {
fun fromOrdinal(name:String,des:String,image: Int): AdapterType? {
return AdapterType.values().firstOrNull { it.ordinal == image}
}
}
}
您不能在活动之间传递适配器。至少以一种干净的方式,由 Google 推荐。适配器既不实现 Parcelable 也不实现 Serializable 接口。所以一般规则,正如 Nino Handler 指出的那样 - 使用 Intent 发送 data(而不是 Adapters 本身)应该用于创建 Adapter.
创建一个 IntDef 像:
@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;
//...
并将 int 添加到包中。
对于 Kotlin,您必须使用 companion object 来定义变量,例如
class FirstActivity {
companion object {
val ADAPTER_MODE1 = 0
val ADAPTER_MODE2 = 1
val ADAPTER_MODE3 = 2
//...
}
}
因此您可以将无限的适配器盒传递给您的第二个 activity
编辑:
Kotlin @IntDef 所以你应该为此使用枚举:
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 }
}
}
}
然后像这样使用它:
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)
}
}
并像这样检索它:
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
}
}
我想知道是否有人可以帮助我用 Intent 修复这个错误?
我有 2 个活动要连接: 第一个 activity 用于网格视图 "MainActivity.kt", 第二个列表视图 "Main2Activity.kt" 我有 2 个来自 "Main2Activity.kt" 的对象实例 (adapter1,adapter2) 我想在 [=31] 中单击特定图像时传递特定对象实例 (adapter1) 或 (adapter2) =]
注意:我使用的是 BaseAdapter
这是一个MainActivity.kt
class MainActivity : AppCompatActivity() {
var adapter:FoodAdapter?=null
var listOfFoods =ArrayList<Food>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(layout.activity_main)
// load foods
listOfFoods.add(Food("Coffee"," Coffee preparation is", a))
listOfFoods.add(Food("Coffee"," Coffee preparation is", b))
listOfFoods.add(Food("Coffee"," Coffee preparation is", c))
listOfFoods.add(Food("Coffee"," Coffee preparation is", d))
adapter= FoodAdapter(this,listOfFoods)
gvListFood.adapter =adapter
}
class FoodAdapter: BaseAdapter {
var listOfFood= ArrayList<Food>()
var context: Context?=null
constructor(context:Context,listOfFood:ArrayList<Food>):super(){
this.context=context
this.listOfFood=listOfFood
}
override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View? {
val food = this.listOfFood[p0]
var inflator = context!!.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
var foodView= inflator.inflate(layout.food_ticket,null)
foodView.ivFoodImage.setImageResource(food.image!!)
foodView.ivFoodImage.setOnClickListener {
if (foodView.ivFoodImage.context!!.equals(a) ) {
val intent = Intent(context, Main2Activity::class.java)
intent.putExtra(Main2Activity.EXTRA_ADAPTER_MODE, AdapterType.ADAPTER_TYPE_2.ordinal)
intent.putExtra("name", food.name!!)
intent.putExtra("des", food.des!!)
intent.putExtra("image", food.image!!)
context!!.startActivity(intent)
}
else if (foodView.ivFoodImage.context!!.equals(b)) {
val intent = Intent(context, Main2Activity::class.java)
intent.putExtra(Main2Activity.EXTRA_ADAPTER_MODE, AdapterType.ADAPTER_TYPE_2.ordinal)
intent.putExtra("name", food.name!!)
intent.putExtra("des", food.des!!)
intent.putExtra("image", food.image!!)
context!!.startActivity(intent)
}
}
return foodView
}
override fun getItem(p0: Int): Any {
return listOfFood[p0]
}
override fun getItemId(p0: Int): Long {
return p0.toLong()
}
override fun getCount(): Int {
return listOfFood.size
}
}
}
这是一个Main2Activity.kt
class Main2Activity : AppCompatActivity() {
companion object {
val EXTRA_ADAPTER_MODE = "extra_adapter_mode"
}
var adapter1: FoodAdapter? = null
var adapter2: FoodAdapter2? = null
var listOfFoods2 = ArrayList<Food>()
var listOfFoods3 = ArrayList<Food>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
val bundle = intent?.getIntExtra(EXTRA_ADAPTER_MODE, AdapterType.ADAPTER_TYPE_1.ordinal)
val name = bundle?.let { AdapterType.fromOrdinal(it) }
val des = bundle?.let { AdapterType.fromOrdinal(it) }
val image = bundle?.let { AdapterType.fromOrdinal(it) }
//val bundle = intent.extras
//val name = bundle.getString("name")
//val des = bundle.getString("des")
//val image = bundle.getInt("image")
/*
ivFoodImage2?.let {
it.setImageResource(image)
}
tvName2?.let {
it.text = name
}
tvDes2?.let {
it.text = des
}
*/
// load foods2
listOfFoods2.add(Food("Coffee", " Coffee1 preparation is", R.drawable.a))
listOfFoods2.add(Food("Coffee", " Coffee2 preparation is", R.drawable.b))
//listOfFoods2.add(Food("Coffee"," Coffee preparation is",R.drawable.c))
//listOfFoods2.add(Food("Coffee"," Coffee preparation is",R.drawable.d))
// load foods3
//listOfFoods3.add(Food("Coffee"," Coffee preparation is",R.drawable.a))
//listOfFoods3.add(Food("Coffee"," Coffee preparation is",R.drawable.b))
listOfFoods3.add(Food("Coffee", " Coffee3 preparation is", R.drawable.c))
listOfFoods3.add(Food("Coffee", " Coffee4 preparation is", R.drawable.d))
if(adapter1 ==lvFoods2.adapter) {
adapter1 = FoodAdapter(listOfFoods2, this)
lvFoods2.adapter = adapter1
} else if (adapter2==lvFoods2.adapter) {
adapter2 = FoodAdapter2(listOfFoods3, this)
lvFoods2.adapter = adapter2
}
}
class FoodAdapter : BaseAdapter {
var context: Context? = null
var listOfFoodsLocal2 = ArrayList<Food>()
constructor(listOfFoods2: ArrayList<Food>, context: Context) : super() {
this.listOfFoodsLocal2 = listOfFoods2
this.context = context
}
override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View {
val food = this.listOfFoodsLocal2[p0]
var inflator = context!!.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
val foodView = inflator.inflate(R.layout.food_ticket2, null)
foodView.ivFoodImage2?.let {
it.setImageResource(food.image!!)
}
foodView.tvName2?.let {
it.text = food.name!!
}
foodView.tvDes2?.let {
it.text = food.des!!
}
foodView.ivFoodImage2.setOnClickListener {
//move to next
val intent = Intent(context, FoodDetails::class.java)
intent.putExtra("name", food.name!!)
intent.putExtra("des", food.des!!)
intent.putExtra("image", food.image!!)
context!!.startActivity(intent)
}
return foodView
}
override fun getItem(p0: Int): Any {
return listOfFoodsLocal2[p0]
}
override fun getItemId(p0: Int): Long {
return p0.toLong()
}
override fun getCount(): Int {
return listOfFoodsLocal2.size
}
}
class FoodAdapter2 : BaseAdapter {
var context: Context? = null
var listOfFoodsLocal3 = ArrayList<Food>()
constructor(listOfFoods3: ArrayList<Food>, context: Context) : super() {
this.listOfFoodsLocal3 = listOfFoods3
this.context = context
}
override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View {
val food = this.listOfFoodsLocal3[p0]
var inflator = context!!.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
val foodView = inflator.inflate(R.layout.food_ticket2, null)
foodView.ivFoodImage2?.let {
it.setImageResource(food.image!!)
}
foodView.tvName2?.let {
it.text = food.name!!
}
foodView.tvDes2?.let {
it.text = food.des!!
}
foodView.ivFoodImage2.setOnClickListener {
//move to next
val intent = Intent(context, FoodDetails::class.java)
intent.putExtra("name", food.name!!)
intent.putExtra("des", food.des!!)
intent.putExtra("image", food.image!!)
context!!.startActivity(intent)
}
return foodView
}
override fun getItem(p0: Int): Any {
return listOfFoodsLocal3[p0]
}
override fun getItemId(p0: Int): Long {
return p0.toLong()
}
override fun getCount(): Int {
return listOfFoodsLocal3.size
}
}
}
这里是枚举class
enum class AdapterType {
ADAPTER_TYPE_1,
ADAPTER_TYPE_2,
ADAPTER_TYPE_3;
companion object {
fun fromOrdinal(name:String,des:String,image: Int): AdapterType? {
return AdapterType.values().firstOrNull { it.ordinal == image}
}
}
}
您不能在活动之间传递适配器。至少以一种干净的方式,由 Google 推荐。适配器既不实现 Parcelable 也不实现 Serializable 接口。所以一般规则,正如 Nino Handler 指出的那样 - 使用 Intent 发送 data(而不是 Adapters 本身)应该用于创建 Adapter.
创建一个 IntDef 像:
@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;
//...
并将 int 添加到包中。 对于 Kotlin,您必须使用 companion object 来定义变量,例如
class FirstActivity {
companion object {
val ADAPTER_MODE1 = 0
val ADAPTER_MODE2 = 1
val ADAPTER_MODE3 = 2
//...
}
}
因此您可以将无限的适配器盒传递给您的第二个 activity
编辑:
Kotlin
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 }
}
}
}
然后像这样使用它:
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)
}
}
并像这样检索它:
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
}
}