現在、単一のフラグメントをホストしている基本アクティビティがあります。フラグメント内には、連絡先の選択を開始するメソッドがあります。
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);
それは動作しますが、他の投稿はそれが間違っていると思いました。
startActivityForResult()
を使用せずに、フラグメントで直接getActivity().startActivityForResult()
を使用する必要があると思います。
FragmentでstartActivityForResult()
を呼び出し、FragmentでonActivityResult
を実装すると、onActivityResult()
が正しく呼び出されます。
アクティビティでstartActivityForResult()
を呼び出すことはできません。そうしないと、フラグメントのonActivityResult()
は呼び出されません。
私の場合は、親の活動でこれを行いました
@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);
}
}
これは、フラグメントの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
でビュー操作(ListView
にonViewCreated
を設定するなど)を実行します。そして、onActivityCreated
で初期化操作(ウェルカムダイアログの表示など)を実行します。
あなたにはいくつかの選択肢がありますが、私はあなたの問題に適しているかどうかよくわかりません:
アクティビティのfindFragmentById
でonActivityResult
を実行し、フラグメントがnull
でない場合は、連絡先リストからの返信を処理するメソッドを実行しますフラグメントに。
別の方法として、アクティビティのBroadCastReceiver
でonActivityResult
を起動し、そのブロードキャストを聞くためにフラグメントを登録します。しかし、これはとても単純なことには面倒すぎると思います。
最後に、最初のものと同様に、idを持つフラグメントがない場合、アクティビティでフラグメントをインスタンス化し、参照を保存し、アクティビティのonActivityResult
が実行されたときにメッセージを送信できます。
これがあなたのお役に立てば幸いです。