通过Parcebale在片段之间通过捆绑发送自定义类对象

时间:2018-08-01 11:12:50

标签: android android-fragments kotlin

我在主要活动中使用了片段,我想将自定义类“ TaskWithUserAndProfile”的对象发送到TaskDetailsFragment

我发现您可以使用Bundle并使其发送字符串,但是当我尝试使用Parcebale发送时,事情变得很复杂。  这是我的代码中的一些部分,可以更好地理解:

  

TaskWithUserAndProfile.kt

class TaskWithUserAndProfile() : Parcelable{
    override fun writeToParcel(p0: Parcel?, p1: Int) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    var profile = Profile()
    var task = Task()
    var user = User()

    constructor(parcel: Parcel) : this() {
        //profile = parcel.read
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<TaskWithUserAndProfile> {
        override fun createFromParcel(parcel: Parcel): TaskWithUserAndProfile {
            return TaskWithUserAndProfile(parcel)
        }

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

HomeFragment.kt

//Inside onCreateView
adapter = TasksAdapter(tasksArray) { item ->
            println(item.profile)
            val bundle  = Bundle()
            bundle.putParcelable("MyItem", item)
            val taskDetailsFragment = TaskDetailsFragment()
            taskDetailsFragment.arguments = bundle
            val fragmentTransaction = fragmentManager.beginTransaction()
            fragmentTransaction.replace(R.id.container, taskDetailsFragment)
            fragmentTransaction.addToBackStack(null)
            fragmentTransaction.commit()
        }

实现Parcebale的类的外观应该如何,然后如何分段发送和接收item对象?

3 个答案:

答案 0 :(得分:1)

如果您想继续使用宗地化,只需尝试以下示例:

@Parcelize
data class TaskWithUserAndProfile(var profile:Profile, var task :Task, var user:User) : Parcelable{}

我可能会从您的类中遗漏一些东西,但是这个主意应该看起来像这样,所以请使用批注@Parcelize和Parcelable实现(不需要覆盖任何方法)。

Update 感谢您的提醒。您必须将其添加到gradle文件中:

androidExtensions {
    experimental = true
}

答案 1 :(得分:0)

使用此插件:

android-parcelable-intellij-plugin-kotlin

用于TaskWithUserAndProfile, Profile, Task, User模型。

答案 2 :(得分:0)

您甚至不需要使用for first_data, second_data in zip(first, second): f = get_or_create_node(first_data, values[first_data - 1]) s = get_or_create_node(second_data, values[second_data - 1]) f.addChild(s.data) print(f"First: {f.data} Value: {f.value} Children: {f.children}") ,只需在Parcelable中定义一个TaskWithUserAndProfile变量并在TaskDetailsFragment中进行设置即可。

  

TaskDetailsFragment.kt

HomeFragment
  

HomeFragment.kt

class TaskDetailsFragment : Fragment() {

    var selectedTask: TaskWithUserAndProfile? = null

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {
    }
}