2011-02-15 66 views
7

Estoy construyendo una interfaz de usuario desde el código y puedo agregar widgets ProgressBar, pero no puedo modificar las dimensiones del widget a los valores que necesito, siempre permanece en el tamaño predeterminado (alrededor 50dp). He intentado el siguiente código;Cambie el ancho de una ProgressBar agregada en tiempo de ejecución

ProgressBar progressBar = new ProgressBar(activity, null, android.R.attr.progressBarStyleHorizontal); 
    progressBar.setMinimumHeight(20); 
    progressBar.setMinimumWidth(100); 

También he intentado establecer las LayoutParams Progressbar pero de nuevo nada y he tratado de envolver el widget en otra disposición, pero todavía no suerte.

¿Alguien puede ayudar, ya que no puedo ver cómo hacerlo? Si hay una solución que utiliza XML podría funcionar, pero tengo que establecer la dimensión y la ubicación en tiempo de ejecución.


Para Progress XML He utilizado lo siguiente.

<ProgressBar 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="10dp" 
     android:indeterminateOnly="false" 
     android:progressDrawable="@android:drawable/progress_horizontal" 
     android:indeterminateDrawable="@android:drawable/progress_indeterminate_horizontal" 
     android:maxWidth="1000dp" 
    /> 

A continuación, el código para inflarlo es el siguiente. Esta es una mezcla de lo que hemos estado discutiendo.

LayoutInflater layoutInflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    ProgressBar progressBar = (ProgressBar)layoutInflater.inflate(R.layout.progress_bar, null); 
    progressBar.setMinimumHeight(10); 
    progressBar.setMinimumWidth(200); 
    progressBar.setLayoutParams(new RelativeLayout.LayoutParams(200, 10); 

    progressBar.setMax(100); 
    progressBar.setProgress(getScrollBarValue()); 
    progressBar.setIndeterminate(isIndeterminate()); 
    progressBar.getLayoutParams().width = 200; 
    progressBar.invalidate(); 
+0

Supongo que una solución sería copiar el código fuente del widget e implementar los métodos que faltan. Parece una solución loca, debe haber una manera de hacer esto. – Snowwire

+0

Solo para confirmar: ¿está buscando los estilos de barra, no los estilos de girador? Probablemente sea suficiente para averiguar dónde están definidos los estilos/formas y para copiarlos y ajustarlos. – sstn

Respuesta

9

R.layout.activity incluye lo siguiente:

<ProgressBar 
     android:id="@+id/progress" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:indeterminate="true" 
     android:visibility="visible" 
     style="@android:style/Widget.ProgressBar.Large.Inverse" 
/> 

y luego el código:

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity); 
    ProgressBar bar = (ProgressBar)findViewById(R.id.progress); 
    bar.getLayoutParams().height = 500; 
    bar.invalidate(); 
} 

La llamada al método invalidate() es importante, ya que es cuando la vista se vuelve a dibujar para tener en cuenta los cambios. Aunque no es intuitivo, permite un mejor rendimiento mediante cambios por lotes.

+0

Probé el método que sugirió, pero no tuvo ningún efecto en el tamaño. – Snowwire

+0

Describí dos métodos que debe usar, llamar uno por su cuenta no funcionará. Acabo de crear una actividad de prueba usando este código con ProgressBar y funciona bien. Por lo tanto, le sugiero que se asegure de que a) el código que ha escrito se está ejecutando, yb) que el código está realizando el ajuste de tamaño en la barra de progreso correcta. He actualizado mi respuesta para incluir el código. –

+0

No he tenido la oportunidad de probar tu código todavía, pero los diseños que estoy definiendo completamente en el código. Entonces creo un RelativeLayout, luego agrego una vista secundaria que es una ProgressBar. setContentView luego se usa para agregar RelativeLayout. No hay layout.xml – Snowwire

0

También hay parámetros minWidth/minHeight/maxWidth/maxHeight, pero (creo) solo se pueden configurar a través de XML o mediante un estilo/tema.

De lo contrario, podría inflar su vista de ProgressBar desde XML.

+0

Intenté con lo que sugeriste, y pude cambiar la altura del widget, pero no el ancho. Por lo que pude ver, las propiedades de ancho máximo y mínimo deben ser las mismas para que el tamaño surta efecto. La propiedad de tamaño máximo no se puede cambiar en tiempo de ejecución, no está expuesta. – Snowwire

+0

¿Qué dirección es tu ProgressBar? El tamaño en la dirección de la barra de progreso debe estar determinado por el diseño, por lo general. – sstn

+0

Esto no es cierto, puede establecer los parámetros en código, utilizando LayoutParams –

0

Por lo tanto, es necesario definir su propio estilo de la barra de progreso:

<style name="SmallProgressBar" parent="android:Widget.ProgressBar"> 
    <item name="android:minHeight">10dip</item> 
    <item name="android:maxHeight">35dip</item> 
</style> 

Aquí, puede establecer min y max altura y la anchura de la barra de progreso y otras características interesantes.

Ahora, se establece en su estilo de diseño xml:

<ProgressBar 
    android:id="@+id/custom_edit_text_progress_bar" 
    style="@style/SmallProgressBar" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentEnd="true" 
    android:layout_alignParentTop="true" 
    android:visibility="visible"/> 

Cuando se infla la barra de progreso, que

getLayoutParams().height = 25 

y

getLayoutParams().width = 25 

para la barra de progreso y establecer la altura y ancho

NOTA: No puede exceder el alto y el ancho que definió en los estilos.

Cuestiones relacionadas