我目前有一个托管单个片段的基本活动。在片段内部,我有一个启动联系人选择器的方法。
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
}
到我的基本Activity和片段,但都没有触发任何方法。如果可能的话,我希望让片段处理返回,以免混淆活动。
请告诉我这种情况下的最佳做法。
更新
如果我改变:
startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
到
getActivity().startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
然后它有效,但其他帖子让我认为这是不正确的。
答案 0 :(得分:51)
我认为您仍然应该直接在片段中使用调用startActivityForResult()
,不要使用getActivity().startActivityForResult()
。
我在片段中调用startActivityForResult()
并在片段中实现onActivityResult
,正确调用onActivityResult()
。
您无法在活动中调用startActivityForResult()
,否则将不会调用Fragment中的onActivityResult()
。
答案 1 :(得分:6)
就我而言,我在父母活动
中这样做了 @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);
}
}
答案 2 :(得分:1)
片段的onActivityCreated
有另一个目的:
在创建片段的活动并且实例化此片段的视图层次结构时调用。一旦这些部分就位,它可用于进行最终初始化,例如检索视图或恢复状态。对于使用setRetainInstance(boolean)保留其实例的片段也很有用,因为此回调告诉片段何时与新活动实例完全关联。这是在onCreateView(LayoutInflater,ViewGroup,Bundle)之后和onViewStateRestored(Bundle)之前调用的。
中提取的主要是使用片段,您会膨胀并返回onCreateView
中的视图,在ListAdapter
中执行查看操作(例如在ListView
中设置onViewCreated
) 。并在onActivityCreated
。
你有几个选择,我不太确定你的问题会更好:
我要做的是在findFragmentById
活动中做onActivityResult
,如果片段不是null
,执行一个处理从片段中的联系人列表返回。
另一种方法是在活动的BroadCastReceiver
中触发onActivityResult
,然后注册片段以收听该广播。但我认为这对于这么简单的事情来说太过混乱了。
最后,和第一个一样,如果你没有带有id的片段,你可以在你的活动中实例化片段,保存一个引用,并在onActivityResult
时向它发送一条消息活动的执行情况。
我希望这对你有所帮助。
答案 3 :(得分:1)
这将有助于您在片段中phpinfo()
Module Authors
和
onActivityResult