変数をアクティビティからフラグメントに渡し、それを戻す方法は?


135

現在Androidアプリを作成していますが、アクティビティとフラグメントの間に日付を渡したいです。私のアクティビティには、フラグメントを開くボタンがあります:DatePickerFragment。

私の活動では、フラグメントで変更したい日付を示しています。そのため、日付ピッカーに日付を渡し、それをアクティビティに送り返したいのです。

私は多くの解決策を試しましたが、どれもうまくいきません。簡単な方法は引数を渡すことですが、これはフラグメントでは実行できません。


私の問題はあなたの問題とまったく同じです。例がフラグメント自体を日付ピッカーの「ユーザー」としてのみ扱うのではなく、それらを開始したアクティビティとして扱わないのはなぜでしょうか。
クラウディオ

回答:


213

フラグメント情報を渡すには、フラグメントを作成するときに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


10
この質問を何度も繰り返す人々のポイントは、ドキュメントでは十分に説明されていないということです。
Michael Alan Huff、

1
私はまだ、あなた、または@Elenasysで答え、以下のいずれかを使用し何が最善かの方法で混乱しています
ヨアン・Hercouet

アーキテクチャコンポーネントを使用して断片間のデータ共有(I / O '17)への新しい方法があります:developer.android.com/topic/libraries/architecture/...
jpardogo

XMLレイアウト内で作成されたフラグメントはどうですか?
ラルフガブ2017

もう静的メソッドを使いたくありません。
Ahamadullah Saikat

89

から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の回答を読んでください。インターフェースが必要です。詳細:他のフラグメントとの通信


2
カスタムオブジェクトを渡す方法は?私は使用しましたParcelableが、それは私に与えましたclass cast exception
viper

このソリューションは私にとってはうまくいかず、トランザクションをインポートする場所が見つかりません
thebeancounter '19

フラグメントをアクティビティにロードすると、トランザクションで定義されたバンドルを介して値を送信できます。あなたのシナリオは何ですか?
Jorgesys

8

@ρяσѕρєя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);
}

参照: Androidでアクティビティからフラグメントにデータを送信する


7

ライブラリのEventBusを使用して、変数を含むことができるイベントをやり取りします。アクティビティとフラグメントを疎結合に保つため、優れたソリューションです。

https://github.com/greenrobot/EventBus


4
これは良い解決策とは言えませんが、注意が必要です。EventBusは非常に使いやすいですが、ここにも危険があります。あまりにも多くの信号を追加し始めると、疎結合の性質により、だれが誰に電話をかけているのか、さまざまなイベントが発生している場所を追跡することが非常に困難になる可能性があります。
ヨハンポール

2

そこにいるすべての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オブジェクトが作成されたとき、またはここに記載さているよう、データを設定するための素晴らしいトリックです

thisvalueをレシーバーとして指定された関数[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

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


1

アクティビティから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メソッドの引数を読み取ります


0

あなたは単にあなたのフラグメントをバンドルでインスタンス化することができます:

Fragment fragment = Fragment.instantiate(this, RolesTeamsListFragment.class.getName(), bundle);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.