美文网首页
Android 中通用的Toolbar和Error,Empty,

Android 中通用的Toolbar和Error,Empty,

作者: 曾经的你呀 | 来源:发表于2018-02-12 17:30 被阅读372次

在Android 开发中Activity几乎都有Toolbar(menu也在里面)和以及Http 请求的时候出现的Error,Empty,Loading等UI 需要处理,怎么能快速简单高效处理呢?


image.png

首先定义BaseActivity 中的XML 定义

如下面所示,默认都是需要Toolbar 的,如果不需要就设置为不可见就好了;
而不同的Activity 中的内容实际是放在(FrameLayout)fl_content 中的。

R.layout.activity_base

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">
    <!--默认都是需要Toolbar 的,如果不需要就设置为不可见就好了-->
    <android.support.v7.widget.Toolbar
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/toolbar"
        android:layout_height="?attr/actionBarSize"
        android:layout_width="match_parent"
        android:background="?attr/colorPrimary"
        app:titleTextColor="@android:color/white"
        app:subtitleTextColor="@color/light_white"
        app:navigationIcon="@drawable/ic_back_copy">
    </android.support.v7.widget.Toolbar>

    <!-- 不同的页面展示插到这里来-->
    <FrameLayout
        android:id="@+id/fl_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

怎么处理不同的Activity 中的内容实际是放在(FrameLayout)fl_content 中的呢?

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = BaseActivity.this;

        View rootView=customContentView(View.inflate(this, R.layout.activity_base, null));
        setContentView(rootView);

        initViews();
        initHttp();  //在这里进行Http 的请求
    }


    /**
     * 定制Custom View,Content 区域先留空,后面再动态的添加,同时
     * 增加Error,empty,Loading,timeout,等通用的场景处理,一处Root注入,处处可用
     *
     */
    private View customContentView(View rootView) {
        mToolbar = (Toolbar) findViewById(R.id.toolbar);
        if (mToolbar != null) {
            setSupportActionBar(mToolbar);
        }

        View content = View.inflate(this, getLayoutId(), null);
        if (content != null) {
            FrameLayout flContent = (FrameLayout) rootView.findViewById(R.id.fl_content);
            FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
                    FrameLayout.LayoutParams.MATCH_PARENT);
            flContent.addView(content, params);
            ButterKnife.bind(this, rootView);   //ButterKnife 绑定

            //增加Error,empty,Loading,timeout,等通用的场景处理
            mBaseLoadService = LoadSir.getDefault().register(content, new Callback.OnReloadListener() {
                @Override
                public void onReload(View v) {
                    onHttpReload(v);
                }
            });
        }
        return rootView;
    }

在加载数据的时候会出现Error,empty,Loading,timeout 等场景怎么处理呢?

这种问题几乎每个页面都会遇到,难道每个页面都是使用FrameLayout 叠加两层内容来处理?😄,推荐一个项目LoadSir:https://github.com/KingJA/LoadSir

在BaseActivity 中已在 LoadSir.getDefault().register(content 了

    private View customContentView(View rootView) {
        View content = View.inflate(this, getLayoutId(), null);
        if (content != null) {
            FrameLayout flContent = (FrameLayout) rootView.findViewById(R.id.fl_content);
            FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
                    FrameLayout.LayoutParams.MATCH_PARENT);
            flContent.addView(content, params);

            //增加Error,empty,Loading,timeout,等通用的场景处理
            mBaseLoadService = LoadSir.getDefault().register(content, new Callback.OnReloadListener() {
                @Override
                public void onReload(View v) {
                    onHttpReload(v);
                }
            });
        }
        return rootView;
    }

使用的时候只要大概这样就好了:

        /**
         * mBaseLoadService,很方便的就能展示空啊什么的;
         *
         */
        if (data == null || data.size() == 0) {
            mBaseLoadService.showCallback(EmptyCallback.class);
        } else {
            mBaseLoadService.showSuccess();
        }

Demo on github:AndroidAppFrameWork(代码估计能加快理解)

相关文章

网友评论

      本文标题:Android 中通用的Toolbar和Error,Empty,

      本文链接:https://www.haomeiwen.com/subject/jlfdtftx.html