Coder Social home page Coder Social logo

xuexiangjys / xpage Goto Github PK

View Code? Open in Web Editor NEW
393.0 15.0 55.0 8.53 MB

🔥A very useful Fragment page framework!(一个非常方便实用的fragment页面框架!)

Home Page: https://xuexiangjys.github.io/XPage/

License: Apache License 2.0

Java 100.00%
fragments xpages gradle xui xaop x-library

xpage's Introduction

XPage

api I Star

一个非常方便的Fragment页面框架!还不赶紧点击使用说明文档,体验一下吧!

另外,你还可以参见XPage视频教程进行学习。

关于我

公众号 掘金 知乎 CSDN 简书 思否 哔哩哔哩 今日头条
我的Android开源之旅 点我 点我 点我 点我 点我 点我 点我

X系列库快速集成

为了方便大家快速集成X系列框架库,我提供了一个空壳模版供大家参考使用: https://github.com/xuexiangjys/TemplateAppProject

除此之外,我还特别制作了几期X系列视频教程供大家学习参考.


特征

  • 支持assets下“corepage.json”静态配置Fragment页面信息。
  • 支持Application中动态配置Fragment页面信息。
  • 支持通过注解@Page的方式动态自动配置页面信息。
  • 支持自定义Fragment页面信息配置。
  • 支持4种默认Fragment页面切换动画。
  • 支持Fragment页面间参数传递。
  • 支持Fragment页面属性保存。
  • 支持Fragment页面的onKeyDown、onFragmentResult等生命周期
  • 支持Fragment和Fragment页面自由跳转以及数据交互。
  • 支持导航栏通过注解的方式自动添加及设置。
  • 支持自定义TitleBar全局主题属性。
  • 支持自定义Fragment页面容器。
  • 支持自定义Activity页面容器。
  • 支持Fragment之间、activity和fragment之间的数据交互。
  • 兼容kotlin和androidx。

Star趋势图

Stargazers over time

1、演示(请star支持)

xpage.gif

Demo下载

downloads


2、如何使用

目前支持主流开发工具AndroidStudio的使用,直接配置build.gradle,增加依赖即可.

2.1、Android Studio导入方法,添加Gradle依赖

1.先在项目根目录的 build.gradlerepositories 添加:

allprojects {
     repositories {
        ...
        maven { url "https://jitpack.io" }
    }
}

2.然后在应用项目(一般是app)的 build.gradle 的 dependencies 添加:

以下是版本说明,选择一个即可。

  • androidx版本:3.0.0及以上
dependencies {
  ...
  // XPage
  implementation 'com.github.xuexiangjys.XPage:xpage-lib:3.4.0'
  annotationProcessor 'com.github.xuexiangjys.XPage:xpage-compiler:3.4.0'
}

【版本注意】3.3.0及以上版本去除了ButterKnife的依赖。

【升级注意】从 3.3.0以下 升级到 3.4.0及以上:

    @Deprecated
    protected abstract View inflateView(LayoutInflater inflater, ViewGroup container);

------> 替换为

    protected abstract View onCreateContentView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, boolean attachToRoot);
  • support版本:2.3.0及以下
dependencies {
  ...
  // XPage
  implementation 'com.github.xuexiangjys.XPage:xpage-lib:2.3.0'
  annotationProcessor 'com.github.xuexiangjys.XPage:xpage-compiler:2.3.0'
  // ButterKnife的sdk
  implementation 'com.jakewharton:butterknife:8.4.0'
  annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
}

【注意】如果你使用的是kotlin,请使用如下配置:

apply plugin: 'kotlin-kapt'

dependencies {
  ...
  //XPage
  implementation 'com.github.xuexiangjys.XPage:xpage-lib:3.4.0'
  kapt 'com.github.xuexiangjys.XPage:xpage-compiler:3.4.0'
}

【注意】:如果你使用的module不止一个的话,每个module下都需要增加XPage的依赖。

3.进行moduleName注册

defaultConfig {
    ...

    javaCompileOptions {
        annotationProcessorOptions {
            arguments = [ moduleName : project.getName() ]
        }
    }
}

【注意】:如果不注册的话,默认ModuleName为app

2.2、页面注册

2.2.1、assets中静态注册

在assets文件夹中新建“corepage.json“,然后进行如下配置:

[
  {
    "name": "测试页面1",
    "classPath": "com.xuexiang.xpagedemo.fragment.TestFragment1",
    "params": ""
  },
  {
    "name": "测试页面2",
    "classPath": "com.xuexiang.xpagedemo.fragment.TestFragment2",
    "params": {
      "key1":"这是参数1的值",
      "key2":"这是参数2的值"
    }
  },
]

