继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

android开发:如何正确使用fragment

慕码人3916992
关注TA
已关注
手记 98
粉丝 81
获赞 3602
最近在重构dileber android框架,为了更好的适应新时代的手机,新出的框架,最低支持android 4.0版本。框架也采用gradle。基本的方法都和之前的框架有了很大不同。增加了很多实用的工具类。
 今天不对框架的功能做讲解(后续完成框架再进行讲解)。主要是对fragment的正确使用来讲解:

新框架地址ndileber框架
今天主要使用到的是框架中的一个工具类,底部菜单导航栏。
效果特写:图片描述

菜单的源码在这里菜单源码

下面我就开始在activity中使用这个菜单了。
首先activity 继承baseActivity

之后我便在oncreate 方法中写代码了。
如下

    private List<Fragment> list = new ArrayList<>();
BottomBar mBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_home);
        mBar= getView(R.id.bar);
        //由于我采用字体图标库,实际上R.string.home2就是上图中的小房子图标,字体图标库,参照这篇文章[字体图标讲解](http://www.imooc.com/article/4729 "字体图标讲解") 新框架与旧框架用法相同
        mBar.addItem(new BottomBarTab(this,R.string.home2,BottomBarTab.TYPE_FONT)).
                addItem(new BottomBarTab(this,R.string.bubbles,BottomBarTab.TYPE_FONT)).
                addItem(new BottomBarTab(this,R.string.newspaper,BottomBarTab.TYPE_FONT)).
                addItem(new BottomBarTab(this,R.string.cogs,BottomBarTab.TYPE_FONT));

        mBar.setOnClickItemMenu(new BottomBar.OnClickItemMenu() {
            @Override
            public void onClickItem(int nowPosition,int position) {
                switchContent(list.get(nowPosition),list.get(position));
            }
        });

        addMenu(savedInstanceState);

    }

addmenu是方法的关键,上面只是阐述菜单的生成,不多做讲解:

private void addMenu(Bundle savedInstanceState){
        HomeItemFragment homeItemFragment = ActivityUtils.getFragment(getSupportFragmentManager(),R.id.homeFrame,HomeItemFragment.newInstance(3));
        MessageFragment messageFragment = ActivityUtils.getFragment(getSupportFragmentManager(),R.id.messageFrame,MessageFragment.newInstance("1","2"));
        ConsultFragment consultFragment = ActivityUtils.getFragment(getSupportFragmentManager(),R.id.consultFrame,ConsultFragment.newInstance("2","3"));
        SettingFragment settingFragment = ActivityUtils.getFragment(getSupportFragmentManager(),R.id.settingFrame,SettingFragment.newInstance("4","5"));

        list.add(homeItemFragment);
        list.add(messageFragment);
        list.add(consultFragment);
        list.add(settingFragment);

        FragmentTransaction transaction =  getSupportFragmentManager().beginTransaction();
        transaction.hide(messageFragment).hide(consultFragment).hide(settingFragment).commit();

        if(savedInstanceState!=null){
            mBar.setCurrentItem(savedInstanceState.getInt(SELECT));
        }

    }

addMenu中用到了activityutil类,这个是获取fragment的关键方法:
activityUtils
方法解释如下:

//首先对fragment进行判空,就不解释了,之后先对fragment判断是否存在,如果存在的话就进行复用,(你可能有如下问题:为什么呢?明明写到oncreate中,为什么还要判断呢?)。比如说当前页面进行屏幕横竖操作,这时候就发生了一点问题,fragment重叠了(oncreate执行了,原来拥有的fragment依然存在),所以会出现重叠现象。我在看别人博客的时候发现有很多的博客写的有问题,有些博客甚至去修改onSaveInstanceState和onRestoreInstanceState方法,写法并不是很完美。我如下的写法,一方面是可以解决重叠问题,另一方面构建出的工具类可以直接在代码中使用~

public static <T extends Fragment>T getFragment(@NonNull FragmentManager fragmentManager,@NonNull int fragmentId,@NonNull T myFragment){
        Check.checkNotNull(fragmentManager);
        Check.checkNotNull(fragmentId);
        Check.checkNotNull(myFragment);
        T fragment = (T)fragmentManager.findFragmentById(fragmentId);
        if (fragment == null) {
            fragment = myFragment;
            addFragmentToActivity(fragmentManager, fragment,fragmentId);
        }
        return fragment;
    }

切换菜单的方法

    public void switchContent(Fragment from, Fragment to) {
            FragmentTransaction transaction =  getSupportFragmentManager().beginTransaction();
            transaction.hide(from).show(to).commit(); // 隐藏当前的fragment,显示下一个
    }

上面是一个menu的创建与使用方法,目前我在开发一个项目,去整合框架中的使用例子。后期会把源码放在我的github上项目例子

打开App,阅读手记
8人推荐
发表评论
随时随地看视频慕课网APP

热门评论

赞自己       

很有用,收藏啦,谢谢

查看全部评论