web-dev-qa-db-ja.com

フラグメントのonActivityResult

現在、単一のフラグメントをホストしている基本アクティビティがあります。フラグメント内には、連絡先の選択を開始するメソッドがあります。

private void chooseContacts() {
    Intent pickContactIntent = new Intent(Intent.ACTION_PICK,      ContactsContract.Contacts.CONTENT_URI);
    pickContactIntent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
    startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
}

このアクティビティが返されたら、結果をどのようにキャプチャする必要があります。私は追加しようとしました

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //Handle Code
}

基本アクティビティとフラグメントの両方に、ただしどちらのメソッドもトリガーされていません。可能であれば、アクティビティを濁らせないように、フラグメントにリターンを処理させたいと思います。

この状況でのベストプラクティスを教えてください。

更新:

私が変更した場合:

startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);

getActivity().startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);

それは動作しますが、他の投稿はそれが間違っていると思いました。

34
Nath5

startActivityForResult()を使用せずに、フラグメントで直接getActivity().startActivityForResult()を使用する必要があると思います。

FragmentでstartActivityForResult()を呼び出し、FragmentでonActivityResultを実装すると、onActivityResult()が正しく呼び出されます。

アクティビティでstartActivityForResult()を呼び出すことはできません。そうしないと、フラグメントのonActivityResult()は呼び出されません。

52
Zephyr

私の場合は、親の活動でこれを行いました

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    for (Fragment fragment : getSupportFragmentManager().getFragments()) {
        fragment.onActivityResult(requestCode, resultCode, data);
    }
}
6
SK16

これは、フラグメントのonActivityResultに役立ちます

PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder();
startActivityForResult(builder.build(getActivity()), PLACE_PICKER_REQUEST);

そして

public void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (requestCode == PLACE_PICKER_REQUEST) {
            if (resultCode == Activity.RESULT_OK) {
                Place place = PlacePicker.getPlace(data, getActivity());
             }
         }
}

フラグメントのonActivityCreatedは別の目的を果たします。

フラグメントのアクティビティが作成され、このフラグメントのビュー階層がインスタンス化されたときに呼び出されます。ビューの取得や状態の復元など、これらの要素が適切に配置されたら、最終的な初期化に使用できます。また、setRetainInstance(boolean)を使用してインスタンスを保持するフラグメントにも役立ちます。このコールバックは、新しいアクティビティインスタンスに完全に関連付けられたときにフラグメントに通知するためです。これは、onCreateView(LayoutInflater、ViewGroup、Bundle)の後、onViewStateRestored(Bundle)の前に呼び出されます。

これは documentation から抽出されます

主にフラグメントを使用して、onCreateViewでビューを膨らませて返し、ListAdapterでビュー操作(ListViewonViewCreatedを設定するなど)を実行します。そして、onActivityCreatedで初期化操作(ウェルカムダイアログの表示など)を実行します。

あなたにはいくつかの選択肢がありますが、私はあなたの問題に適しているかどうかよくわかりません:

  • アクティビティのfindFragmentByIdonActivityResultを実行し、フラグメントがnullでない場合は、連絡先リストからの返信を処理するメソッドを実行しますフラグメントに。

  • 別の方法として、アクティビティのBroadCastReceiveronActivityResultを起動し、そのブロードキャストを聞くためにフラグメントを登録します。しかし、これはとても単純なことには面倒すぎると思います。

  • 最後に、最初のものと同様に、idを持つフラグメントがない場合、アクティビティでフラグメントをインスタンス化し、参照を保存し、アクティビティのonActivityResultが実行されたときにメッセージを送信できます。

これがあなたのお役に立てば幸いです。

1
4gus71n