2.2.2、Application中动态注册【推荐】

1.自动进行页面注册【推荐】

使用apt编译时自动生成的页面注册配置类 "moduleName"+PageConfig 的getPages()进行注册。

PageConfig.getInstance()
//      //页面注册,默认不设置的话使用的就是自动注册
//      .setPageConfiguration(new AutoPageConfiguration())
        .debug("PageLog")       //开启调试
        .setContainActivityClazz(XPageActivity.class) //设置默认的容器Activity
        .init(this);            //初始化页面配置

【注意】:如果你的项目中只是增加了依赖,还没有使用@Page注解XPageFragment页面的话,在编译时是不会自动生成注册页面的!!

2.手动动态进行页面注册

PageConfig.getInstance()
        .setPageConfiguration(new PageConfiguration() { //页面注册
            @Override
            public List<PageInfo> registerPages(Context context) {
                List<PageInfo> pageInfos = new ArrayList<>();
                addPageInfoAndSubPages(pageInfos, MainFragment.class);
                pageInfos.add(PageConfig.getPageInfo(DateReceiveFragment.class));
                return pageInfos;        //手动注册页面
            }
        })
        .debug("PageLog")       //开启调试
        .init(this);            //初始化页面配置

2.3、使用PageOption进行页面操作【推荐】

使用PageOption.to进行页面选项构建。

PageOption.to(TestFragment.class) //跳转的fragment
    .setAnim(CoreAnim.zoom) //页面跳转动画
    .setRequestCode(100) //请求码,用于返回结果
    .setAddToBackStack(true) //是否加入堆栈
    .setNewActivity(true, ContainActivity.class) //是否使用新的Activity打开
    .putBoolean(DateReceiveFragment.KEY_IS_NEED_BACK, true) //传递的参数
    .open(this); //打开页面进行跳转

2.4、页面跳转

使用XPage,Activity必须要继承XPageActivity,Fragment必须要继承XPageFragment,否则将无法调用页面跳转的openPage方法。

2.4.1、携带数据

Bundle params = new Bundle();
switch(position) {
    case 0:
        params.putBoolean(DateReceiveFragment.KEY_IS_NEED_BACK, false);
        int id = (int) (Math.random() * 100);
        params.putString(DateReceiveFragment.KEY_EVENT_NAME, "事件" + id);
        params.putString(DateReceiveFragment.KEY_EVENT_DATA, "事件" + id + "携带的数据");
        openPage(DateReceiveFragment.class, params);
        break;
    case 1:
        params.putBoolean(DateReceiveFragment.KEY_IS_NEED_BACK, true);
        openPageForResult(DateReceiveFragment.class, params, 100);
        break;
    default:
        break;
}

2.4.2、页面切换动画

switch(position) {
    case 0:
        openPage(TestFragment.PAGE_NAME, null, CoreAnim.none);//没有动画
        break;
    case 1:
        openPage(TestFragment.PAGE_NAME, null, CoreAnim.present);//由下到上动画
        break;
    case 2:
        openPage(TestFragment.PAGE_NAME, null, CoreAnim.slide);//从左到右动画
        break;
    case 3:
        openPage(TestFragment.PAGE_NAME, null, CoreAnim.fade);//渐变
        break;
    case 4:
        openPage(TestFragment.PAGE_NAME, null, CoreAnim.zoom);//放大
        break;
    default:
        break;
}

2.5、TitleBar样式自定义

可以设置XPageTitleBarStyle主题样式来自定义标题栏的默认样式。

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/xpage_default_actionbar_color</item>
    <item name="colorPrimaryDark">@color/xpage_default_actionbar_color</item>
    <item name="colorAccent">@color/xpage_default_actionbar_color</item>

    <!--标题栏的背景图片,优先使用背景图片,没有背景图片才使用背景颜色,可选-->
    <item name="xpage_actionbar_background">@null</item>
    <!--标题栏的背景颜色-->
    <item name="xpage_actionbar_color">@color/xpage_default_actionbar_color</item>
    <!--是否支持沉浸式标题栏, 默认false-->
    <item name="xpage_actionbar_immersive">false</item>
    <!--标题栏返回箭头, 默认R.drawable.xpage_ic_navigation_back_white-->
    <item name="xpage_actionbar_navigation_back">@drawable/xpage_ic_navigation_back_white</item>
    <!--标题栏的高度,默认52dp-->
    <item name="xpage_actionbar_height">60dp</item>
    <!--标题栏标题文字的大小,默认18sp-->
    <item name="xpage_actionbar_title_text_size">21sp</item>
    <!--标题栏副标题文字的大小,默认12sp-->
    <item name="xpage_actionbar_sub_text_size">14sp</item>
    <!--标题栏动作文字的大小,默认15sp-->
    <item name="xpage_actionbar_action_text_size">18sp</item>
    <!--标题栏动作图片的padding,默认5dp-->
    <item name="xpage_actionbar_action_padding">6dp</item>
    <!--标题栏两侧文字的padding,默认14dp-->
    <item name="xpage_actionbar_side_text_padding">16dp</item>
    
    <item name="XPageTitleBarStyle">@style/XPageTitleBar.Custom</item>
