自定义ProgressBar不会更新。 (AsyncTask + 9patch)

时间:2011-06-02 17:44:47

标签: android progress-bar android-asynctask nine-patch

首先感谢读这篇文章。 我无法通过AsyncTask内部类从我的自定义ProgressBar更新进度。我正在使用9patch作为背景和进度drawables。它只是不更新​​。它保持在那里,就像它在maxed值中一样,我正在使用onProgressUpdate()来调用invalidate()并更新UI线程。

以下是现在的样子,它可见并且只是在那里填满:http://imageshack.us/photo/my-images/651/mobicashprogressbar.png/

  • 进度条应该只是 用户结束后可见 形式。
  • 还有另一个内部AsyncTask处理与Web服务连接的发送SMS按钮。

以下代码:

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();
    }
}

HERE'S 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>

在这里我打电话的地方

@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 drawables属性,因此它将使用该条的原生drawable。但是,当我使用图像来自定义条形图时,它会出现同样的老问题。它是静态的,都像以前一样填满。

            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();
    }

1 个答案:

答案 0 :(得分:3)

您需要添加图层列表资源并配置ProgressBar才能使用它。

这是我使用的一个例子。请注意,在progress_bar.xml中,progress_bar_progress和progress_bar_background是九个补丁图像。

<强> progress_bar.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" />