a3349384 / FragmentLauncher

简化Fragment参数传递和解析

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

引入依赖

implementation 'cn.zmy:fragmentlauncher-library:1.5.0'
annatationProcessor 'cn.zmy:fragmentlauncher-compiler:1.5.0'

初始化

FragmentLauncher.init(new AbsFragmentLaunchHandler()
{
    @Override
    protected Class<? extends Activity> getDefaultActivityClass()
    {
        //返回一个默认的Activity类,用于装载Fragment
        //这个Activity可以继承自`cn.zmy.fragmentlauncher.impl.AbsFragmentLauncherActivity`
    }
});

添加注解

在Fragment上标注@Launch注解。

@Launch(name = "startToTest")
public class TestFragment extends Fragment
{
    ...
}

Build之后,会生成一个cn.zmy.fragmentlauncher.Launcher类,Launcher类中包含一个以@Launchname参数指定的名称的方法:

package cn.zmy.fragmentlauncher;

public final class Launcher {
  public static void startToTest(Context context) {
      ...
  }
}

如果此Fragment需要参数启动,可以通过标注@Arg或者@ArrayListArg注解指定。

@Launch(name = "startToTest")
@Arg(name = "parcelableArrayArg", type = Parcelable[].class)
@ArrayListArg(name = "intArrayListArg", type = Integer.class)
public class TestFragment extends Fragment
{
    ...
}

@Arg注解主要用于int、long、double等8种Java基本类型以及相关数组类型和Parcelable类型等。

@ArrayListArg主要用于ArrayList类型,如ArrayList.

Build之后,生成的方法如下:

public static void startToTest(Context context, Parcelable[] parcelableArrayArg,
    ArrayList<Integer> intArrayListArg) {
    ...
}

现在,如果需要启动TestFragment,只需要调用Launcher#startToTest方法。

如何在Fragment中获取参数

每一个标注了@Arg或者@ArrayListArg注解的Fragment,都会自动生成一个辅助类用于解析传递给Fragment的参数。辅助类的名称为Fragment的名称+Arguments。 比如上面的TestFragment,生成的辅助类就是TestFragmentArguments。

使用参数类之前,需要先初始化:

//Fragment#onCreate
@Override
public void onCreate(Bundle savedInstanceState)
{
    TestFragmentArguments.instance.init(getArguments());
}

获取参数:

Parcelable[] parcelables = TestFragmentArguments.instance.parcelableArrayArg();
ArrayList<Integer> intArrayList = TestFragmentArguments.instance.intArrayListArg();

startForResult支持

如果某个Fragment需要以startForResult方式启动,可以通过@Launch注解的参数forResult指定:

@Launch(name = "startToTest", forResult = true)
public class TestFragment extends Fragment
{
    ...
}

Build之后会生成如下方法:

public static void startToTestForResult(Object fragmentOrActivity, int requestCode) {
    ...
}

fragmentOrActivity参数可以传递Activity的实例,也可以传递Fragment(android.app.Fragment、android.support.v4.app.Fragment均支持)的实例。

传递Activity实例,则在Activity中接收结果。

传递Fragment实例,则在Fragment中接收结果。

最后

目前,FragmentLauncher支持除SparseArray<? extends Parcelable>类型之外的所有其他类型的参数。

About

简化Fragment参数传递和解析


Languages

Language:Java 99.7%Language:Batchfile 0.3%