0

首先感谢您阅读本文。我无法通过 AsyncTask 内部类从自定义 ProgressBar 更新进度。我使用 9patch 作为背景和进度可绘制对象。它只是不更新​​。它保持在那里,就像它在最大值中一样,我正在使用 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();
    }
}

这是 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 可绘制属性,因此它将使用本机可绘制栏。但是,它可以工作,当我使用图像来自定义栏时,它似乎正在发生同样的老问题。它是静态的,像以前一样被填满。

            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 是九个补丁图像。

进度条.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 回答