Android肝帝战纪之Fragmentation的使用(单Activity+多Fragment设计)

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

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

  • Fragmentation的Github链接
    点此链接到Github

  • 导入依赖
// 在App级别的gradle中引入Fragment依赖
api 'me.yokeyword:fragmentation:1.2.7'
api 'me.yokeyword:fragmentation-swipeback:1.2.7'
  • 封装BaseFragment
    自定义BaseFragment继承自Fragmentation提供的SwipeBackFragment
    将BaseFragment改为抽象类,在具体业务中定义具体的页面Fragment时就继承这个类,实现它的抽象方法,传入布局,绑定视图。
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;
	}
}
  • 封装ProxyActivity
    自定义ProxyActivity继承自Fragmentation提供的SupportActivity
    同样也是抽象类,用来绑定自定义的Fragement到界面上
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();
    }
}
  • 定义具体的MyFragment继承自BaseFragment
public class MyFragment extends BaseFragment{
	@override
	public Object setLayout(){
		return R.layout.fragment_my;
	}
	
	@override
	public void onBindView(@Nullable Bundle savedInstanceState, View rootView){
		
	}
}
  • 把定义的MyFragment嵌入唯一的MyActivity实例
public class MyActivity extends ProxyActivity{
	@override
	public BaseFragment setRootFragment(){
		return new MyFragment();
	}
}
  • 其中Fragmentation中提供的跳转方法

装载根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)
  • 小结
    这样就可以定义多个自己业务的Fragment继承自BaseFragment,然后调用Fragmentation提供的方法,在唯一的实例Activity中进行跳转。
    根据慕课网课程总结得之

  • 基于这个框架的仿电商导航栏,多Fragment切换
    点此链接到下一篇文章

你可能感兴趣的:(Android肝帝战纪之Fragmentation的使用(单Activity+多Fragment设计))