web-dev-qa-db-ja.com

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

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

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

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

119
user1687114

情報をfragmentに渡すには、作成時にArgumentsを設定します。この引数は、後でフラグメントのメソッド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

200
jpardogo

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の回答を読むには、インターフェイスが必要です。詳細情報: 他のフラグメントとの通信

83
Elenasys

ライブラリEventBusを使用して、変数を前後に含む可能性のあるイベントを渡します。アクティビティとフラグメントの疎結合を維持するため、優れたソリューションです

https://github.com/greenrobot/EventBus

7

@ρяσѕρєя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
mahmoud zaher

XMLでリンクされたフラグメントにアクティビティからデータを送信

テンプレートのいずれかを使用してAndroid St​​udioでフラグメントを作成する場合(例: [ファイル]> [新規]> [フラグメント]> [フラグメント(リスト)]を選択すると、フラグメントは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メソッドの引数を読み取ります

1
Dale

バンドルでフラグメントを単純にインスタンス化できます。

Fragment fragment = Fragment.instantiate(this, RolesTeamsListFragment.class.getName(), bundle);
0
stef