Het gebruik van SeekBar en setProgress verandert de positie van seekBar niet

Ik gebruik een zoekbalk in een fragment en moet de zoekbalk naar verschillende posities verplaatsen. setProgress (xxx) werkt echter niet.

Hoe activeer je deze methode programmatisch voor een zoekbalk : public void onProgressChanged (SeekBar seekBar, int progress, boolean fromUser) ? Het verplaatsen van de zoekbalk werkt prima.

4

6 antwoord

Het is een Bug in ProgressBar!

De setProgress (...) lijkt de update op de drawable niet te activeren als dezelfde waarde opnieuw wordt doorgegeven. Maar het wordt ook niet geactiveerd tijdens de setMax. Dus de update ontbreekt.

Om dit op te lossen, doe ik voor elke update gewoon een bar.setProgress (0) ... dit is slechts een tijdelijke oplossing, maar het werkt voor mij zoals verwacht:

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

Tweede optie.

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

het kan ook voor iemand werken.

Probeer eerst de maximale waarde in te stellen en vervolgens de voortgang in te stellen.

8
toegevoegd
Husnain Iqbal kunt u de tweede methode met postDelayed-methode gebruiken en 100 als vertragingstijd doorgeven. Daarna zal het sneller werken.
toegevoegd de auteur Nepster, de bron
tweede werkte voor mij. en ik ben verbaasd dat het 2018 is en deze bug blijft bestaan.
toegevoegd de auteur DoruChidean, de bron
Het werkt niet voor mij :(
toegevoegd de auteur Husnain Iqbal, de bron
Ik kreeg de oplossing :) door seekBar.setProgress (progress) aan te roepen binnen onProgressChanged() en de resterende methode (s) in onStopTrackingTouch() in setOnSeekBarChangeListener. Bedankt
toegevoegd de auteur Husnain Iqbal, de bron

Ik voeg een opmerking toe aan dit onderwerp omdat het mij overkwam en het kostte me uren om uit te zoeken wat het probleem was. De bug is nog steeds actief en de methode setProgress () werkt soms niet goed.

Ik heb een MainActivity die Fragmenten commit en vervangt en de SeekBar -waarde binnen de bundel van elke fragment verzendt. De gebruiker wijzigt de waarde van de zoekbalk en de voortgang wordt in de bundel geplaatst. Wanneer de gebruiker vervolgens van Fragment overschakelt, krijgt de nieuwe de voortgang SeekBar .

Het werkt prima om het op deze manier te verzenden en ik heb altijd de juiste waarde voor mijn voortgangsvariabele in het tweede fragment . Het probleem verschijnt als ik de methode setProgress (theProgressValueTransmitted) gebruik. Hierdoor is de voortgang van mijn zoekbalk pas ingesteld bij de eerste keer dat ik het eerste fragment heb vervangen. Daarna verandert het nooit, hoewel de waarde van vooruitgang nog steeds de juiste is.

Ik gebruikte :

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

                }
            });
    }

En dit is de enige manier waarop ik dit kan laten werken. Ik hoop dat het iemand met hetzelfde probleem kan helpen. Deze post is meer dan 4 jaar oud, ik begrijp niet eens hoe deze bug kan blijven bestaan ​​sinds deze is gemeld.

2
toegevoegd

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

Daar laten ze zien hoe je de uitvoering terug kunt brengen naar de rode draad.

1
toegevoegd
Bedankt voor het antwoord. Ik heb niet gewerkt met threads, dus ik weet niet zeker of het wordt uitgevoerd op de UI-thread. Ik zal het onderzoeken.
toegevoegd de auteur sowens, de bron

Ik voeg dit antwoord toe, omdat dit iemand in de toekomst kan helpen.
In mijn geval dacht ik ook dat setProgress niet goed werkte, maar hier is mijn fout.

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

Voor info is voortgang en maxProgress gelijk aan 2000 en 12000. Maar bij het weergeven van de SeekBar lijkt het alsof de voortgang 0 was en dus niet goed werkte.
Je moet je hiervan bewust zijn, wat vrij logisch is als je het weet:

  • 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
toegevoegd

Tegenwoordig lijkt alles te werken zoals verwacht.
Bericht is niet meer nodig.
Gewoon doen:

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

(bestelling doet er niet toe)

0
toegevoegd

Meestal werkt SeekBar prima. Soms zal dat niet gebeuren.

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

Nadat ik de fragmentweergave heb vernieuwd door() + attach() los te koppelen, werkt de code niet. Mijn oplossing is om setProgress() toe te passen in opViewStateRestored ().

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