現在Androidアプリを作成していますが、アクティビティとフラグメントの間に日付を渡したいです。私のアクティビティには、フラグメントを開くボタンがあります:DatePickerFragment。
私の活動では、フラグメントで変更したい日付を示しています。そのため、日付ピッカーに日付を渡し、それをアクティビティに送り返したいのです。
私は多くの解決策を試しましたが、どれもうまくいきません。簡単な方法は引数を渡すことですが、これはフラグメントでは実行できません。
現在Androidアプリを作成していますが、アクティビティとフラグメントの間に日付を渡したいです。私のアクティビティには、フラグメントを開くボタンがあります:DatePickerFragment。
私の活動では、フラグメントで変更したい日付を示しています。そのため、日付ピッカーに日付を渡し、それをアクティビティに送り返したいのです。
私は多くの解決策を試しましたが、どれもうまくいきません。簡単な方法は引数を渡すことですが、これはフラグメントでは実行できません。
回答:
フラグメントに情報を渡すには、フラグメントを作成するときにsetArgumentsを指定します。この引数は、フラグメントのメソッドonCreateまたはonCreateViewで後で取得できます。
フラグメントのnewInstance関数に、送信したい引数を追加します。
/**
* Create a new instance of DetailsFragment, initialized to
* show the text at 'index'.
*/
public static DetailsFragment newInstance(int index) {
DetailsFragment f = new DetailsFragment();
// Supply index input as an argument.
Bundle args = new Bundle();
args.putInt("index", index);
f.setArguments(args);
return f;
}
次に、メソッドのフラグメント内で、onCreate
またはonCreateView
次のように引数を取得できます。
Bundle args = getArguments();
int index = args.getInt("index", 0);
フラグメントからアクティビティ(データを送信するかしないか)と通信する場合は、インターフェースを使用する必要があります。これを行う方法は、フラグメント間の通信のドキュメントチュートリアルで非常によく説明されています。すべてのフラグメントはアクティビティを介して相互に通信するため、このチュートリアルでは、実際のフラグメントからアクティビティコンテナーにデータを送信して、アクティビティでこのデータを使用する方法、またはアクティビティに含まれる別のフラグメントにデータを送信する方法を確認できます。
ドキュメントのチュートリアル:
http://developer.android.com/training/basics/fragments/communicating.html
Activity
へのデータの送信Fragment
アクティビティ:
Bundle bundle = new Bundle();
String myMessage = "Stackoverflow is cool!";
bundle.putString("message", myMessage );
FragmentClass fragInfo = new FragmentClass();
fragInfo.setArguments(bundle);
transaction.replace(R.id.fragment_single, fragInfo);
transaction.commit();
断片:
フラグメントの値を読み取る
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
String myValue = this.getArguments().getString("message");
...
...
...
}
しかし、フラグメントからアクティビティに値を送信する場合は、jpardogoの回答を読んでください。インターフェースが必要です。詳細:他のフラグメントとの通信
Parcelable
が、それは私に与えましたclass cast exception
@ρяσѕρєяKとテリーのおかげで...それは私に多くの助けをして完璧に動作します
アクティビティから、次のような目的でデータを送信します。
Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
// set Fragmentclass Arguments
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);
フラグメントのonCreateViewメソッド:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// get arguments
String strtext = getArguments().getString("edttext");
return inflater.inflate(R.layout.fragment, container, false);
}
ライブラリのEventBusを使用して、変数を含むことができるイベントをやり取りします。アクティビティとフラグメントを疎結合に保つため、優れたソリューションです。
そこにいるすべてのKotlin開発者向け:
以下は、フラグメントにデータを送信するために Android Studioが提案するソリューションです(=ファイルで新規フラグメントを作成するとき->新規->フラグメント->フラグメント(空白)で、[フラグメントファクトリメソッドを含める]をオンにします)。
これをフラグメントに入れてください:
class MyFragment: Fragment {
...
companion object {
@JvmStatic
fun newInstance(isMyBoolean: Boolean) = MyFragment().apply {
arguments = Bundle().apply {
putBoolean("REPLACE WITH A STRING CONSTANT", isMyBoolean)
}
}
}
}
.apply
オブジェクトが作成されたとき、またはここに記載されているように、データを設定するための素晴らしいトリックです:
this
valueをレシーバーとして指定された関数[block]を呼び出し、valueを返し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
}
}
アクティビティにデータを「送信」するには、アクティビティで関数を定義し、フラグメントで以下を実行します。
(activity as? YourActivityClass)?.callYourFunctionLikeThis(date) // your function will not be called if your Activity is null or is a different Class
コトリンの魔法をお楽しみください!
アクティビティからXMLでリンクされたフラグメントへのデータの送信
テンプレートのいずれかを使用してAndroid Studioでフラグメントを作成する場合(例:ファイル>新規>フラグメント>フラグメント(リスト))、フラグメントはXMLを介してリンクされます。newInstanceメソッドはフラグメントで作成されますが、呼び出されることはないため、引数を渡すために使用することはできません。
代わりに、アクティビティでメソッドonAttachFragmentをオーバーライドします
@Override
public void onAttachFragment(Fragment fragment) {
if (fragment instanceof DetailsFragment) {
Bundle args = new Bundle();
args.putInt("index", index);
f.setArguments(args);
}
}
次に、他の回答に従ってフラグメントonCreateメソッドの引数を読み取ります