</style>

<style name="XPageTitleBar.Custom">
    <item name="tb_immersive">false</item>
    <item name="tb_centerGravity">center</item>
</style>

2.6、利用XPage来写程序的Tab主页

详细可参见BottomNavigationViewFragment

就像正常使用ViewPager加载Fragment那样。但是这里需要注意的两点是:

  • 由于使用ViewPager进行加载,而非XPage,因此Fragment的initTitleBar方法需要被覆盖。
@Override
protected TitleBar initTitleBar() {
    //不使用@Page标注的一定要注意覆盖这个方法
    return null;
}
  • 由于为了新开页面不影响Tab主页当前容器的状态,需要在打开新页面的使用设置使用新容器。
PageOption.to(TestFragment.class)
        //新建一个容器,以不影响当前容器
        .setNewActivity(true)
        .open(this);

2.7、复杂Activity界面容器的自定义

详细可参见ComplexActivity

1.自定义页面容器的布局,在布局中一定要包含idfragment_container

<FrameLayout
    android:id="@id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="400dp">
</FrameLayout>

2.在XPageActivity中设置页面容器的自定义布局

@Override
protected View getCustomRootView() {
    binding = ActivityComplexBinding.inflate(getLayoutInflater());
    return binding.getRoot();
}

3.使用changePage方法切换Fragment。

changePage(TestFragment.PAGE_NAME, null, CoreAnim.none);

【注意】在切换Fragment的时候,fragment并不会走onResume和onPause生命周期,建议使用onHiddenChanged代替。

4.使用getPage方法获取指定的Fragment,就可以获取该fragment页面中的数据。

TabAFragment tabAFragment = getPage(TabAFragment.class);
if (tabAFragment != null) {
    ToastUtils.toast(tabAFragment.getData());
} else {
    ToastUtils.toast("页面还未加载!");
}

混淆配置

  • 3.2.0及以上版本,使用的是gson进行序列化的,所以配置如下:
# gson
-keepattributes Signature
-keepattributes *Annotation*
-dontwarn sun.misc.**
-keep class com.google.gson.examples.android.model.** { <fields>; }
-keep class * extends com.google.gson.TypeAdapter
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
-keepclassmembers,allowobfuscation class * {
  @com.google.gson.annotations.SerializedName <fields>;
}
-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken
-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken

# xpage
-keep class com.xuexiang.xpage.annotation.** { *; }
-keep class com.xuexiang.xpage.config.** { *; }
  • 3.1.1及以下版本,使用的是fastjson进行序列化的,所以配置如下:
# fastjson
-dontwarn com.alibaba.fastjson.**
-keep class com.alibaba.fastjson.** { *; }
-keepattributes Signature

# xpage
-keep class com.xuexiang.xpage.annotation.** { *; }
-keep class com.xuexiang.xpage.config.** { *; }

特别感谢

https://github.com/lizhangqu/CorePage/

如果觉得项目还不错,可以考虑打赏一波

你的打赏是我维护的动力,我将会列出所有打赏人员的清单在下方作为凭证,打赏前请留下打赏项目的备注!

pay.png

联系方式

xpage's People

Contributors

xuexiangjys avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

xpage's Issues

编译出现资源链接错误导致编译失败

编译出现以下错误
AAPT: D:\AndroidProjects\demo\app\build\intermediates\incremental\mergeDebugResources\merged.dir\values\values.xml:10961: error: resource attr/xui_orientation (aka com.anbuqi.app:attr/xui_orientation) not found.
error: failed linking references.

Fragment跳转报错

image
在进行Fragment的跳转是发生了这个错误?不知道啥原因,我猜想是主容器的问题,于是我换了容器,但是还是报错
image

我服了,我个 DialogFragment 都需要添加 @Page() 注解,这库真完蛋

我随便写个Fragment 都需要加这个注解,不加就崩溃,真行啊,跳转不了就跳转不了呗,打个日志就得了呗,凭啥让我所有的 Fragment 都加这个注解?不觉得管的太宽了吗?这是一个正经的第三方库该管的事吗?现在好了,这项目不用这个库都不行了,我是真服气

