Fragment的相关用法第二篇
2016-12-31 18:56
309 查看
如今Android 中fragment的使用越来越频繁,在实现多个fragment之后,如若在切换时使用replace()方法替换Fragment,那就要不断的去实例化,消耗资源。所以把replace()用add()+show()+hide()来替代从而当Fragment实例化之后就控制Fragment的显示隐藏。直接上代码:
public class MainActivity extends BaseActivity implements View.OnClickListener {FragmentManager fm;// 为每个fragment设置标签private String[] tags = new String[]{"HomeFragment", "ContentFragment", "ListFragment", "UserFragment"};private TextView mTabOne, mTabTwo, mTabThree, mTabFour;private List<Fragment> fragments = new ArrayList<>();Fragment mHomeFragment, mContentFragment, mListFragment, mUserFragment;private Fragment mContent;//当前fragment@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();init();}private void init() {fm = getFragmentManager();mHomeFragment = new HomeFragment();mUserFragment = new UserFragment();mListFragment = new ListFragment();mContentFragment = new ContentFragment();fragments.add(0, mHomeFragment);fragments.add(1, mContentFragment);fragments.add(2, mListFragment);fragments.add(3, mUserFragment);mContent = mHomeFragment;FragmentTransaction ft = fm.beginTransaction();ft.add(R.id.content_frame, mContent);ft.commitAllowingStateLoss();}/*** 当activity非正常销毁时会进入此方法中 保存一些临时性的数据** @param outState* @param outPersistentState*/@Overridepublic void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {super.onSaveInstanceState(outState, outPersistentState);stateCheck(outState);}private void initView() {mTabFour = (TextView) findViewById(R.id.home_tab_four);mTabThree = (TextView) findViewById(R.id.home_tab_three);mTabTwo = (TextView) findViewById(R.id.home_tab_two);mTabOne = (TextView) findViewById(R.id.home_tab_one);mTabFour.setOnClickListener(this);mTabThree.setOnClickListener(this);mTabTwo.setOnClickListener(this);mTabOne.setOnClickListener(this);}/*** fragment 切换** @param from* @param to*/public void switchFragment(Fragment from, Fragment to, int position) {if (mContent != to) {mContent = to;FragmentTransaction transaction = fm.beginTransaction();if (!to.isAdded()) { // 先判断是否被add过transaction.hide(from).add(R.id.content_frame, to, tags[position]).commitAllowingStateLoss(); // 隐藏当前的fragment,add下一个到Activity中} else {transaction.hide(from).show(to).commitAllowingStateLoss(); // 隐藏当前的fragment,显示下一个}}}/*** 状态检测 用于内存不足的时候保证fragment不会重叠** @param savedInstanceState*/private void stateCheck(Bundle savedInstanceState) {if (savedInstanceState == null) {fm = getFragmentManager();fm = getFragmentManager();FragmentTransaction fts = fm.beginTransaction();HomeFragment af = new HomeFragment();mContent = af;fts.add(R.id.content_frame, af);fts.commit();} else {/*** 通过设置的tag来寻找fragment*/HomeFragment home = (HomeFragment) getFragmentManager().findFragmentByTag(tags[0]);ContentFragment content = (ContentFragment) getFragmentManager().findFragmentByTag(tags[1]);ListFragment list = (ListFragment) getFragmentManager().findFragmentByTag(tags[2]);UserFragment user = (UserFragment) getFragmentManager().findFragmentByTag(tags[3]);getFragmentManager().beginTransaction().show(home).hide(content).hide(list).hide(user).commitAllowingStateLoss();}}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.home_tab_four:switchFragment(mContent, fragments.get(3), 3);break;case R.id.home_tab_three:switchFragment(mContent, fragments.get(2), 2);break;case R.id.home_tab_two:switchFragment(mContent, fragments.get(1), 1);break;case R.id.home_tab_one:switchFragment(mContent, fragments.get(0), 0);break;}}}以上就是activity中的代码了!如有不足和错误,希望各位大神多多指教留言! Fragment的强大是毋庸置疑的,现在是越来越喜欢使用它了,但是使用中我也是头疼了好一阵,各种小bug层出,记录一下: 我们使用Fragment去填充布局的时候,是有两种方法可以实现的:一种是使用fragment的管理器的replace()方法,另一种就是使用hide()和show()方法对Fragment显示隐藏。很明显replace()方法就是不断的替换覆盖当前布局,每一次的replace()都会重新实例化一个Fragment,这种方法适合所销毁的Fragment不需要我们保存状态,每次都需要重新加载的,但是有时是不想不断的去实例化Fragment的这样也是比较耗时的(尤其是在网络较差时),而且很多时候业务上要求也不是要实时刷新数据的,这时候就要使用这hide和收尾方法了,不去每次都new一个Fragment。 之前我有写过hide和show方法(http://blog.csdn.NET/my_jack/article/details/52934447),可以去看一下。 当我使用hide和show方法的时候遇见了问题了,当我的三个Fragment A , B , C都实例化之后,我在B界面显示的时候,点击B界面会执行C界面的点击事件。当时真的是下了我这一下,好诡异啊。不断测试一下,发现当B界面没有了点击事件设置时会发生这种点击穿透布局的事件。应该是宿主保存了各个Fragment的状态了,所以在需要的Fragment中重写一下onSaveInstaceState方法就可以了: @Override protected void onSaveInstanceState(Bundle outState) { //阻止activity保存fragment的状态 //super.onSaveInstanceState(outState); }
相关文章推荐
- Fragment的相关用法第四篇(张鸿洋)
- Fragment的相关用法第一篇
- Fragment的相关用法第三篇(张鸿洋)
- ResultSet 对象getTables()的用法 获取表的相关信息
- MySQL 乱码问题相关资料汇集 - 第二篇文章:MySQL 4.1 中文乱码的问题
- javascritp实现input输入框相关限制用法
- 介绍 Struts 中 Html 标签库 的用法(第二组标签,与Form相关的标签 )
- ShellExecute函数相关用法
- 只介绍 Struts 中 Html 标签库 的用法(第二组标签,与Form相关的标签 )
- 超链接相关用法集
- throw on相关词组和用法
- 函数指针的相关用法
- linux正则表达式sed相关用法介绍
- CreateEvent/OpenEvent/SetEvent/ResetEvent/WaitForSingleObject 相关用法说明
- ExitWindowsEx()函数的相关用法
- volatile用法的相关文章(转)
- ASSERT的一些相关用法
- 显示当前相关时间的用法DateFormat
- FTP command相关用法
- 常用的DOS命令以及相关用法 && secureCRT终端多颜色 && DiskGenius基础用法 && Total Recorde录制电脑声音