2011-02-15 6 views
7

Sto creando un'interfaccia utente dal codice e posso aggiungere con successo i widget ProgressBar, tuttavia non posso modificare le dimensioni del widget sui valori che mi servono, rimane sempre nella dimensione predefinita (intorno 50dp). Ho provato il seguente codice;Modifica la larghezza di una ProgressBar aggiunta in fase di esecuzione

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

Ho anche provato a installare i LayoutParams Progressbar ma ancora niente e ho provato avvolgendo il widget in un altro layout, ma ancora non fortuna.

Qualcuno può aiutare, visto che non riesco a vedere come si fa? Se esiste una soluzione che utilizza XML, potrebbe funzionare, ma devo impostare la dimensione e il percorso in fase di esecuzione.


Per Progress XML ho utilizzato quanto segue.

<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" 
    /> 

Quindi il codice per gonfiarlo è il seguente. Questo è un mix di ciò di cui abbiamo discusso.

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

Immagino che una soluzione sarebbe quella di copiare il codice sorgente per il widget e implementare i metodi mancanti. Sembra una soluzione pazzesca, ci deve essere un modo per farlo. – Snowwire

+0

Giusto per confermare: stai cercando gli stili della barra, non gli stili di selezione? Probabilmente sarebbe sufficiente scoprire dove sono definiti gli stili/forme e copiarli e regolarli. – sstn

risposta

9

R.layout.activity include questo:

<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" 
/> 

E poi il codice:

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 chiamata al metodo invalidate() è importante in quanto cioè quando la vista viene ridisegnato per tenere conto delle modifiche. Sebbene non intuitivo, consente prestazioni migliori grazie alle modifiche in batch.

+0

Ho provato il metodo suggerito, ma non ha avuto alcun effetto sulla dimensione. – Snowwire

+0

Ho dettagliato due metodi che è necessario utilizzare, chiamarne uno da solo non funzionerà. Ho appena creato un'attività di test utilizzando questo codice con un ProgressBar e funziona perfettamente. Quindi ti suggerisco di assicurarti che a) il codice che hai scritto sia in esecuzione, e b) che il codice stia modificando la dimensione sulla barra di avanzamento corretta. Ho aggiornato la mia risposta per includere il codice. –

+0

Non ho ancora avuto la possibilità di provare il tuo codice, ma i layout che sto definendo completamente nel codice. Quindi creo un RelativeLayout, quindi aggiungo una vista figlio che è una ProgressBar. setContentView viene quindi utilizzato per aggiungere RelativeLayout. Non c'è layout.xml – Snowwire

0

Ci sono anche i parametri minWidth/minHeight/maxWidth/maxHeight, ma (penso) possono essere impostati solo tramite XML o tramite uno stile/tema.

In caso contrario, è possibile gonfiare la vista ProgressBar da XML.

+0

Ho provato quello che hai suggerito, e ho potuto ottenere l'altezza del widget da modificare, ma non la larghezza. Da quello che ho potuto vedere, le proprietà della larghezza massima e minima devono essere le stesse affinché la dimensione abbia effetto. La proprietà della dimensione massima non può essere modificata in fase di esecuzione, non è esposta. – Snowwire

+0

Qual è la direzione di ProgressBar? La dimensione nella direzione della barra di avanzamento dovrebbe essere determinata dal layout, di solito. – sstn

+0

Questo non è vero, è possibile impostare i parametri nel codice, utilizzando LayoutParams –

0

Quindi, è necessario definire il proprio stile per la barra di avanzamento:

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

Qui, è possibile impostare min e max altezza e la larghezza della barra di avanzamento e altre funzioni interessanti.

Ora, si imposta in xml layout in stile:

<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"/> 

quando si gonfia la vostra barra di avanzamento, si

getLayoutParams().height = 25 

e

getLayoutParams().width = 25 

per barra di avanzamento e impostare l'altezza e larghezza.

NOTA: Non è possibile superare l'altezza e la larghezza definite negli stili.

Problemi correlati