xpage 的onPause() 方法为什么没有走到呢?

我引入百度地图放到fragment中,其中生命周期onPause()方法没有走到,现在地图首次打开没有问题,切换页面后地图无法缩放移动等,打印日志后看到onPause()方法没有走,请帮我看看,谢谢!

直接复制下来的代码报的错。

直接复制下来的代码报的错。

        PageConfig.getInstance() //      //页面注册,默认不设置的话使用的就是自动注册
            //      .setPageConfiguration(new AutoPageConfiguration())
            .debug("PageLog") //开启调试
            .setContainActivityClazz(XBaseKoinActivity::class.java) //设置默认的容器Activity
            .init(this) //初始化页面配置
ava.lang.NoClassDefFoundError: Failed resolution of: Lcom/squareup/leakcanary/LeakCanary;
        at com.xuexiang.xpage.PageConfig.initCanary(PageConfig.java:119)
        at com.xuexiang.xpage.PageConfig.init(PageConfig.java:85)
        at com.freenft.hdwallet.App.onCreate(App.kt:75)
        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1190)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6582)
        at android.app.ActivityThread.access$1400(ActivityThread.java:224)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1887)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7562)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "com.squareup.leakcanary.LeakCanary" on path: DexPathList[[zip file "/data/app/com.freenft.hdwallet-9UBlbufQcGIs09mKhaTL1g==/base.apk"],nativeLibraryDirectories=[/data/app/com.freenft.hdwallet-9UBlbufQcGIs09mKhaTL1g==/lib/arm, /data/app/com.freenft.hdwallet-9UBlbufQcGIs09mKhaTL1g==/base.apk!/lib/armeabi-v7a, /system/lib, /system/product/lib]]

java.lang.NoClassDefFoundError: Failed resolution of: Lcom/squareup/leakcanary/LeakCanary;

直接复制下来的代码报的错。

        PageConfig.getInstance() //      //页面注册,默认不设置的话使用的就是自动注册
            //      .setPageConfiguration(new AutoPageConfiguration())
            .debug("PageLog") //开启调试
            .setContainActivityClazz(XBaseKoinActivity::class.java) //设置默认的容器Activity
            .init(this) //初始化页面配置
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/squareup/leakcanary/LeakCanary;
        at com.xuexiang.xpage.PageConfig.initCanary(PageConfig.java:119)
    java.lang.NoClassDefFoundError: Failed resolution of: Lcom/squareup/leakcanary/LeakCanary;
        at com.xuexiang.xpage.PageConfig.init(PageConfig.java:85)
        at com.xuexiang.xpage.PageConfig.initCanary(PageConfig.java:119)
        at com.freenft.hdwallet.App.onCreate(App.kt:75)
        at com.xuexiang.xpage.PageConfig.init(PageConfig.java:85)
        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1190)
        at com.freenft.hdwallet.App.onCreate(App.kt:75)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6582)
        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1190)
        at android.app.ActivityThread.access$1400(ActivityThread.java:224)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6582)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1887)
        at android.app.ActivityThread.access$1400(ActivityThread.java:224)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1887)
        at android.os.Looper.loop(Looper.java:223)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.app.ActivityThread.main(ActivityThread.java:7562)
        at android.os.Looper.loop(Looper.java:223)
        at java.lang.reflect.Method.invoke(Native Method)
        at android.app.ActivityThread.main(ActivityThread.java:7562)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)

openPage无效

您好!我openPage不知道为什么没有反应。BaseActivity extends XPageActivity
public class MainActivity extends BaseActivity implements ClickUtils.OnClick2ExitListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    openPage(MainFragment.class,getIntent().getExtras());

}

是否可以在栈内获取到 其它 fragment 对象使用?

在使用中发现,很多时候需要在同级别Fragment中 如何去获取其它的fragment对象使用?
只能通过获取当前Fragment所 Attach 的宿主 Activity 再去getPage() 依次按层级获取么?

我的层级是

MainActivity内
     MainViewPagerFragment 
             --> A1Fragment     
                     ---> 打开了Test3Fragment (页面中要获取A1Fragment对象的情况,可否直接有方法拿到栈内其它对象)
             --> B2Fragment

是否可以像 Fragmention 那样有获取同级别栈内的fragment 对象?

在跳转的时候设置addToBackStack=false不添加到用户操作栈中

