Bundle обнуляется, хотя я не объявил это как таковой - PullRequest
0 голосов
/ 16 мая 2018
class UserFragment : Fragment(), View.OnClickListener {

private val userBinding: FragmentUserBinding by onCreateView<Fragment, FragmentUserBinding>(R.layout.fragment_user)
val user: ObservableField<String> = ObservableField()
private var bundle = Bundle()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    userBinding.main = this
}

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) = userBinding.root!!

override fun onClick(p0: View?) {
    runAnimation(500L, Techniques.RubberBand, p0)
    Handler().postDelayed({
        saveUserAndStartLetterFragment()
    }, 700L)
}

private fun saveUserAndStartLetterFragment() {
    var fragment = WordpackChooserFragment()
    bundle.putString("User",user.get())
    fragment.arguments = bundle
    activity!!.supportFragmentManager.replaceFragment(fragment, activity!!.findViewById(R.id.flContainer))
}
}

В этом фрагменте я объявляю комплект.Я не определяю его как nullable.

class WordpackChooserFragment : Fragment(), View.OnClickListener {

private val wordpackChooserBinding: FragmentWordpackChooserBinding by onCreateView<Fragment, FragmentWordpackChooserBinding>(R.layout.fragment_wordpack_chooser)
private var bundle: Bundle = Bundle()
private lateinit var fragment: Fragment

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    wordpackChooserBinding.main = this
    setRecycler()
    bundle = arguments
    return wordpackChooserBinding.root
}

override fun onClick(v: View?) {
    fragment = RoundsChooserFragment()
    bundle.putStringArrayList("Wordpack", selectedPack)
    fragment.arguments = bundle
    activity!!.supportFragmentManager.replaceFragment(fragment, activity!!.findViewById(R.id.flContainer))
}

private fun setRecycler() {
    wordpackChooserBinding.root.btn_recycler.layoutManager = LinearLayoutManager(this.context)
    wordpackChooserBinding.root.btn_recycler.adapter = BtnAdapter(this)
    wordpackChooserBinding.root.btn_recycler.adapter.notifyDataSetChanged()
}

}

В этом фрагменте в этой строке bundle = arguments ошибки со следующим:

Несоответствие типов.

Обязательно: Bundle

Найдено: Bundle?

Я могу использовать оператор ненулевого утверждения '!!'но похоже на взлом.

1 Ответ

0 голосов
/ 16 мая 2018

arguments is nullable (обратите внимание на «если таковые имеются» в описании ссылки), поэтому вы не можете просто присвоить его ненулевому Bundle. Вы бы либо обработали случай, когда он null (с использованием if), с использованием !!, либо вы могли бы написать что-то вроде этого:

arguments?.let { bundle = it }

Однако я бы сказал, что предпочтительнее использовать let.

...