Android开发知识小集android开发技巧Android 开发

Android战纪之Fragmentation的使用(单Acti

2018-03-30  本文已影响474人  warmingood

单Activity+多Fragment设计(Fragmentation的使用)


本文介绍使用Fragmentation库打造单Activity+多Fragment的App基础架构:
Fragmentation库提供了SupportActivity和SupportFragment两个基础类,通过分别继承这两个类,实现自己的业务。


// 在App级别的gradle中引入Fragment依赖
api 'me.yokeyword:fragmentation:1.2.7'
api 'me.yokeyword:fragmentation-swipeback:1.2.7'
public abstract class BaseFragment extends SwipeBackFragment{
    // 需要实现的设置layout的抽象方法
    public abstract setLayout();
    // 需要实现的绑定完界面之后的操作方法
    public abstract onBindView(@Nullable Bundle savedInstanceState, View rootView);
    
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState){
        View rootView = null;
        if (setLayout() instanceof Integer){
            rootView = inflater.inflate((Integer)setLayout(), container, false);    
        }else if(setLayout() instanceof View){
            rootView = (View)setLayout();
        }else{
            throw new ClassCastException("type must be int or view");
        }
        onBindView(@Nullable savedInstanceState, View rootView);
    }
    // 返回唯一的Activity实例
    public final ProxyActivity getProxyActivity(){
        return (ProxyActivity)_mActivity;
    }
}
public abstract class ProxyActivity extends SupportActivity{
    // 需要实现的设置Fragment的方法
    public abstract BaseFragment setRootFragment();

    @override
    protected void onCreate(@Nullable Bundle saveInstanceState){
        super.onCreate(saveInstanceState);
        initContainer(saveInstanceState);
    }
    
    private void initContainer(@Nullable Bundle saveInstanceState){
        final ContentFrameLayout container = new ContentFrameLayout(this);
        // id要在res/vlues定义一个资源文件ids,再定义一个id值
        container.setId(R.id.fragment_container);
        setContentView(container);
        if (saveInstancesState==null){
            // 框架提供的绑定Fragment到Framelayout的方法
            loadRootFragment(R.id.fragment_container, setRootFragment());
        }
    }
    
    // 释放一些资源
    @Override
    protected void onDestroy() {
        super.onDestroy();
        System.gc();
        System.runFinalization();
    }
}
public class MyFragment extends BaseFragment{
    @override
    public Object setLayout(){
        return R.layout.fragment_my;
    }
    
    @override
    public void onBindView(@Nullable Bundle savedInstanceState, View rootView){
        
    }
}
public class MyActivity extends ProxyActivity{
    @override
    public BaseFragment setRootFragment(){
        return new MyFragment();
    }
}

装载根Fragment,即Activity内的第一个Fragment

 loadRootFragment(int containerId, SupportFragment toFragment)

同级Fragment场景下的切换(类似底部导航栏之间切换Fragment)

showHideFragment(SupportFragment showFragment, SupportFragment hideFragment);

启动Fragment的方法

// 启动新的Fragment,启动者和被启动者是在同一个栈的
start(SupportFragment fragment)

// 以某种启动模式,启动新的Fragment
start(SupportFragment fragment, int launchMode)

// 启动新的Fragment,并能接收到新Fragment的数据返回
startForResult(SupportFragment fragment,int requestCode)

// 启动目标Fragment,并关闭当前Fragment
startWithPop(SupportFragment fragment)
上一篇下一篇

猜你喜欢

热点阅读