Передача данных между фрагментами в студии android kotlin - PullRequest
0 голосов
/ 04 мая 2019

Я хочу передать некоторые данные из PowerofMind во фрагмент списка пожеланий, но я столкнулся с некоторой ошибкой.

Это действие, из которого необходимо передать данные

      wish?.setOnClickListener({
            val name = "Power of Subconcoius Mind"
            val intent = Intent(this@PowerofMind, WishlistFragment::class.java)
            intent.putExtra("Book: ", name)
            startActivity(intent)
            Toast.makeText(this, "Added to WishList", Toast.LENGTH_SHORT).show()
        })

Я хочу показать данныев этом действии как



class WishlistFragment : Fragment() {
    var result: TextView? = null

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.fragment_wishlist, null)
        result =view.findViewById(R.id.list1)
        val name = activity?.intent?.getStringExtra("Book: ")
        list1.text = "Book: $name"
        return view
    }
}

Но есть ошибка Intent.Пожалуйста, помогите

Ответы [ 3 ]

1 голос
/ 04 мая 2019

Вот пример того, как создать экземпляр фрагмента фабричным методом:

companion object {
    private const val MY_DATA_KEY = "my_data"
    private const val ANOTHER_DATA_KEY = "another_data"
    fun newInstance(mySerializableData: Any, anotherData: Int) = MyFragment().apply {
        //bundleOf() is an exstension method from KTX https://developer.android.com/kotlin/ktx
        arguments = bundleOf(MY_DATA_KEY to mySerializableData, ANOTHER_DATA_KEY to anotherData)
    }
}
0 голосов
/ 04 мая 2019

В вашем WishlistFragment вы создаете новый Intent вместо того, чтобы получать тот, который предоставляется действием.

Поскольку вы используете Kotlin, вы можете напрямую использовать намерение вместо getIntent ().Вы также можете использовать синтетическое преимущество kotlin и отбросить что findViewById.

И в качестве подсказки, не используйте конкатенацию строк;)

Ваш фрагмент будет выглядеть примерно так:

class WishlistFragment : Fragment() {

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val view = inflater.inflate(R.layout.fragment_wishlist, null)
    val name = activity?.intent?.getStringExtra("Book: ")
    many.text = "Book: $name"
}
0 голосов
/ 04 мая 2019

Вот как вы можете передавать данные между фрагментами в kotlin, используя класс Parcelable:

при нажатии кнопки:

     override fun onClick(v: View?) {
        firstName = editTextName!!.text.toString()
        lastName = editTextLast!!.text.toString()
        Toast.makeText(context, firstName, Toast.LENGTH_SHORT).show()
//        val viewFragment = ViewFragment()
//        val transaction = fragmentManager.beginTransaction()
//        transaction.replace(R.id.fragmentContainer, viewFragment)
//        transaction.commit()

        var details = Details(firstName!!, lastName!!)
        val viewFragment = ViewFragment()
        val bundle = Bundle()
        bundle.putParcelable(KEY_PARSE_DATA, details)
        viewFragment.setArguments(bundle)
        val transaction = fragmentManager.beginTransaction()
        transaction.replace(R.id.fragmentContainer, viewFragment)
        transaction.commit()
    }

Вот класс посылки, как обрабатывать данные

     @Parcelize
class Details(val firstName: String, val lastName: String) : Parcelable

на другом фрагменте

override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        val view: View = inflater!!.inflate(R.layout.fragment_view, container, false)

        textViewName = view.findViewById(R.id.text_name_another) as TextView
        textViewLastName = view.findViewById(R.id.text_surname_another) as TextView

        val bundle = arguments
        if (bundle != null) {
            val details = bundle.getParcelable<Details>(KEY_PARSE_DATA)
            textViewName!!.setText(details.firstName)
            textViewLastName!!.setText(details.lastName)
        }


        return view
    }

В настоящее время я не знаю, требуется ли это в kotlin в приложении Gradle (проверьте это перед использованием)

androidExtensions {
    experimental = true
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...