Android 頁面跳轉 PageRouter

項目 demo 地址 用apt 實現歡迎 star issues

註解 @Route @Args
不用關心所跳轉頁面所需參數,BundleBuilder 會根據 @Args 獲取變量名並自動生成 set 方法,輸入 Test1ActivityBundle.Builder(). 後會提示出頁面參數,省了擼代碼找參數的時間

調用
PageRouter
          .of(this)
          .path(Constants.RouterPath.TEST2)
          .navigation();
PageRouter
          .of(this)
          .path(Constants.RouterPath.TEST1)
          .setParams(new Test1ActivityBundle.Builder()
                            .setName('z')
                            .setMoney(50000)
                            .setBeanS(new SerializableBean("SerializableBean"))
                            .setBeanP(new ParcelableBean("ParcelableBean"))
                            .setStringArrayList(as)
                            .setIntegerArrayList(ai)
                            .setBm(bm)
                            .setMsg("Welcome2Test1Activity")
                            .bundle())
          .setUri(Uri.parse(""))
          .navigation();
註解及其使用
@Route(path = Constants.RouterPath.TEST1)
public class Test1Activity extends AppCompatActivity {
    @Args
    public String msg;
    @Args
    public Character name;
    @Args
    public double money;
    @Args
    public SerializableBean beanS;
    @Args
    public ParcelableBean beanP;
    @Args
    public Bitmap bm;
    @Args
    public ArrayList<String> stringArrayList;
    @Args
    public ArrayList<Integer> integerArrayList;
...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_1);
        // 引入
        BundleService.bind(this);

demo gif :
router.gif

原理:(都在生成的文件下)
也就是大家熟悉的 apt 技術了
生產的代碼 segment 如下 ?
RouterDispatcher.java
naviagtion() 方法 會調用 go() 方法

public static void go(Context ctx,String path,Bundle extras, Uri uri){ 
        if(ctx==null)return;
        Intent intent = null;
        switch (path){
            case "Test2Activity":
               intent = new Intent(ctx, Test2Activity.class);
            break;
            case "Test1Activity":
               intent = new Intent(ctx, Test1Activity.class);
            break;

        }
        if (intent == null) return;
        if (extras != null) {
            intent.putExtras(extras);
        }
        if (!(ctx instanceof Activity)) {
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }
        if (uri != null){
            intent.setData(uri);
        }
        ctx.startActivity(intent);

    }

Test1ActivityBundle.java
BundleService.bind 會調用 bind 方法

... 省略部分代碼
public Test1ActivityBundle.Builder setMsg(java.lang.String msg){
    args.putString("msg",msg);
    return this;
}
public Test1ActivityBundle.Builder setName(java.lang.Character name){
    args.putChar("name",name);
    return this;
}
... 省略部分代碼
public static void bind(Test1Activity target) {
        Intent intent = target.getIntent();
        if (intent==null)return;
        Bundle source = intent.getExtras();
        if (source==null)return;
        if (source.containsKey("msg")) {
            target.msg = (java.lang.String) source.getString("msg");
        } else {
            throw new IllegalStateException("msg is required, but not found in the bundle.");
        }
        if (source.containsKey("name")) {
            target.name = (java.lang.Character) source.getChar("name");
        } else {
            throw new IllegalStateException("name is required, but not found in the bundle.");
        }
... 省略部分代碼
發佈了28 篇原創文章 · 獲贊 22 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章