在数据请求的时候,为了给用户直观的显示正在请求数据,而不是类似无响应那种,我们通常会在开始网络请求中调用progressBar展示,用于表明我正在努力加载,项目中的用法也是类似的。先看下效果图:
下面开始介绍实现。
首先我们创建一个LoadingDemo具体代码如下。先看下名为layout_loading_dialog.xml的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="120dp"
android:layout_height="120dp"
android:background="@drawable/dialog_bg_shape"
android:layout_gravity="center"
android:gravity="center"
android:orientation="vertical"
android:padding="10dp" >
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminateDrawable="@drawable/dialog_progressbar" />
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="玩命加载中…"
android:singleLine="true"
android:textColor="@color/content"
android:textSize="14sp" />
</LinearLayout>
其中用到的颜色在color.xml中定义有以下:
<!-- 基本颜色值 -->
<color name="blue">#0000ff</color>
<color name="white">#ffffff</color>
<color name="transparent">#00000000</color>
<color name="content">#555555</color>
LinearLayout布局的背景为android:background=”@drawable/dialog_bg_shape”,是一个.xml文件dialog_bg_shape.xml。它的drawable实现为
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<corners android:radius="10dp"/>
<solid android:color="@color/white"/>
</shape>
而progressBar的indeterminateDrawable属性设置为自己实现的dialog_progressbar,也是一个xml文件dialog_progressbar.xml。它的drawable实现如下
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/loading_progress"
android:pivotX="50%"
android:pivotY="50%" />
activity代码如下:
public class MainActivity extends Activity {
//加载对话框
private Dialog mLoadingDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
showDialog("开始加载..");
//延迟3s后取消
handler.sendEmptyMessageDelayed(1, 3*1000);
}
@SuppressLint("HandlerLeak")
Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 1:
cancelDialog();
break;
default:
break;
}
};
};
/**
* 展示对话框
* @param content 对话框显示内容
*/
private void showDialog(String content) {
Viewview=LayoutInflater.from(this).inflate(R.layout.layout_loading_dialog, null);
TextView loadingText = (TextView)view.findViewById(R.id.text);
loadingText.setText(content);
mLoadingDialog = new Dialog(this, R.style.loading_dialog_style);
// 对话框是否可以取消
mLoadingDialog.setCancelable(true);
mLoadingDialog.setContentView(view, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
mLoadingDialog.show();
}
/**
* 取消对话框
*/
private void cancelDialog() {
if(mLoadingDialog != null && mLoadingDialog.isShowing()) {
mLoadingDialog.cancel();
}
}
}
这里的R.style.loading_dialog_style为:
<style name="loading_dialog_style" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@color/transparent</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
总结:上述代码是我在项目中用到dialog的一种,还有一些其他的形式,不过大同小异,有兴趣的可以继续深入学习。
Demo链接