更多精彩内容,请点击阅读:《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》。
预览效果;