Как передать и получить значение из фрагмента и активности
Как передать и получить значение из фрагмента и активности?
Ответы
Ответ 1
Вот предлагаемое решение для Android Studio (= когда вы создаете Blank-Fragment с File → New → Fragment → Fragment (Blank), и вы проверяете "include factory factory methods").
Поместите это в свой фрагмент:
class MyFragment: Fragment {
...
companion object {
@JvmStatic
fun newInstance(isMyBoolean: Boolean) = MyFragment().apply {
arguments = Bundle().apply {
putBoolean("REPLACE WITH A STRING CONSTANT", isMyBoolean)
}
}
}
}
.apply
- хороший трюк для установки данных при создании объекта или в том виде, в .apply
здесь:
Вызывает указанную функцию [блок] с this
значением в качестве приемника и возвращает this
значение.
Затем в вашей деятельности или фрагменте выполните:
val fragment = MyFragment.newInstance(false)
... // transaction stuff happening here
и прочитайте Аргументы в вашем фрагменте, такие как:
private var isMyBoolean = false
override fun onAttach(context: Context?) {
super.onAttach(context)
arguments?.getBoolean("REPLACE WITH A STRING CONSTANT")?.let {
isMyBoolean = it
}
}
Наслаждайтесь волшебством Котлина!
Ответ 2
Для этого есть сопутствующий объект (https://kotlinlang.org/docs/reference/object-declarations.html#companion-objects).
Определите свой фрагмент как обычно и объявите компаньона, который действует как статический эквивалент newInstance() в Java:
class ViewStackListFragment : Fragment() {
companion object {
fun newInstance(position: Int): ViewStackListFragment {
val fragment = ViewStackListFragment()
val args = Bundle()
args.putInt("position", position)
fragment.setArguments(args)
return fragment
}
}
}
И просто назовите это как в Java:
val fragment = ViewStackListFragment.newInstance(4)
Ответ 3
используйте это для отправки аргументов фрагменту
fun newInstance(index: Int): MyFragment {
val f = MyFragment ()
// Pass index input as an argument.
val args = Bundle()
args.putInt("index", index)
f.setArguments(args)
return f
}
И получить такие аргументы, как это
val args = arguments
val index = args.getInt("index", 0)
Ответ 4
Сделайте это в более стиле Котлина
1) Создайте встроенную функцию:
inline fun <FRAGMENT : Fragment> FRAGMENT.putArgs(argsBuilder: Bundle.() -> Unit): FRAGMENT = this.apply { arguments = Bundle().apply(argsBuilder) }
2) Теперь вы можете использовать это расширение во всех фрагментах без дублирования кода:
class MyFragment: Fragment() {
companion object {
fun newInstance(name: String) = MyFragment().putArgs {
putString("nameKey", name)
}
}
}
class MyFragment1: Fragment() {
companion object {
fun newInstance(boolean: Boolean) = MyFragment1().putArgs {
putBoolean("booleanKey", boolean)
}
}
}
3) Создайте свои фрагменты:
val myFragment = MyFragment.newInstance("NAME")
val myFragment1 = MyFragment1.newInstance(true)
Ответ 5
простой способ вызова в java.... вроде так
class ViewStackListFragment : Fragment() {
companion object {
fun newInstance(position: Int): ViewStackListFragment {
val fragment = ViewStackListFragment()
val args = Bundle()
args.putInt("position", position)
fragment.setArguments(args)
return f
}
}
}
Ответ 6
val otpFragment = OtpFragment()
val bundle = Bundle()
bundle.putString("otp", loginDetails[0].otp)
otpFragment.arguments = bundle
CommonUtil.changeFragment(otpFragment, R.id.flLogin, Login.manager, R.anim.enter_anim, R.anim.exit_anim)
Ответ 7
private fun One() {
val args = Bundle()
args.putString("Floor", "1")
args.putString("Floor_1","1A")
args.putString("Floor_2","1B")
args.putString("Floor_3","1C")
val newFragment = FloorRoom()
newFragment.arguments = args
fragmentManager!!.beginTransaction().addToBackStack(null).replace(R.id.mFrameContainer, newFragment).commit()
}
//get bundle data into another fragment
val floor = this.arguments!!.getString("Floor")
val floor1 = this.arguments!!.getString("Floor_1")
val floor2 = this.arguments!!.getString("Floor_2")
val floor3 = this.arguments!!.getString("Floor_3")
mFloor.text = floor
mFloor1.text = floor1
mFloor2.text = floor2
mFloor3.text = floor3
Ответ 8
Чтобы передать и получить значение от фрагмента и активности,
val mFragment = Fragment()
val mArgs = Bundle()
mArgs.putInt("Key", value)
mFragment.setArguments(mArgs)
Используйте этот фрагмент кода во втором Activity
/Fragment
чтобы получить свои значения.
var args = getArguments()
var index = args.getInt("Key", 0)