フラグメントおよびアクティビティから値を渡し、取得する方法は?
これは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
は、オブジェクトの作成時にデータを設定する、または ここでは状態 :
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
}
}
コトリンの魔法をお楽しみください!
そのためのコンパニオンオブジェクトがあります( 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)
これを使用して引数をフラグメントに送信します
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)
より多くの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)
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
}
}
}
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)