android制定统一的ProgressBar以及统一的提示页面

来源:互联网 发布:知乎 十号胖狐狸 编辑:程序博客网 时间:2024/05/01 00:17

有的时候我们需要一个统一的ProgressBar
我的做法很简单,activity最底层的view是一个名叫DecorView的LinearLayout,它包含了title和content,其中content是一个FrameLayout,它的id是android:id=”@android:id/content”。
那么我们就可以在任意activity,添加一个加载ProgressBar的View到这个FrameLayout上面来实现效果

layout:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"                android:id="@+id/cover_root"    android:layout_width="match_parent"    android:background="#0000"    android:layout_height="match_parent">    <RelativeLayout        android:id="@+id/cover"        android:layout_marginTop="48dp"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:background="@color/white_transparent" />    <ProgressBar        style="@android:style/Widget.Holo.ProgressBar"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerInParent="true"/></RelativeLayout>

代码:

/**     * 显示加载圈     * @param activity     * @param isCover 是否需要遮罩 防止点击     */    public static void showLoading(BaseActivity activity , boolean isCover){        if (isLoading(activity)){            return;        }        FrameLayout root = activity.getWindow().getDecorView().findViewById(android.R.id.content);        if (root != null){            View loadingView = LayoutInflater.from(activity).inflate(R.layout.lyt_loading, null);            if (isCover) {                //遮罩层设置点击事件,拦截底层视图的点击事件                loadingView.findViewById(R.id.cover).setOnClickListener(new View.OnClickListener() {                    @Override                    public void onClick(View v) {                    }                });            }            loadingView.findViewById(R.id.cover).setVisibility(isCover ? View.VISIBLE : View.GONE);            root.removeView(loadingView);            root.addView(loadingView);        }    }

这样就可以了。

扩展
最近工作中还做了一个需求,做一个统一的无网络提示页面,那么我第一时间想到的也是这种方式。

/**     * 展示统一无网络页面     * @param activity     */    public static void showNetworklessView(final BaseActivity activity){        activity.hideLoading();        FrameLayout root = activity.getWindow().getDecorView().findViewById(android.R.id.content);        View noNetView = LayoutInflater.from(activity).inflate(R.layout.lyt_no_network, null);        //覆盖上层view的点击事件        noNetView.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {            }        });        //重试按钮的点击事件        noNetView.findViewById(R.id.tv_retry).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if (isNetworkAvailable(activity)){                    Intent intent = new Intent(activity,activity.getClass());                    intent.putExtras(activity.getIntent());                    activity.startActivity(intent);                    activity.overridePendingTransition(0,0);                    activity.finish();                } else {                    Toast.makeText(activity,"当前网络不可用,请检查网络设置",Toast.LENGTH_SHORT).show();                }            }        });        root.removeView(noNetView);        root.addView(noNetView);        Toast.makeText(activity,"当前网络不可用,请检查网络设置",Toast.LENGTH_SHORT).show();    }

由于项目的封装性不是很好,没有一个封装的入口进行重新加载,所以我的做法是重新startActivity,并且overridePendingTransition(0,0)来消除视觉上的重新打开过程。

我的源代码:
https://github.com/runcow/LoadingDemo

原创粉丝点击