web-dev-qa-db-ja.com

フラグメントとアクティビティから値を渡し、取得する方法

フラグメントおよびアクティビティから値を渡し、取得する方法は?

18
Best Best

これはAndroid St​​udioが提案したソリューションです(=ファイル->新規->フラグメント-> 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
    }
}

コトリンの魔法をお楽しみください!

25
Spipau

そのためのコンパニオンオブジェクトがあります( 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)
17
NSimon

これを使用して引数をフラグメントに送信します

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)
6
Ankit Kumar

より多くの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
Krasavello13

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

}

2
RaghuPrasanth V
  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)
0
Jayesh Patel