0

これを読んでくれてありがとう。カスタム 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();
    }
4

1 に答える 1

3

レイヤー リスト リソースを追加し、それを使用するように ProgressBar を構成する必要があります。

ここに私が使用する例があります。progress_bar.xml では、progress_bar_progress と progress_bar_background は 9 パッチのイメージであることに注意してください。

進行状況バー.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background" android:drawable="@drawable/progress_bar_background" />
    <item android:id="@android:id/progress" >
        <clip android:drawable="@drawable/progress_bar_progress" />
    </item>
</layer-list>list>

レイアウト スニペット:

<ProgressBar 
    android:layout_width="fill_parent"
    android:layout_height="30dp"
    android:max="100"
    android:progress="50"
    android:progressDrawable="@drawable/progress_bar"
    android:indeterminateOnly="false" />
于 2012-06-15T18:06:34.023 に答える