在跳转的时候设置addToBackStack=false不添加到用户操作栈中,我在多次跳转的后,点击返回,发现onDestroy()方法走了多次,感觉是每次跳转都是创建了个新fragment,请问可不可以,在创建新fragment时候销毁之前的fragment,而不单单是不加入操作栈

页面名重复导致显示错乱

问题:目前我在使用的过程中遇到有不同路径下存在相同的fragment类名,但是自动生成的pageinfo的name值相同,然后通过openNewPage传入页面名时,实际是那个页面名排在前面就会显示哪个,这样就会存在实际显示与预期不一致的可能。

解决办法1:手动注解不同的名字以区分,但实际基本都是自动生成(即类名),不太喜欢另行配置。
解决办法2:将相同类名的其中一个或多个改成不同,但android开发这种情况大量存在,无法避免,也不建议这样限制。

个人建议:是否可以将页面名匹配fragment改成类路径去匹配,这样每一个类就是唯一的,你内部逻辑改起来也简单些。

个人微信号:18674017630,如有需要,欢迎加微信细聊!

怎么判断当前fragment是否在栈顶?

RT
栈里面有两个name一样的Fragment,一个是详情页一个是编辑页,我共用的同一个Fragment。
现在有个消息一发送两个界面都收到了消息,我想在当前页面只收到一次消息,需要判断当前Fragment是否是在栈顶,通过name去查找好像不行,换句话说就是得找到栈顶Fragment的实例,比较当前Fragment的实例是否相等。
该如何判断?

报错[PageLog]: [resolveActivity failed]: android.intent.action.GET_CONTENT do not register in manifest

我在写一个富文本编辑器的activity,继承自BaseActivity,其中在点击插入图片时我看logcat报错是[PageLog]: [resolveActivity failed]: android.intent.action.GET_CONTENT do not register in manifest,不知如何解决。。

插入图片相关代码如下

  public void insertImg(View v) {
    if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED) {
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, WRITE_EXTERNAL_STORAGE_REQUEST_CODE);
    }

    Intent getImage = new Intent(Intent.ACTION_GET_CONTENT);
    getImage.addCategory(Intent.CATEGORY_OPENABLE);
    getImage.setType("image/*");
    startActivityForResult(getImage, REQUEST_CODE_GET_CONTENT);
  }

可以考虑 移除 XPageFragment 中的 ButterKnife

onCreateView 强迫症看到黄油刀,趋势来看 AS 不建议使用黄油刀,可以考虑 移除 ,推荐使用 DataBinding 方式 更为舒适 哈哈,个人见解。当然很多老项目,都是黄油刀,懒得修改。最新新项目正在筹备使用阁下一系列的优秀库 good

在lib中R取值问题

@page在app模块中不存在问题,如果在lib中使用,由于生成的R是静态变量,不能直接使用,参考butterknife中的R2复制一份R.
但只能保证在该模块中相同,与app中的并不一定相同,这里我借鉴了butterKnife 中的方法,通过jct来替换R.

 private Id elementToId(Element element, Class<Page> annotation, int value) {
        JCTree tree = (JCTree) trees.getTree(element, getMirror(element, annotation));
        if (tree != null) { // tree can be null if the references are compiled types and not source
            rScanner.reset();
            tree.accept(rScanner);
            if (!rScanner.resourceIds.isEmpty()) {
                return rScanner.resourceIds.values().iterator().next();
            }
        }
        return new Id(value);
    } 

然后通过该方法拿到R

                    Page page = element.getAnnotation(Page.class);
                    name = StringUtils.isEmpty(page.name()) ? element.getSimpleName().toString() : page.name();
                    extra = page.extra();
                    Id id = elementToId(element, Page.class, extra);

最后在创建的时候替换即可:

                    constructorBuilder.addStatement("mPages.add(new $T($S, $S, $S, $T.$L, $L))",
                            PageInfo.class,
                            name,
                            tm.toString(),
                            PageInfo.getParams(page.params()),
                            ClassName.get(CoreAnim.class),
                            page.anim(),
                            code);

暂时只找到这一中方法,如有更好的方法,请作者大大分享一下。

1个Activity内有两个或多个fragment占位怎么办?

你好,我现在是在一个Activity内需要放两种fragment,但显示时候在某一时刻只能显示其中一种,因为他们所占位置不一样,不知道有没有说明白我的问题,两种fragment的id该如何配呢?请问有办法解决么?

startActivityForResult有问题

不明白你为什么要加 if (this.getPackageManager().resolveActivity(intent, 65536) != null) 判断,这样会导致调用系统的activity时出问题

@Page(name = "xxxx")

当前界面标题和跳转的页面标题一样
不能跳转下一个界面 ???
一直重复打开当前页面。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.