onActivityResult 不在 Fragment 中调用 [英] onActivityResult not call in the Fragment
问题描述
应用程序的结构是这样的:
The structure of the app is like this:
tabHost (in Activity) -> contains -> TabFragment(extend base container fragment)
1.Activity 中的代码:
tabHost.addTab(
tabHost.newTabSpec("home").setIndicator("",
getResources().getDrawable(R.drawable.btn_home)),
HomeFragment.class, null);
2.HomeFragment 中的代码(注意 HomeFragment 并不是真正的函数,而是一个这样的容器,它扩展了 BaseContainerFragment):
2. The code in HomeFragment (Notice that HomeFragment is not the actual function but a container like this, and it extend BaseContainerFragment):
public class HomeFragment extends BaseContainerFragment {
public Home homeFrag;
private boolean mIsViewInited;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.container_fragment, null);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (!mIsViewInited) {
mIsViewInited = true;
initView();
}
}
private void initView() {
homeFrag = new Home();
replaceFragment(homeFrag, false);
}
}
3.BaseContainerFragment
public class BaseContainerFragment extends Fragment {
public void replaceFragment(Fragment fragment, boolean addToBackStack) {
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
if (addToBackStack) {
transaction.addToBackStack(null);
}
transaction.replace(R.id.container_framelayout, fragment);
transaction.commit();
}
public boolean popFragment() {
boolean isPop = false;
if (getChildFragmentManager().getBackStackEntryCount() > 0) {
isPop = true;
getChildFragmentManager().popBackStack();
}
return isPop;
}
}
4.在首页(片段的实际内容)
UploadType fragment = new UploadType();
Bundle bundle = new Bundle();
bundle.putString("form_type", "request");
fragment.setArguments(bundle);
((BaseContainerFragment)getParentFragment()).replaceFragment(fragment, true);
5.在 UploadType 中,我调用了相机活动,但 onActivityResult 仅在主活动中返回.
startActivityForResult(intent, REQUEST_CAMERA);
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d("test1", "result2");
super.onActivityResult(requestCode, resultCode, data);
}
如何在 UploadType 上触发 onActivityResult?感谢您的帮助.
How can I trigger the onActivityResult at UploadType? Thanks for help.
推荐答案
这不起作用的原因是因为您正在从嵌套片段中调用 startActivityForResult()
.Android 足够聪明,可以将结果路由回 Activity
甚至 Fragment
,但不能路由到嵌套的 Fragment
,因此您为什么不这样做得到回调.(有关为什么这不起作用的更多信息此处或stackoverflow)
The reason why this doesn't work is because you are calling startActivityForResult()
from within a nested fragment. Android is smart enough to route the result back to an Activity
and even a Fragment
, but not to a nested Fragment
hence why you don't get the callback.
(more information to why that doesn't work here or on stackoverflow)
现在为了使它工作,我建议您手动将回调路由到 ParentFragment
(=ChildFragment
(=UploadType
)BaseContainerFragment
):
Now in order to make it work I suggest you manually route the callback to the ChildFragment
(=UploadType
) in the ParentFragment
(=BaseContainerFragment
):
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Fragment uploadType = getChildFragmentManager().findFragmentById(R.id.container_framelayout);
if (uploadType != null) {
uploadType.onActivityResult(requestCode, resultCode, data);
}
super.onActivityResult(requestCode, resultCode, data);
}
这篇关于onActivityResult 不在 Fragment 中调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!