<1>簡介
熟悉ProgressBar、SeekBar、RatingBar這三種常用的Bar。
<2>關鍵步驟
利用showDialog函數來創建ProgressBar,showDialog方法已過時。
android使用ShowDialog來顯示一個Dialog,當第一次調用ShowDialog時,會調用Activity的onCreateDialog方法,我們只需重寫該方法,在該方法中創建一個Dialog.而onPrepareDialog(int, Dialog)在Dialog顯示時每次都會被調用。因此如果要動態修改dialog的信息,可以在該方法中實現.
通過SeekBar的setOnSeekBarChangeListener監聽器和RatingBar的setOnRatingBarChangeListener監聽器來監聽變化,同時改變對應的TextView的數值。
SeekBar:
從SeekBar.OnSeekBarChangeListener可以看出,OnSeekBarChangeListener是SeekBar的內部接口。
實現這個監聽器,就必須實現三個方法:
onProgressChanged(SeekBar seekBar, int progress, boolean fromUser):當你拖動這個滑塊時就會調用這個方法。只要滑塊發生變化,無論是怎麼樣發生變化,都會調用這個方法。boolean fromUser 這個參數是來判斷是否是手動滑動。int progress 這個參數表示變動到什麼位置。
onStartTrackingTouch(SeekBar seekBar):當你開始拖動這個滑塊時就會調用這個方法。
onStopTrackingTouch(SeekBar seekBar):當你結束拖動這個滑塊時就會調用這個方法。
RatingBar:
屬性
屬性名稱 |
描述 |
android:isIndicator |
RatingBar是否是一個指示器(用戶無法進行更改) |
android:numStars |
顯示的星型數量,必須是一個整形值,像“100”。 |
android:rating |
默認的評分,必須是浮點類型,像“1.2”。 |
android:stepSize |
評分的步長,必須是浮點類型,像“1.2”。 |
方法:
public int getNumStars()
返回顯示星星總共的的數目。
public float getRating()
獲取當前等級(滿星星的數目)。
public float getStepSize()
得到RatingBar的步長。
public boolean isIndicator()
返回這RatingBar是否只是一個指示器(只是起指示作用,用戶無法進行交互)。
public synchronized void setMax(int max)
設置這個進度條的範圍爲0……max
public void setNumStars(int numStars)
設置星星的數目。
public void setRating(float rating)
設置等級(星星的填充數目)。
public void setStepSize(float stepSize)
設置RatingBar的步長。
<3>出現的問題
無
<4>代碼及解釋
ProgressBar效果圖:
SeekBar和RatingBar效果圖:
activity_bar.xml:
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/buttonbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="大小:" />
<SeekBar
android:id="@+id/seekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="評分:" />
<RatingBar
android:id="@+id/ratingBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
BarActivity.java:
package com.ui.bar;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RatingBar;
import android.widget.SeekBar;
import android.widget.TextView;
import com.test.R;
public class BarActivity extends Activity{
/**
* @ProjectName: [androidtest]
* @Package: [com.ui.bar.BarActivity.java]
* @ClassName: [BarActivity]
* @Description:
* @Author: [gmj]
* @CreateDate: [2013-8-28 上午11:44:55]
* @Version: [v1.0]
*/
final int PROGRESS_DIALOG = 0;
final int INCREASE = 0;
ProgressDialog pd;
Handler hd;
SeekBar seekbar;
RatingBar ratingbar;
TextView tv1,tv2;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bar);
Button bok = (Button)this.findViewById(R.id.buttonbar);
tv1 = (TextView)this.findViewById(R.id.textView1);
tv2 = (TextView)this.findViewById(R.id.textView2);
seekbar = (SeekBar)this.findViewById(R.id.seekBar);
ratingbar = (RatingBar)this.findViewById(R.id.ratingBar);
seekbar.setOnSeekBarChangeListener(
new SeekBar.OnSeekBarChangeListener(
) {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
tv1.setText("大小:" +(int)seekBar.getProgress());
}
});
ratingbar.setOnRatingBarChangeListener(
new RatingBar.OnRatingBarChangeListener() {
@Override
public void onRatingChanged(RatingBar ratingBar, float rating,
boolean fromUser) {
// TODO Auto-generated method stub
tv2.setText("打分:" + (float)ratingbar.getRating());
}
});
bok.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
showDialog(PROGRESS_DIALOG);
}
});
hd = new Handler(){
public void handleMessage(Message msg)
{
super.handleMessage(msg);
switch(msg.what)
{
case INCREASE:
pd.incrementProgressBy(1);
if(pd.getProgress() >= 100)
{
pd.dismiss();
}
break;
}
}
};
}
public Dialog onCreateDialog(int id)
{
switch(id)
{
case PROGRESS_DIALOG:
pd = new ProgressDialog(this);
pd.setMax(100);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setTitle("ProgressBar");
pd.setCancelable(false);
break;
}
return pd;
}
public void onPrepareDialog(int id , Dialog dialog){
super.onPrepareDialog(id, dialog);
switch(id){
case PROGRESS_DIALOG:
pd.incrementProgressBy(-pd.getProgress());
new Thread(){
public void run()
{
while(true)
{
hd.sendEmptyMessage(INCREASE);
if(pd.getProgress() >= 100)
{
break;
}
try {
Thread.sleep(40);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
break;
}
}
}