有的时候我们需要一个统一的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)来消除视觉上的重新打开过程。