更多精彩内容,请点击阅读:《API Demos 2.3 学习笔记》
进度条ProgressBar可以用来显示某项操作(比如下载文件)的当前进度。ProgressBar主要有两种模式:可以随时确定当前进度值的模式(progressBarStyleHorizontal风格),无法确定当前进度值的模式(其他7种风格)。另外,ProgressBar还有8种系统内置的风格:
- progressBarStyle 默认风格
- progressBarStyleHorizontal 水平进度条风格
- progressBarStyleInverse 反色中等大小风格
- progressBarStyleLarge 超大风格
- progressBarStyleLargeInverse 反色超大风格
- progressBarStyleSmall 超小风格
- progressBarStyleSmallInverse 反色超小风格
- progressBarStyleSmallTitle 标题小风格
这些风格的ProgressBar预览效果如下所示:
以上几种风格的设置方法是在xml布局文件中ProgressBar控件内设置style(默认风格progressBarStyle可以不标明):
style="?android:attr/progressBarStyle"
style="?android:attr/progressBarStyleHorizontal"
style="?android:attr/progressBarStyleInverse"
style="?android:attr/progressBarStyleLarge"
style="?android:attr/progressBarStyleLargeInverse"
style="?android:attr/progressBarStyleSmall"
style="?android:attr/progressBarStyleSmallInverse"
style="?android:attr/progressBarStyleSmallTitle"
ProgressBar不仅可以放在主界面中,而且还能放在标题栏中,甚至还可以放在对话框中。这里我们为了便于理解,按照ProgressBar的模式和用途分成六种情况进行介绍。
1、主界面中的水平进度条
<ProgressBar android:id="@+android:id/progressBarStyleHorizontal"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="120dip"
android:layout_height="wrap_content"
android:max="100"
android:progress="50"
android:secondaryProgress="75" />
注:android:max="100" 属性表示该ProgressBar 的最大值为100,即取值范围为0~100
android:progress="50" 属性表示当前初始的进度值为50
android:secondaryProgress="75" 属性表示当前初始的第二进度值为 75
2、主界面中的环形进度条
<ProgressBar android:id="@+android:id/progressBarStyle"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
注:style可以取值除了 progressBarStyleHorizontal之外的另外7个风格取值。
3、标题栏中的水平进度条
//请求窗口特色风格,这里设置成明确的进度风格
requestWindowFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.main);
//设置标题栏上ProgressBar的主要进度值和第二进度值
//标题栏上ProgressBar的取值范围为0~10000
setProgress(5000);
setSecondaryProgress(7500);
//显示标题上的进度条(确定进度值)
setProgressBarVisibility(true);
注:1、requestWindowFeature(Window.FEATURE_PROGRESS);一句必须放在 setContentView(R.layout.main);之前,否则程序报错。
2、setProgressBarVisibility(true);用来设置进度条是否可见。setProgress(5000);和setSecondaryProgress(7500); 分别用来设置进度条的主要进度值和第二进度值。 这几句必须放在 setContentView(R.layout.main);之后,否则程序报错。
4、标题栏中的环形进度条
//请求窗口特色风格,这里设置成不明确的进度风格
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.main);
//显示标题上的进度条(不确定进度值)
setProgressBarIndeterminateVisibility(true);
注:1、 requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 一句必须放在 setContentView(R.layout.main);之前,否则程序报错。
2、 setProgressBarIndeterminateVisibility(true);用来设置进度条是否可见。这一句必须放在 setContentView(R.layout.main);之后,否则程序报错。
5、进度对话框中的水平进度条
6、进度对话框中的环形进度条
//创建ProgressDialog
final ProgressDialog mProgressDialog = new ProgressDialog(this);
//设置ProgressDialog对象类型为环形
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//设置ProgressDialog的图标
mProgressDialog.setIcon(R.drawable.icon);
//设置ProgressDialog的标题
mProgressDialog.setTitle("ProgressDialog");
//设置ProgressDialog的消息
mProgressDialog.setMessage("Loading...");
//设置ProgressDialog中进度条最大值100,即取值范围为0~100
mProgressDialog.setMax(100);
//设置ProgressDialog中进度条当前初始主要进度值为 50
mProgressDialog.setProgress(0);
//设置ProgressDialog中进度条当前初始第二进度值为 75
mProgressDialog.setSecondaryProgress(0);
//设置ProgressDialog的当前进度值是否不确定
mProgressDialog.setIndeterminate(false);
//设置ProgressDialog是否可以通过回退键取消
mProgressDialog.setCancelable(true);
//设置ProgressDialog的确定按钮以及监听器
mProgressDialog.setButton( DialogInterface.BUTTON_POSITIVE,"Ok", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which) {
// TODO 执行Button_OK按钮点击后的响应动作
mProgressDialog.dismiss();
}
});
//设置ProgressDialog的取消按钮以及监听器
mProgressDialog.setButton(DialogInterface.BUTTON_NEGATIVE,"Cancel", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which) {
// TODO 执行Button_CANCEL按钮点击后的响应动作
mProgressDialog.dismiss();
}
});
//显示ProgressDialog
mProgressDialog.show();
注:直接调用setProgress和setSecondaryProgress无法真正改变进度条的主进度值和第二进度值。关于如何修改进度值,请点击阅读:
《android dialog ——ProgressDialog 进度条对话框详解》
6、进度对话框中的环形进度条
//创建ProgressDialog
final ProgressDialog mProgressDialog = new ProgressDialog(this);
//设置ProgressDialog对象类型为环形
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
//设置ProgressDialog的图标
mProgressDialog.setIcon(R.drawable.icon);
//设置ProgressDialog的标题
mProgressDialog.setTitle("ProgressDialog");
//设置ProgressDialog的消息
mProgressDialog.setMessage("Loading...");
//设置ProgressDialog的当前进度值是否不确定
mProgressDialog.setIndeterminate(true);
//设置ProgressDialog是否可以通过回退键取消
mProgressDialog.setCancelable(true);
//设置ProgressDialog的确定按钮以及监听器
mProgressDialog.setButton( DialogInterface.BUTTON_POSITIVE,"Ok", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which) {
// TODO 执行Button_OK按钮点击后的响应动作
mProgressDialog.dismiss();
}
});
//设置ProgressDialog的取消按钮以及监听器
mProgressDialog.setButton(DialogInterface.BUTTON_NEGATIVE,"Cancel", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which) {
// TODO 执行Button_CANCEL按钮点击后的响应动作
mProgressDialog.dismiss();
}
});
//显示ProgressDialog
mProgressDialog.show();
下面我们进行实例代码解析:
1、Incremental
res-value-string.xml
1、Incremental
res-value-string.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="progressbar_1_plus">+</string>
<string name="progressbar_1_minus">-</string>
<string name="progressbar_1_default_progress">Default progress:</string>
<string name="progressbar_1_secondary_progress">Secondary progress:</string>
</resources>
res-layout-progressbar_1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- 一个ProgressBar对象,类型为:progressBarStyleHorizontal -->
<ProgressBar android:id="@+id/progress_horizontal"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="200dip"
android:layout_height="wrap_content"
android:max="100"
android:progress="50"
android:secondaryProgress="75" />
<!-- 一个TextView对象,提示下面两个按钮改变的主要进度值-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/progressbar_1_default_progress" />
<!-- 水平布局内放置两个按钮,分别用于增大和减小进度条的主要进度值 -->
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button android:id="@+id/decrease"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/progressbar_1_minus" />
<Button android:id="@+id/increase"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/progressbar_1_plus" />
</LinearLayout>
<!-- 一个TextView对象,提示下面两个按钮改变的第二进度值-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/progressbar_1_secondary_progress" />
<!-- 水平布局内放置两个按钮,分别用于增大和减小进度条的第二进度值 -->
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button android:id="@+id/decrease_secondary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/progressbar_1_minus" />
<Button android:id="@+id/increase_secondary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/progressbar_1_plus" />
</LinearLayout>
</LinearLayout>
src-com.example.android.apis.view-ProgressBar1.java
package com.example.android.apis.view;
import com.example.android.apis.R;
import android.app.Activity;
import android.widget.Button;
import android.widget.ProgressBar;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
/**
* 演示如何在窗口标题栏中使用进度条。
* 进度条将会一直显示,直到进度完成,此时进度条消失。
*/
public class ProgressBar1 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 请求在标题栏中显示进度条
requestWindowFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.progressbar_1);
//设置标题栏中的进度条可见
setProgressBarVisibility(true);
// 通过findViewById方法获得一个ProgressBar对象
final ProgressBar progressHorizontal = (ProgressBar) findViewById(R.id.progress_horizontal);
//获取ProgressBar对象(取值范围0~100)的主要进度值和第二进度值,经过转换后设置到标题栏中的ProgressBar对象(取值范围0~10000)。
setProgress(progressHorizontal.getProgress() * 100);
setSecondaryProgress(progressHorizontal.getSecondaryProgress() * 100);
//该按钮用于增大ProgressBar的主要进度值,步进值为1
Button button = (Button) findViewById(R.id.increase);
button.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
//progressHorizontal主要进度值加1
progressHorizontal.incrementProgressBy(1);
//标题栏中的进度条取值范围0~10000,而progressHorizontal取值范围0~100,因此,获取progressHorizontal进度值,乘以100,设置成标题栏上进度条的进度值。下同。
setProgress(100 * progressHorizontal.getProgress());
}
});
//该按钮用于减小ProgressBar的主要进度值,步进值为1
button = (Button) findViewById(R.id.decrease);
button.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
//progressHorizontal主要进度值减1
progressHorizontal.incrementProgressBy(-1);
setProgress(100 * progressHorizontal.getProgress());
}
});
//该按钮用于增大ProgressBar的第二进度值,步进值为1
button = (Button) findViewById(R.id.increase_secondary);
button.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
//progressHorizontal第二进度值加1
progressHorizontal.incrementSecondaryProgressBy(1);
//标题栏中的进度条取值范围0~10000,而progressHorizontal取值范围0~100,因此,获取progressHorizontal第二进度值,乘以100,设置成标题栏上进度条的第二进度值。下同。
setSecondaryProgress(100 * progressHorizontal.getSecondaryProgress());
}
});
//该按钮用于减小ProgressBar的第二进度值,步进值为1
button = (Button) findViewById(R.id.decrease_secondary);
button.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
//progressHorizontal第二进度值减1
progressHorizontal.incrementSecondaryProgressBy(-1);
setSecondaryProgress(100 * progressHorizontal.getSecondaryProgress());
}
});
}
}
2、Smooth
res-layout-progressbar_2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- 一个ProgressBar对象,类型为:progressBarStyleLarge -->
<ProgressBar android:id="@+android:id/progress_large"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<!-- 一个ProgressBar对象,类型为默认类型:progressBarStyle -->
<ProgressBar android:id="@+android:id/progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<!-- 一个ProgressBar对象,类型为默认类型:progressBarStyleSmall -->
<ProgressBar android:id="@+android:id/progress_small"
style="?android:attr/progressBarStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<!-- 一个ProgressBar对象,类型为默认类型:progress_small_title -->
<ProgressBar android:id="@+android:id/progress_small_title"
style="?android:attr/progressBarStyleSmallTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
src-com.example.android.apis.view-ProgressBar2.java
package com.example.android.apis.view;
import com.example.android.apis.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
/**
* 演示如何在窗口标题栏中使用不确定进度的进度条。
* 本实例演示了3中不同大小的环形进度条,
*/
public class ProgressBar2 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 请求在标题栏中显示不确定进度类型的进度条
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.progressbar_2);
// 设置标题栏中的进度条可见
setProgressBarIndeterminateVisibility(true);
}
}
3、Dialogs
res-value-string.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="progressbar_3_progress">Show Progress</string>
<string name="progressbar_3_indeterminate">Show Indeterminate</string>
<string name="progressbar_3_indeterminate_no_title">Show Indeterminate No Title</string>
</resources>
res-layout-progressbar_3.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- 一个Button对象,点击显示一个带有标题的ProgressDialog -->
<Button android:id="@+id/showIndeterminate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/progressbar_3_indeterminate" />
<!-- 一个Button对象,点击显示一个不带标题的ProgressDialog -->
<Button android:id="@+id/showIndeterminateNoTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/progressbar_3_indeterminate_no_title" />
</LinearLayout>
package com.example.android.apis.view;
import com.example.android.apis.R;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
/**
* 演示如何使用进度对话框
*/
public class ProgressBar3 extends Activity {
ProgressDialog mDialog1;
ProgressDialog mDialog2;
private static final int DIALOG1_KEY = 0;
private static final int DIALOG2_KEY = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.progressbar_3);
Button button = (Button) findViewById(R.id.showIndeterminate);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showDialog(DIALOG1_KEY); //显示带有标题的进度对话框
}
});
button = (Button) findViewById(R.id.showIndeterminateNoTitle);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showDialog(DIALOG2_KEY); //显示不带标题的进度对话框
}
});
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DIALOG1_KEY: {
ProgressDialog dialog = new ProgressDialog(this); //创建ProgressDialog
dialog.setTitle("Indeterminate"); //设置标题
dialog.setMessage("Please wait while loading..."); //设置主题信息
dialog.setIndeterminate(true); //设置进度条为不明确进度的类型(环形)
dialog.setCancelable(true); //设置窗口可以通过退回键取消
return dialog;
}
case DIALOG2_KEY: {
ProgressDialog dialog = new ProgressDialog(this); //创建ProgressDialog
dialog.setMessage("Please wait while loading..."); //设置主题信息
dialog.setIndeterminate(true); //设置进度条为不明确进度的类型(环形)
dialog.setCancelable(true); //设置窗口可以通过退回键取消
return dialog;
}
}
return null;
}
}
4、In Title Bar
res-value-string.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="progressbar_4_toggle">Toggle Indeterminate</string>
</resources>
res-layout-progressbar_4.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- 一个Button对象,点击显示/隐藏标题栏上的进度条 -->
<Button android:id="@+id/toggle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/progressbar_4_toggle" />
</LinearLayout>
src-com.example.android.apis.view-ProgressBar4.java
package com.example.android.apis.view;
import com.example.android.apis.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.View;
import android.widget.Button;
/**
* 演示如何在标题栏中使用不确定进度值的进度条
*/
public class ProgressBar4 extends Activity {
private boolean mToggleIndeterminate = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 请求在标题栏中显示不确定进度类型的进度条
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.progressbar_4);
// 设置标题栏中的进度条是否可见
setProgressBarIndeterminateVisibility(mToggleIndeterminate);
//点击一次,改变一次mToggleIndeterminate值
Button button = (Button) findViewById(R.id.toggle);
button.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
mToggleIndeterminate = !mToggleIndeterminate;
setProgressBarIndeterminateVisibility(mToggleIndeterminate);
}
});
}
}
知识点1:关于Progress的自定义等知识,请点击阅读: 《Android自定义ProgressDialog的方法》, 《自定义ProgressBar》以及 《多式样ProgressBar》。
预览效果;
欢迎大家关注我的微信公众号:
微信公众号:sn0wdr1am