Usando SeekBar e setProgress não altera a posição do seekBar

Eu estou usando uma Seekbar em um fragmento e preciso mover a Seekbar para posições diferentes. No entanto, setProgress (xxx) não está funcionando.

Como você aciona este método programaticamente para uma Seekbar : public void onProgressChanged (SeekBar seekBar, int progresso, booleano fromUser) ? Mover a Seekbar manualmente funciona bem.

4

6 Respostas

É um erro no ProgressBar!

O setProgress (...) parece não acionar a atualização no drawable se o mesmo valor for passado novamente. Mas não é acionado durante o setMax também. Então a atualização está faltando.

Para resolver isso, estou apenas fazendo um bar.setProgress (0) antes de cada atualização ... isso é apenas uma solução alternativa, mas funciona para mim como esperado:

bar.setProgress(0);//call these two methods before setting progress.
bar.setMax(20);
bar.setProgress(20);

Segunda opçao.

mSeekBar.post(new Runnable() {
        @Override
        public void run() {
            mSeekBar.setProgress(percentOfFullVolume);
        }
    });

também pode funcionar para alguém.

Tente definir o valor máximo primeiro e, em seguida, defina o progresso.

8
adicionado
Husnain Iqbal você pode usar o segundo método com método postDelayed e passar 100 como tempo de atraso. Então ele irá trabalhar mais rapidamente.
adicionado o autor Nepster, fonte
segundo funcionou para mim. e estou surpreso é 2018 e esse bug persiste.
adicionado o autor DoruChidean, fonte
Não está funcionando para mim :(
adicionado o autor Husnain Iqbal, fonte
Eu obtive a solução :) chamando seekBar.setProgress (progress) dentro de onProgressChanged() e método (s) restante (s) em onStopTrackingTouch() dentro de setOnSeekBarChangeListener. obrigado
adicionado o autor Husnain Iqbal, fonte

Eu adiciono um comentário a este tópico porque aconteceu comigo e levei horas para descobrir qual era o problema. O bug ainda está ativo e o método setProgress () não funciona corretamente às vezes.

Eu tenho um MainActivity que confirmar e substituir Fragments e transmitir o valor SeekBar dentro do pacote de cada fragmentos. O usuário altera o valor da Seekbar e seu progresso é colocado no Bundle . Então, quando o usuário alternar de Fragment , o novo obtém o progresso de SeekBar .

Funciona perfeitamente bem para transmiti-lo desta maneira e eu sempre tenho o valor correto na minha variável de progresso no segundo Fragmento . O problema aparece quando eu uso o método setProgress (theProgressValueTransmitted). Isso definiu meu progresso de SeekBar apenas na primeira vez em que substituo o primeiro fragmento. Depois disso, nunca muda quando o valor do progresso ainda é o certo.

Eu usei :

int seekBarProgress;
Bundle bundle = this.getArguments();
    if (bundle != null) {
        seekBarProgress = bundle.getInt("seekBarProgress");
    mySeekBar.post(new Runnable() {
                @Override
                public void run() {
                    eventListTimeSeekBar.setProgress(seekBarProgress);

                }
            });
    }

E esta é a única maneira de fazer isso funcionar. Espero que possa ajudar alguém com o mesmo problema. Este post tem mais de 4 anos, eu nem entendo como esse bug ainda pode existir desde que foi reportado.

2
adicionado

SeekBar.setProgress() should work just fine. Are you sure your code is executing on the UI thread? If not, then this would be the obvious explanation. Check the example in the API doc for ProgressBar

https://developer.android.com/reference/android/widget/ProgressBar.html

Lá eles mostram como trazer a execução de volta ao thread principal.

1
adicionado
Obrigado pela resposta. Eu não trabalhei com threads, então não tenho certeza se está sendo executado no thread da interface do usuário. Eu vou pesquisar isso.
adicionado o autor sowens, fonte

Eu adiciono essa resposta, pois isso pode ajudar alguém no futuro.
No meu caso, também achei que setProgress não estava funcionando corretamente, mas aqui está o meu erro.

increaseIncomeSeekBar.setProgress(progress);
increaseIncomeSeekBar.setMax(maxProgress);

Para progresso de informações e maxProgress é igual a 2000 e 12000. Mas ao exibir o SeekBar, parece que o progresso foi em 0 e, portanto, não está funcionando corretamente.
Você tem que estar ciente disso, o que é bastante lógico quando você sabe disso:

  • first SeekBar max = 100.
  • when you set a progress > max then progress = max.
  • so you need to set a max value before setting a progress value.
1
adicionado

Hoje em dia tudo parece funcionar como esperado.
Post não é mais necessário.
Apenas faça:

seekBar.setMax(200);
seekBar.setProgress(50);

(a ordem não importa)

0
adicionado

Na maioria das vezes, o SeekBar funciona bem. Às vezes, não vai.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    //...
    seekBar.setProgress(value);
    //...
}

Depois de atualizar a exibição de fragmento por detach() + attach (), o código não funciona. Minha solução é aplicar setProgress() dentro de onViewStateRestored ().

@Override
public void onViewStateRestored(Bundle inState) {
    //...
    seekBar.setProgress(value);
    //...
}
0
adicionado