use*_*104 10 android android-tabhost android-fragments android-activity onactivityresult
应用程序的结构如下:
tabHost (in Activity) -> contains -> TabFragment(extend base container fragment)
Run Code Online (Sandbox Code Playgroud)
1.活动中的代码:
tabHost.addTab(
tabHost.newTabSpec("home").setIndicator("",
getResources().getDrawable(R.drawable.btn_home)),
HomeFragment.class, null);
Run Code Online (Sandbox Code Playgroud)
2. HomeFragment中的代码 (注意HomeFragment不是实际的函数,而是像这样的容器,它扩展了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);
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
4.在Home(片段的实际内容)
UploadType fragment = new UploadType();
Bundle bundle = new Bundle();
bundle.putString("form_type", "request");
fragment.setArguments(bundle);
((BaseContainerFragment)getParentFragment()).replaceFragment(fragment, true);
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
如何在UploadType上触发onActivityResult?感谢帮助.
Jer*_*ols 31
这不起作用的原因是因为您startActivityForResult()在嵌套片段中进行调用.Android足够聪明,可以将结果路由回一个Activity甚至一个Fragment,但不是嵌套,Fragment因此你没有得到回调.(有关为什么在此处或在stackoverflow上不起作用的更多信息)
现在为了使它工作,我建议你手动将回调路由到ChildFragment(= UploadType)中的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);
}
Run Code Online (Sandbox Code Playgroud)
Kas*_*ala 13
就我而言,我已经完成了在我的代码中添加以下代码 MainActivity.java
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
在你的Activity Override onActivityForResult()中
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
Run Code Online (Sandbox Code Playgroud)
现在在你的片段中,你可以在里面得到活动结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d("test1", "result2");
}
Run Code Online (Sandbox Code Playgroud)
确保当你正在调用启动ActivityForResult时,它应该是这样的
startActivityForResult(intent, REQUEST_CAMERA);
Run Code Online (Sandbox Code Playgroud)
如果您使用的是单个活动并且在 里面有片段NavHostFragment,则存在onActivityResult()子片段NavHostFragment未被调用的问题。
要解决此问题,您需要onActivityResult()从onActivityResult()主机活动内部手动调用子片段的。主机活动是托管您的NavHostFragment.
这onActivityResult()是您的主机活动的 Kotlin 代码:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
val navHostFragment = supportFragmentManager.findFragmentById(R.id.your_nav_host_fragment)
val childFragments = navHostFragment?.childFragmentManager?.fragments
childFragments?.forEach { it.onActivityResult(requestCode, resultCode, data) }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25210 次 |
| 最近记录: |