activity嵌套fragment 并 启动activity
Posted wanglongjiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了activity嵌套fragment 并 启动activity相关的知识,希望对你有一定的参考价值。
1.MainActivity
FragmentManager fragmentManager; FragmentTransaction transaction; private void replaceFragment(Fragment fragment) // 1.获取FragmentManager,在活动中可以直接通过调用getFragmentManager()方法得到 fragmentManager =getSupportFragmentManager(); // 2.开启一个事务,通过调用beginTransaction()方法开启 transaction = fragmentManager.beginTransaction(); // 3.向容器内添加或替换碎片,一般使用replace()方法实现,需要传入容器的id和待添加的碎片实例 transaction.replace(R.id.fr_container, fragment); //fr_container不能为fragment布局,可使用线性布局相对布局等。 // 4.使用addToBackStack()方法,将事务添加到返回栈中,填入的是用于描述返回栈的一个名字 transaction.addToBackStack(null); // 5.提交事物,调用commit()方法来完成 transaction.commit();
2.fragment 启动Activity
@Override public void onResume() super.onResume(); Intent intent = new Intent(); intent.setClass(getActivity(), AdjustResolutionDialogActivity.class); //intent.putExtra(EXTRA_PREFERENCE_KEY, curMode); getActivity().startActivity(intent);
那我们就通过上节的代码在Activity中和Fragment01和Fragment02中加入log, 关于代码我就不需要贴出了,我们用Log分析。
a:在Activity中启动Fragment01
可以看到这个和上图的流程是一样的。
b:然后按back键返回
可以看到显示Fragment先暂停,Activity再暂停,接着是Fragment停止,Activity停止,接着是Fragment销毁,Activity销毁
c:当启动Fragment01后,按Home按键
可以看到显示Fragment先暂停,Activity再暂停,接着是Fragment停止,Activity停止
d:在c种情况下后,然后再次启动该应用
可以看到先是Activity先重新启动,然后是Fragment再次启动,接着是Activity运行,然后是Fragment运行
e:启动Fragment01后,再次启动Fragment02
可以看到先是Fragment01先彻底销毁,再次加载Fragment02的
总结:
1:可以看到Fragment是Activity的界面的一部分,当Activity创建后才会有Fragment
2:Fragment的生命周期是受Activity影响的,当Activity停止后,Fragment也会跟着停止
3:当Activity运行之后(OnResume方法调用之后,OnPause方法调用之前),可以单独的操作每个Fragment,比如增加,删除
activity 嵌套一级fragment,一级fragment嵌套二级fragment,在一级fragment中刷新二级fragment中的UI
今天遇到挺纠结的问题,由于产品设计的问题,技术上涉及到activity 嵌套一级fragment,一级fragment嵌套二级fragment,在一级fragment中刷新二级fragment中的UI。
其中一级fragment中有顶部搜索栏,搜索栏下面有viewpager+fragment的布局,搜索栏输入内容后要更新子当前页面的fragment的搜索方法,并刷新UI.
adapter:
private class OrderManagerFragmentPagerAdapter extends FragmentPagerAdapter { public OrderManagerFragmentPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { switch (position) { case 0: return NewOrderFragment.newInstance(); case 1: return FollowingFragment.newInstance(); case 2: return DesperatelyFollowingFragment.newInstance(); case 3: return RobbedFragment.newInstance(); case 4: return TransferFragment.newInstance(); case 5: return ClinchDealFragment.newInstance(); case 6: return LostFragment.newInstance(); case 7: return NoEffectFragment.newInstance(); default: return null; } } @Override public CharSequence getPageTitle(int position) { return TITLES[position % TITLES.length]; } @Override public int getCount() { return TITLES.length; } }
调用adapter的getitem()并调用子当前页面的fragment的搜索方法,并刷新UI,但是出错,子fragment中UI组件为null,adapter为null;
正确调用姿势为:
int position = pager.getCurrentItem(); String searchWord = searchtv.getSearchWord(); //两层fragment嵌套,调用指定fragment的刷新操作,fuck,这方法找了好几天 Fragment fragment = getChildFragmentManager().getFragments().get(position);
获取当前显示的子fragment,然后调用子fragment的搜索方法,并刷新UI.,完美实现。
以上是关于activity嵌套fragment 并 启动activity的主要内容,如果未能解决你的问题,请参考以下文章
[Android Studio]如何从Fragment中嵌套的Recycleview启动一个Activity?
是否最好使用 Activity.onAttachFragment 或 Fragment.onAttach 在 Activity 和嵌套片段之间进行通信?