您的位置:首页 > 移动开发 > Android开发

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);    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android fragment