android progressBar no actualiza la vista de progreso / dibujable

dos barras que muestran el progreso de un juego. Si el usuario obtiene puntos o el tiempo está activo, etc. progressBars debe actualizarse:

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()); } 

es decir. Productos:

 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 

El Log.d (…) al final muestra SIEMPRE los valores correctos, pero A VECES las barras visuales de los progressBars no muestran los progeses correctos. Muestran los progresos que se habían establecido previamente incluso si los captadores para “máximo” y “progreso” devuelven los valores correctos (en el ejemplo, la barra muestra aproximadamente 20% (en lugar de 100%) para el nivelHoldBar y aproximadamente 2% (en lugar de 40 %) para el nivel Arriba-barra). No puedo entender, ¿por qué la salida de registro es correcta, pero los datos descartables son incorrectos? ¡TextView (tv) se actualiza correctamente! ¿Que está pasando aqui? ¿Cómo puedo arreglar eso?

SOLUCIÓN : ¡Es un error en ProgressBar!

finalmente … Creo que encontré la solución …

esto no funciona como uno esperaría:

 bar.setMax(50); bar.setProgress(20); bar.setMax(20); bar.setProgress(20); 

El setProgress (…) parece no activar la actualización en el dibujo si el mismo valor se pasa nuevamente. Pero no se desencadena durante el setMax, también. Entonces la actualización falta. ¡Parece un error en la ProgressBar de Android! Esto me tomó alrededor de 8 horas ahora … jajaja: D

Para resolver esto, solo estoy haciendo un bar.setProgress (0) antes de cada actualización … esto es solo una solución, pero funciona para mí como se esperaba:

 bar.setMax(50); bar.setProgress(20); bar.setProgress(0); // <-- bar.setMax(20); bar.setProgress(20); 

Pude hacer que esto funcionara con View.post() :

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // ... mSeekBar.post(new Runnable() { @Override public void run() { mSeekBar.setProgress(percentOfFullVolume); } }); } 

Al igual que con la respuesta de SKT, no me queda claro por qué esto debería funcionar cuando esto no funciona

 mSeekBar.setProgress(percentOfFullVolume); 

Sin embargo, parece ser cierto hasta e incluyendo Android Lollipop.

Puede usar un controlador para actualizar la barra de progressbar

 Handler progressBarHandler = new Handler(); ProgressBar bar = (ProgressBar) findViewById(R.id.progressBar1);; progressBarHandler .post(new Runnable() { public void run() { bar.setProgress(progress); } }); 

Para mí, llamar a setMax() antes de setProgress() funcionó por alguna razón.

En mi caso, creo VerticalSeekBar, y la solución de Stuck no funciona. Después de horas, he encontrado una solución:

 @Override public synchronized void setProgress(int progress) { super.setProgress(progress); onSizeChanged(getWidth(), getHeight(), 0, 0); } 

Espero que ayudes a alguien.

Crear updateThumb (); método en VerticalSeekbar

 public void updateThumb(){ onSizeChanged(getWidth(), getHeight(), 0, 0); } 

Y luego llame al método update thumb luego de configurar el progreso.

 seekBar.setProgress((int) progress); seekBar.updateThumb(); 

su trabajo para mí en verticalseekbar calss

Asegúrate de que el estilo de progressBar esté configurado como style = “@ android: style / Widget.ProgressBar.Horizontal” de lo contrario mostrará Progreso indeterminado

(En caso de que ayude a alguien)

Gracias Stuck por la publicación que indica que hay un error de Android. También tengo una barra de búsqueda vertical.

El problema era cuando estaba cambiando el progreso dibujable. El dibujable se actualizaría pero la barra se establecería en 0 y sería de un tamaño muy pequeño. Pude hacer que cambiara el tamaño con updateThumb (), pero el progreso aún estaba en 0.

Para establecer el progreso en el valor original, agregué un mylayer.setLevel (…) ;. Encontré esto leyendo el código fuente de ProgressBar.doRefreshProgress (…). Es posible que pueda hacer seekBar.getProgressDrawable.setLevel(...) .

 LayerDrawable mylayer = //new LayerDrawable() seekBar.setProgressDrawable(mylayer); seekBar.updateThumb(); seekBar.setProgress((int) chLevel); mylayer.setLevel((int) (chLevel / MAX_LEVEL * 10000)); 

Esto funcionó para mí …

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; } } 

Nada aquí funcionó para mí, así que he venido con una solución un poco diferente. Noté que todo funciona bien hasta que trato de cambiar el valor máximo (llamando a setMax con un valor diferente).

Mi código:

 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() } } 

Esto funciona perfectamente para mi. Puedo llamar a setMax como siempre y solo necesito reemplazar getProgress y setProgress con getProgressFixed y setProgressFixed .

No anule setProgress y getProgress . Se llaman internamente.

Mi solución no cuenta con setMin . Si lo necesita, cambie el código en consecuencia.

si te encanta la barra de progreso completa

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

si tu barra de progreso está vacía

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

Intenté todas las soluciones enumeradas, no funcionaron. Resulta que … el problema real era que mi código estaba ocupado, esencialmente bloqueando el hilo de la interfaz de usuario. Entonces, la solución adecuada que arregló el problema al instante fue … poner mi código ocupado dentro de una tarea asíncrona.

En mi caso, estaba cargando varios miles de registros desde XML en una base de datos SQLite. Naturalmente, quería actualizar la barra de progreso. El código que debería haber hecho esto (prg_bar.setProgress (iProgressPercentage)) no hizo nada, y al final de la carga, finalmente la UI tuvo la oportunidad de ejecutarse. Poof, la barra de progreso va de cero a 100.

El mismo código puesto en el onProgressUpdate () de la tarea asíncrona, envuelto alrededor del mismo código funcional, funcionó perfectamente. Esto me hace ser muy escéptico de la idea de “que haya un error en el código de barra de progreso” y que establecer el máximo y el cero o cualquiera de esas cosas sea más que una simple coincidencia.

Para mí funcionaba si configuro setVisibility () para que sea visible antes de cada setProgress ()

 setVisibility(View.VISIBLE); setProgress(progress);