一 使用注解实现多个Fragment的管理与切换功能,类似通用搜索,关于注解的基本原理和机制网上一堆,这里不赘述了,只简单介绍一下几个常用注释
@Documented -表示是否将注解信息添加在java文档中。
@Retention -定义该注解的生命周期。
@Target -表示该注解用于什么地方。如果不明确指出,该注解可以放在任何地方。以下是一些可用的参数。需要说明的是:属性的注解是兼容的,如果你想给7个属性都添加注解,
ElementType.TYPE:用于描述类、接口或enum声明
ElementType.FIELD:用于描述实例变量
ElementType.METHOD
ElementType.PARAMETER
ElementType.CONSTRUCTOR
ElementType.LOCAL_VARIABLE
ElementType.ANNOTATION_TYPE 另一个注释
ElementType.PACKAGE 用于记录java文件的package信息
@Inherited -定义该注释和子类的关系
二 定义注解类
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Search { SearchEnum searchenum() default SearchEnum.DEFAULT; }
三 定义多个fragment的枚举类
DEFAULT(PyqFragment.class, SearchConstant.DEFAULT, "默认fragment"), PYQ(PyqFragment.class, SearchConstant.PYQ, "朋友圈"), GZH(GzhFragment.class, SearchConstant.GZH, "公众号"), XCX(XcxFragment.class, SearchConstant.XCX, "小程序"), SPH(SphFragment.class, SearchConstant.SPH, "视频号");
四 定义注解管理类
public SearchEnum getSearchEnum(String type) { //获取所有的枚举类型 for (int i = 0; i < SearchEnum.values().length; i++) { //获取所有枚举的class Class<?> fragmentClass = SearchEnum.values()[i].getClazz(); //获取每个class的注解 Search annotation = fragmentClass.getAnnotation(Search.class); //判断是否相等 是则讲当前枚举返回 if (annotation != null && annotation.searchenum().type.equals(type)) { return annotation.searchenum(); } } return null; }
五 调用实现fragment之间的切换
//根据type获取到对应的class SearchEnum searchEnum = SearchAnnotationManager.getInstance().getSearchEnum(type); if (searchEnum != null) { try { Fragment fragment = FragmentUtils.findFragment(getSupportFragmentManager(), searchEnum.getClazz()); if (fragment == null) { fragment = (Fragment) searchEnum.getClazz().newInstance(); FragmentUtils.addFragment(true, getSupportFragmentManager(), fragment, R.id.fragment); } FragmentUtils.hideAllShowFragment(true, fragment, getSupportFragmentManager()); } catch (IllegalAccessException | InstantiationException e) { e.printStackTrace(); } }