{"id":13490949,"url":"https://github.com/hss01248/PageStateManager","last_synced_at":"2025-03-28T07:31:39.491Z","repository":{"id":119093581,"uuid":"74579720","full_name":"hss01248/PageStateManager","owner":"hss01248","description":"manage the loading,emtpy,error state of page, use in xml or just in code","archived":false,"fork":false,"pushed_at":"2021-08-18T01:34:25.000Z","size":497,"stargazers_count":174,"open_issues_count":1,"forks_count":26,"subscribers_count":7,"default_branch":"master","last_synced_at":"2024-10-31T04:34:59.816Z","etag":null,"topics":["error-page","loading","loading-page","pagemanager","pager","state","status"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hss01248.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2016-11-23T13:33:00.000Z","updated_at":"2024-09-27T17:38:51.000Z","dependencies_parsed_at":null,"dependency_job_id":"16091298-6b87-4075-89ad-d5e82196e772","html_url":"https://github.com/hss01248/PageStateManager","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hss01248%2FPageStateManager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hss01248%2FPageStateManager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hss01248%2FPageStateManager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hss01248%2FPageStateManager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hss01248","download_url":"https://codeload.github.com/hss01248/PageStateManager/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245989167,"owners_count":20705774,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["error-page","loading","loading-page","pagemanager","pager","state","status"],"created_at":"2024-07-31T19:00:52.292Z","updated_at":"2025-03-28T07:31:39.475Z","avatar_url":"https://github.com/hss01248.png","language":"Java","readme":"# PageStateManager/StatefulFrameLayout\n页面状态管理\n\n[![](https://jitpack.io/v/hss01248/PageStateManager.svg)](https://jitpack.io/#hss01248/PageStateManager)\n\n在张鸿洋的[LoadingAndRetryManager](https://github.com/hongyangAndroid/LoadingAndRetryManager)的基础上改写,修正一些bug,优化api,并提供使用时封装的例子\n\n# 特性\n* api超级简单\n* 可以在xml中使用StatefulFrameLayout\n* 也可以不改动xml,直接在代码里使用PageStateManager\n* 错误页面和空白页面均提供了点击事件的回调,直接实现即可\n* 不改动framlayout本身任何属性,依然可以添加多个子view\n\n\n\n# 更新:fragment的操作改变了\n\n由于fragment的生命周期引起的bug,已取消原先直接传入fragment对象的方式.\n\n请改成传入组成fragment的view,注意该view对象传入时,其parent不能为空,也就是,该view不能是xml的根view,可以自己随便包一层.\n\nps.\n\n其实fragment本质也是基于view包裹了一层api,搞点生命周期之类的,api难用得要死,还一大堆坑,还不如自己包装一个view,自己加点生命周期,高度可控,减少bug.我的项目中从来都不用fragment,都是自己把view包装成各种page.\n\n# API\n\n\u003e 参考demo里的,自己封装一层(拷过去改一改)\n\n## 接口\n\n```\npublic interface IViewState {\n\n     void showLoading();\n     void showError(CharSequence msg);\n     void showContent();\n     void showEmpty();\n}\n```\n\n# 四个级别的配置\n\n### 库内默认\n\n自带Loading,Empty,Error的xml:\n\n```\npublic static int BASE_LOADING_LAYOUT_ID = R.layout.pager_loading;\npublic static int BASE_RETRY_LAYOUT_ID = R.layout.pager_error;\npublic static int BASE_EMPTY_LAYOUT_ID = R.layout.pager_empty;\n```\n\n## 使用时可全局配置\n\n在application的oncreate里调用:\n\n也就是修改上述的三个静态变量:\n\n```\nPageStateManager.initInAppOnCreate():\n```\n\n```\npublic static void initInApp(int layoutIdOfEmpty, int layoutIdOfLoading, int layoutIdOfError) {\n    if (layoutIdOfEmpty != 0) {\n        BASE_EMPTY_LAYOUT_ID = layoutIdOfEmpty;\n    }\n    if (layoutIdOfLoading != 0) {\n        BASE_LOADING_LAYOUT_ID = layoutIdOfLoading;\n    }\n    if (layoutIdOfError != 0) {\n        BASE_RETRY_LAYOUT_ID = layoutIdOfError;\n    }\n}\n```\n\n\n\n## 单个页面的配置:\n\n### 可配置的项目:\n\n// PageConfig为抽象类: \n\n仅一个必须实现的方法:\n\n\n    \n\n    public abstract class PageConfig {\n    \n    public abstract void onRetry(View retryView);//必须实现\n    \n    public void onEmtptyViewClicked(View emptyView) {\n        onRetry(emptyView);\n    }\n    \n    public boolean isFirstStateLoading(){\n        return true;\n    }\n    \n    public String emptyMsg(){\n        return \"\";\n    }\n    \n    public int customLoadingLayoutId() {\n        return PageStateManager.BASE_LOADING_LAYOUT_ID;\n    }\n    \n    public int customErrorLayoutId() {\n        return PageStateManager.BASE_RETRY_LAYOUT_ID;\n    }\n    \n    public int customEmptyLayoutId() {\n        return PageStateManager.BASE_EMPTY_LAYOUT_ID;\n    }\n### xml里使用statefulFrameLayout时:\n\n```\n\u003ccom.hss01248.pagestate.StatefulFrameLayout\n    android:id=\"@+id/pager\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\u003e\n    \u003cTextView\n        android:id=\"@+id/context\"\n        android:background=\"#ffff00\"\n        android:text=\"i am the content!!!!!!!!!!!!!!!!!!!!!!!!!!!\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"/\u003e\n    \u003cButton\n        android:layout_width=\"match_parent\"\n        android:id=\"@+id/btn\"\n        android:layout_marginTop=\"40dp\"\n        android:text=\"view2\"\n        android:layout_height=\"wrap_content\"/\u003e\n\u003c/com.hss01248.pagestate.StatefulFrameLayout\u003e\n```\n\n```\nstatefulFrameLayout.init(new PageConfig() {\n            @Override\n            public void onRetry(View retryView) {\n                doNet();\n            }\n        });\n        \n\n```\n\n### 或者使用PageStateManager:\n\n```\n\n /**\n     *\n     * @param container  必须为activity或者view.如果是view,则该view对象必须有parent\n     */\npageStateManager =   PageStateManager.initWhenUse(container,new MyPageConfig() {\n    @Override\n    protected void onReallyRetry() {\n        doNet();\n    }\n\n    @Override\n    public int customEmptyLayoutId() {\n        return R.layout.pager_empty_2;\n    }\n\n    @Override\n    public int customLoadingLayoutId() {\n        return R.layout.pager_loading_2;\n    }\n\n    @Override\n    public int customErrorLayoutId() {\n        return R.layout.pager_error_2;\n    }\n});\n```\n\n## 控制页面状态的api:\n\n```\npublic void showLoading()\npublic void showContent()\npublic void showEmpty()\npublic void showError(CharSequence errorMsg)\n```\n\n\n\n# demo中的默认的几个页面状态UI图\n\n \n\n ![loading](loading.jpg)\n\n![empty](empty.jpg)\n\n\n\n ![error](error.jpg)\n\n\n\n其中无网络时弹出dialog:\n\n ![error_dialog](error_dialog.jpg)\n\n无网络的对话框可以全局复写:\n\n```\nNoNetworkHelper.setShowDialogImpl(IShowDialog showDialog)\n\npublic interface IShowDialog{\n        void showNoNetWorkDlg(final Context context);\n    }\n    \n\n```\n\n# 使用\n\n## gradle\n\n**Step 1.** Add the JitPack repository to your build file\n\nAdd it in your root build.gradle at the end of repositories:\n\n```\n    allprojects {\n        repositories {\n            ...\n            maven { url \"https://jitpack.io\" }\n        }\n    }\n```\n\n**Step 2.** Add the dependency\n\n```\n    dependencies {\n            compile 'com.github.hss01248:PageStateManager:3.0.1'\n    }\n```\n\n\n\n## 示例代码(详见demo)\n\n## xml里不写StatefulFramelayout时:\n\n```\nprivate void initView() {\n        setContentView(R.layout.activity_main);\n        pageStateManager =   PageStateManager.initWhenUse(this,new PageConfig() {\n\n            @Override\n            public int customEmptyLayoutId() {\n                return R.layout.pager_empty_2;\n            }\n\n            @Override\n            public void onRetry(View retryView) {\n                doNet();\n            }\n\n            @Override\n            public int customLoadingLayoutId() {\n                return R.layout.pager_loading_2;\n            }\n\n            @Override\n            public int customErrorLayoutId() {\n                return R.layout.pager_error_2;\n            }\n        });\n\n    }\n\n    private void doNet() {\n        pageStateManager.showLoading();\n\n        new Handler().postDelayed(new Runnable() {\n            @Override\n            public void run() {\n                int  state = new Random().nextInt(3);\n                switch (state){\n                    case 0:\n                        pageStateManager.showError(\"稍候重试\");\n                        break;\n                    case 1:\n                        pageStateManager.showEmpty();\n                        break;\n                    case 2:\n                        pageStateManager.showContent();\n                }\n\n            }\n        },2000);\n    }\n```\n\n## 在xml里直接写时:\n\n```\n......\nstatefulFrameLayout = (StatefulFrameLayout)findViewById(R.id.pager);\n    statefulFrameLayout.init(new PageConfig() {\n        @Override\n        public void onRetry(View retryView) {\n            doNet();\n        }\n    });\n    doNet();\n}\n\n\n\nprivate void doNet() {\n    statefulFrameLayout.showLoading();\n\n    new Handler().postDelayed(new Runnable() {\n        @Override\n        public void run() {\n            int  state = new Random().nextInt(3);\n            switch (state){\n                case 0:\n                    statefulFrameLayout.showError(\"稍候重试222222\");\n                    break;\n                case 1:\n                    statefulFrameLayout.showEmpty();\n                    break;\n                case 2:\n                    statefulFrameLayout.showContent();\n            }\n\n        }\n    },2000);\n}\n```\n\n# 注意事项\n\n1.给view对象设置状态时,该对象必须有parent\n\n2.\n\n\n\n\n\n# blog\n\n[介绍一下页面状态管理类PageStateManager,我实在看不下去你们直接用Layout](http://www.jianshu.com/p/665a69e9436b)\n","funding_links":[],"categories":["Java","空白页"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhss01248%2FPageStateManager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhss01248%2FPageStateManager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhss01248%2FPageStateManager/lists"}