Android ProgressBar не обновляет прогресс просмотра / рисования - PullRequest
21 голосов
/ 03 декабря 2010

два бара, которые показывают прогресс в игре.Если пользователь получает очки или время истекло и т. Д., Необходимо обновить индикатор выполнения:

private TextView tv;
private ProgressBar levelHoldBar;
private ProgressBar levelUpBar;

//...
private void updateViews() {

    // ...
    levelHoldBar.setMax(currentLevel.getThreshold());
    levelHoldBar.setProgress(currentPoints > currentLevel.getThreshold() ? currentLevel.getThreshold() : currentPoints);

    levelUpBar.setMax(nextLevel.getThreshold());
    levelUpBar.setProgress(currentPoints > nextLevel.getThreshold() ? nextLevel.getThreshold() : currentPoints);

    tv.setText(currentPoints+"/"+currentLevel.getThreshold());

    Log.d(TAG, "hold prog/max "+levelHoldBar.getProgress()+"/"+levelHoldBar.getMax());
    Log.d(TAG, "up   prog/max "+levelUpBar.getProgress()+"/"+levelUpBar.getMax());
}

т.е.Выходы:

12-03 17:48:33.918: DEBUG/MainActivity(6829): hold prog/max 20/20
12-03 17:48:33.918: DEBUG/MainActivity(6829): up   prog/max 20/50

Log.d (...) в конце показывает ВСЕГДА правильные значения, но НЕКОТОРЫЕ визуальные панели индикатора выполненияне показывают правильные ходы.Они показывают прогресс, который был установлен ранее, даже если получатели для «max» и «progress» возвращают правильные значения (в этом примере столбец показывает около 20% (вместо 100%) для levelHoldBar и около 2% (вместо 40).%) для уровня Up-bar).Я не могу понять, почему лог-вывод правильный, а рисованные - неправильные !?TextView (ТВ) обновляется правильно!Что тут происходит?Как я могу это исправить?

Ответы [ 15 ]

0 голосов
/ 15 января 2019

все. в случае существующего прогресса и нового значения прогресса то же самое, индикатор выполнения не обновляется. таким образом, вы устанавливаете новое значение как близкое значение, это простой способ.

@Override
public synchronized void setProgress(int progress)
{
    if (getProgress() == progress)
    {
        if (progress > 0)   progress -= 1;
        else                progress += 1;
    }

    super.setProgress(progress);
}
0 голосов
/ 19 июня 2018

У меня сработало, если я установил setVisibility () на видимый перед каждым setProgress ()

setVisibility(View.VISIBLE);
setProgress(progress);
0 голосов
/ 06 июня 2018

если вы любите полный прогрессбар

time_prg_bar.setMax(100);
time_prg_bar.setProgress(0); <--

если ваш индикатор прогресса пуст

time_prg_bar.setMax(100);
time_prg_bar.setProgress(100); <--
0 голосов
/ 20 октября 2017

Ничто здесь не работает для меня, поэтому я пришел с немного другим решением.Я заметил, что все работает хорошо, пока я не попытаюсь изменить максимальное значение (вызов setMax с другим значением).

Мой код:

class FixedSeekBar : SeekBar {

    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

    companion object {
        private const val PROGRESS_MAX = 1000000.toDouble()
    }

    private var mLastMaxValue: Int = 100

    override fun setMax(max: Int) {
        mLastMaxValue = max
        super.setMax(PROGRESS_MAX.toInt())
    }

    fun setProgressFixed(progress: Int) {
        setProgress((PROGRESS_MAX / mLastMaxValue * progress).toInt())
    }

    fun getProgressFixed(): Int {
        return (getProgress() / PROGRESS_MAX * mLastMaxValue).toInt()
    }

}

Это прекрасно работает для меня.Я могу вызвать setMax как обычно, и мне просто нужно заменить getProgress и setProgress на getProgressFixed и setProgressFixed .

Не переопределять setProgress и getProgress .Они вызываются внутри.

Мое решение не учитывается при setMin .Если вам это нужно, измените код соответствующим образом.

0 голосов
/ 20 октября 2016

Это сработало для меня ...

OneFragmen.java

public class OneFragment extends Fragment{

public OneFragment() {
    // Required empty public constructor
}
private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;

int progress=0;
private Handler handler = new Handler();
TextView txtProgress;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(
    LayoutInflater inflater, 
    ViewGroup container,
    Bundle savedInstanceState ) {

   View view =  inflater.inflate(R.layout.fragment_one, container, false);
    getActivity().setTitle(R.string.app_name);

   final ProgressBar spinner = 
       (ProgressBar) view.findViewById(R.id.outerProgressBar);
    Resources res = getResources();
    Drawable drawable = res.getDrawable(R.drawable.circular);
    txtProgress = (TextView)view.findViewById(R.id.txtProgress);
    spinner.setProgressDrawable(drawable);
    spinner.setSecondaryProgress(100);
    spinner.setMax(100);
    spinner.setProgress(0);

    new Thread(new Runnable() {

        @Override
        public void run() {
            while (progress < 100) {
                progress += 1;
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        spinner.setProgress(progress);
                        txtProgress.setText(progress + "%");
                    }
                });
                try {
                    Thread.sleep(28);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }).start();
    return view;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...