標籤:android開發 控制項 layout
ProgressDialog類似於ProgressBar類。
用於顯示一個過程,通常用於耗時操作。
幾個方法介紹:
1.setMax()
設定對話方塊中進度條的最大值。
2.setTile()
設定標題。
3.setProgressStyl()
設定對話方塊中進度條的樣式。例如:環形和水平。
參數:
ProgressDialog.STYLE_SPINNER 環形精度條
ProgressDialog.STYLE_HORIZONTAL 水平樣式的進度條
4.setMessage()
設定顯示的內容。
示範執行個體:
用於類比一個耗時的串連操作。
圖:
MainActivity.java
public class MainActivity extends Activity {Button button, button2;ProgressDialog progressDialog;public final static String ABOUT_SERVER = "Connect";// 資訊廣播接收BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context c, Intent intent) {String str = intent.getStringExtra("DATA");if (str.equals("0")) {progressDialog.setMessage("開始串連");} else if (str.equals("1")) {progressDialog.setMessage("串連完畢");} else {progressDialog.dismiss();}}};@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 註冊廣播監聽IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(ABOUT_SERVER);registerReceiver(broadcastReceiver, intentFilter);}public void click(View v) {progressDialog = new ProgressDialog(MainActivity.this);progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);progressDialog.setMessage("準備建立串連·············");progressDialog.show();Intent intent = new Intent(MainActivity.this, ServerActivity.class);startService(intent);}}activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="${relativePackage}.${activityClass}" > <Button android:id="@+id/but" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="click" android:text="點擊" /> </LinearLayout>ServerActivity.java
public class ServerActivity extends Service {Handler handler = new Handler() {public void handleMessage(Message msg) {Intent intent = new Intent(MainActivity.ABOUT_SERVER);if (msg.what == 0) {intent.putExtra("DATA", "0");} else if (msg.what == 1) {intent.putExtra("DATA", "1");} else {intent.putExtra("DATA", "2");ServerActivity.this.stopSelf();}sendBroadcast(intent);};};@Overridepublic void onCreate() {super.onCreate();Thread thread = new Thread(new Runnable() {@Overridepublic void run() {// 要做的事try {for (int i = 0; i < 3; i++) {Thread.sleep(1000);Message message = new Message();message.what = i;handler.sendMessage(message);}} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});thread.start();}@Overridepublic IBinder onBind(Intent arg0) {// TODO Auto-generated method stubreturn null;}}AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.test" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <service android:name="com.example.test.ServerActivity"></service> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>
在做此執行個體時,遇到報錯,一大串紅字,最關鍵的一句話:
This message is already in use.
從網上查得:與handler發送Message相關,訊息已經在訊息佇列了,而且正被使用,而如果往同一個隊列發送相同的對象就會報錯。
造成這個錯誤是因為:
final Message message = new Message();Thread thread = new Thread(new Runnable() {@Overridepublic void run() {// 要做的事try {for (int i = 0; i < 3; i++) {Thread.sleep(1000);message.what = i;handler.sendMessage(message);}} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});thread.start();
使用了同一個Message。用的API 19(4.4)與4.4模擬器,不顯示錯誤,只是卡住,用的API 19(4.4)與2.2模擬器就報錯了。
Android開發之ProgressDialog的使用