如何从片段和活动中传递和获取价值

时间:2017-10-03 18:34:07

标签: android fragment kotlin

如何传递并从片段和活动中获取价值?

8 个答案:

答案 0 :(得分:16)

有伴侣对象(https://kotlinlang.org/docs/reference/object-declarations.html#companion-objects

像往常一样定义片段,并声明在Java中充当静态newInstance()等效项的伴侣:

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)

答案 1 :(得分:13)

这是Android Studio建议的解决方案(=当您使用文件创建空白片段->新建->片段-> Fragment(Blank)并选中“包括片段工厂方法”时)。

将其放入片段中

class MyFragment: Fragment {

...

    companion object {

            @JvmStatic
            fun newInstance(isMyBoolean: Boolean) = MyFragment().apply {
                arguments = Bundle().apply {
                    putBoolean("REPLACE WITH A STRING CONSTANT", isMyBoolean)
                }
            }
     }
}

.apply是在创建对象或设置为they state here时设置数据的好技巧:

  

使用值为this的指定函数[block]作为接收者   并返回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 :(得分:6)

使用它将参数发送到片段

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)

答案 3 :(得分:3)

以更多Kotlin风格

进行

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)

答案 4 :(得分:2)

在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
        }
}

}

答案 5 :(得分:0)

  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)

答案 6 :(得分:0)

在一个源代码中,我找到了这个版本:

class ConfirmPasswordActivity : Activity {

companion object {
    lateinit var person: Person
    fun newIntent(context: Context, person: Person) = run {
        this.person = person
        Intent(context, ConfirmPasswordActivity::class.java)
    }
}
private fun setOnClickListeners() {
    ib_back.setOnClickListener { finish() }
    btn_confirm_password.setOnClickListener {
        onNext(UiEvents.OnBtnConfirmClicked(person))
    }
}

答案 7 :(得分:-1)

传递并从片段和活动中获取价值,

val mFragment = Fragment()
val mArgs = Bundle()
mArgs.putInt("Key", value)
mFragment.setArguments(mArgs)

在第二个Activity / Fragment中使用此段代码来获取您的值。

var args = getArguments()
var index = args.getInt("Key", 0)