Пользовательский ProgressBar не будет обновляться.(AsyncTask + 9patch) - PullRequest
0 голосов
/ 02 июня 2011

Прежде всего, спасибо, что прочитали это.У меня проблемы с обновлением прогресса из моего пользовательского ProgressBar через внутренний класс AsyncTask.Я использую 9patch для фона и рисования прогресса.Это просто не обновлять.Он остается заполненным, как в максимальном значении, я использую onProgressUpdate () для вызова invalidate () и обновления потока пользовательского интерфейса.

Вот как это выглядит сейчас, оно становится видимым ипросто остается там все заполнено: http://imageshack.us/photo/my-images/651/mobicashprogressbar.png/

  • Индикатор выполнения должен быть виден только после того, как пользователь завершит заполнение формы.
  • Есть еще один внутренний AsyncTask, обрабатывающий кнопку отправки 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();
    }

1 Ответ

3 голосов
/ 15 июня 2012

Вам необходимо добавить ресурс списка слоев и настроить 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" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...