Как передать и получить значение из фрагмента и активности

Как передать и получить значение из фрагмента и активности?

Ответы

Ответ 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)