これを読んでくれてありがとう。カスタム ProgressBar から AsyncTask 内部クラスを介して進行状況を更新するのに問題があります。背景と進行状況のドローアブルに 9patch を使用しています。更新しないだけです。最大値のようにすべてが満たされたままです。onProgressUpdate() を使用して invalidate() を呼び出し、UI スレッドを更新しています。
これが現在の外観です。表示され、すべてがいっぱいになったままになります。http://imageshack.us/photo/my-images/651/mobicashprogressbar.png/
- プログレスバーは、ユーザーがフォームを終了した後にのみ表示されます。
- Web サービスに接続する SMS 送信ボタンを処理する別の内部 AsyncTask があります。
コードはこちら:
public void setTimerProgress(int progress){
progressBar.setProgress(progress);
}
public void updateProgress(){
progressBar.invalidate();
}
public void showProgress(){
progressBar.setVisibility(View.VISIBLE);
}
//Classe auxiliar para controle da progress bar
private class TimerProgress extends AsyncTask<Void, Void, Void>{
private int start;
private final int OTP_TIMEOUT = 900000;
@Override
protected void onPreExecute() {
super.onPreExecute();
showProgress();
start = (int) System.currentTimeMillis();
}
@Override
protected Void doInBackground(Void... param) {
int timer = (int) System.currentTimeMillis() - start;
while (timer <= OTP_TIMEOUT){
setTimerProgress(timer);
timer = (int) System.currentTimeMillis() - start;
publishProgress();
}
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
updateProgress();
}
}
ここにある XML:
<ProgressBar
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_gravity="center_horizontal"
android:visibility="invisible"
android:id="@+id/progress_bar_timer"
android:max="900000"
android:progress="3000"
android:progressDrawable="@drawable/progress_bar"
android:background="@drawable/progress_background"
android:layout_width="fill_parent"
android:layout_height="25dip"
android:layout_marginRight="73sp"
android:layout_marginLeft="70sp">
</ProgressBar>
ここは私がそれを呼ぶ1つの場所です
@Override
public void onClick(View v) {
if (v.getId() == R.id.refresh_otp) {
saveParametersForOTP();
if (edtIniPin.getText().length() == pinLengthInt) {
try {
disableEditText(edtIniPin);
disableEditText(edtValue);
edtOTP.setText(Facade.getInstance().nextOTP(Facade.getInstance().getPin(), Facade.getInstance().getValue()));
//Inicia o timer da progressbar
new TimerProgress().execute();
ヘルプ?:D
アップデート:
テスト目的のために、OTP_TIMEOUT を 50000 に設定し、コードに次の変更を加え、バーにネイティブのドローアブルを使用するように 9patch ドローアブル プロパティを削除しました。ただし、画像を使用してバーをカスタマイズすると、同じ古い問題が発生しているように見えます。それは静的で、以前と同じようにすべて満たされています。
private final int OTP_TIMEOUT = 50000;
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.i("PROGRESS", "Chegou no PreExecute!");
showProgress();
ENABLE_REFRESH = false;
start = (int) System.currentTimeMillis();
}
@Override
protected Void doInBackground(Void... param) {
int timer = (int) System.currentTimeMillis() - start;
while (timer <= OTP_TIMEOUT){
Log.i("PROGRESS", "Chegou no while!");
setTimerProgress((int)timer);
timer = (int) System.currentTimeMillis() - start;
publishProgress();
if (timer >= OTP_TIMEOUT) {
ENABLE_REFRESH = true;
}
}
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
Log.i("PROGRESS", "Chegou no Progress Update!");
updateProgress();
}