2015-02-02 11 views
8

so come impostare la larghezza e l'altezza di una vista utilizzando LayoutParams tramite la seguente procedura:Android layout Parametri modificare solo la larghezza e l'altezza

android.view.ViewGroup.LayoutParams params = button.getLayoutParams(); 
params.width = height/7; 
params.height = height/10; 
button.setLayoutParams(params); 

Ora, non appena voglio applicare la stessa altezza e la larghezza a un altro pulsante, ho bisogno di creare un altro LayoutParams o sovrascrivere quello esistente come qui:

android.view.ViewGroup.LayoutParams params2 = but2.getLayoutParams(); 
params2.width = height/7; 
params2.height = height/10; 
but2.setLayoutParams(params2); 

ho circa 50 pulsanti nella mia applicazione e dubito si considera buona codice per ottenere tutti i parametri in ordine per cambiare solo la larghezza e l'altezza - I desidera mantenere i parametri rimanenti (toLeftOf, [...]).

C'è un modo per modificare SOLO la larghezza e l'altezza dei parametri ma mantenere il resto dei parametri? Quindi sembra qualcosa del tipo:

android.view.ViewGroup.LayoutParams params = button.getLayoutParams(); 
params.width = height/7; 
params.height = height/10; 
button.setLayoutParams(params); 
button2.setLayoutParams(params); 
button3.setLayoutParams(params); 
butt[...] 

Grazie mille in anticipo.

+0

Tutti i pulsanti hanno la stessa larghezza e altezza? – iRuth

+0

larghezza! = Altezza, ma altezza (pulsante) == altezza (pulsante + 1) e larghezza (pulsante) == larghezza (pulsante + 1) – user2875404

+0

È per tutti i pulsanti? O solo per 2? – iRuth

risposta

25

L'intero scopo dell'utilizzo del metodo getLayoutParams() consiste nel prelevare quelli esistenti da un View (che mantengono tutte le regole e tutto quanto). Quindi è possibile modificare i parametri specifici di quelli LayoutParams e mantenere il resto non modificato. Pertanto è necessario per chiamare getLayoutParams() e modificare l'oggetto restituito se il proprio Views varia nelle impostazioni in xml. Nel caso in cui stessero usando le stesse identiche regole in xml, potresti farlo proprio come hai scritto nel tuo ultimo esempio.

Quello che vorrei suggerire di fare è solo creare un metodo che avvolga l'intero processo di aggiornamento LayoutParams. In questo modo:

private void setDimensions(View view, int width, int height){ 
    android.view.ViewGroup.LayoutParams params = view.getLayoutParams(); 
    params.width = width; 
    params.height = height; 
    view.setLayoutParams(params); 
} 

Questo semplificherebbe il codice in modo significativo, perché allora si può chiamare questo metodo per ogni singolo dei pulsanti, con i valori corretti per larghezza e altezza.

setDimensions(button, height/7, height/10); 
setDimensions(button2, height/7, height/10); 
setDimensions(button3, height/7, height/10); 
-1

Se si desidera impostare dimensioni diverse per componenti diversi, suggerisco di farlo all'interno di XML invece di farlo all'interno di JAVA. Otterrai risultati molto migliori e sarà ottimale.

+1

Funzionerebbe se potessi fare calcoli in xml .. Ma ora come xml prende solo valori assoluti non posso fare cose come screenWidth/8 – user2875404

+0

In realtà puoi mischiare entrambi gli approcci per ottenere i migliori risultati, quindi puoi semplicemente usare XML quando ne hai bisogno di nuovo È possibile estendere il layout che si desidera eseguire in una classe come 'AdjustableButton.java' e si possono introdurre attributi con' declare-styleable'. Alla fine si darebbe il valore percentuale come, ad esempio: 'app: height_weight =" 0.8 "' e fare la logica per questo all'interno di 'AdjustableButton.java'. – rencsaridogan

1

In Kotlin possiamo farlo più breve e più elegante:

view.layoutParams = view.layoutParams.apply { 
    width = LayoutParams.MATCH_PARENT 
    height = LayoutParams.WRAP_CONTENT 
} 
+1

Questo è bello, anche se preferisco una funzione di estensione perché può fare automaticamente il setLayoutParams. (Posterò un'altra risposta) – aaaidan

1

Come altre risposte hanno detto: è necessario getLayoutParams(), alterano le LayoutParams restituiti oggetto, e setLayoutParams() con esso (se questa è una ragionevole API è in discussione).

Ma come comm1x dice, Kotlin può rendere questo molto semplice e facile da leggere.

ne dite di questo:

button.alterLayoutParams { 
    it.width = height/7 
    it.height = height/10 
} 

Ciò richiede una funzione di estensione:

private fun View.alterLayoutParams(callback: ((ViewGroup.LayoutParams) -> Unit)) { 
    val p = this.layoutParams 
    callback(p) 
    this.layoutParams = p 
} 

Se si voleva applicare gli stessi parametri di layout a più View s, si può fare qualcosa di simile:

listOf(button, button2, button3).forEach { b -> 
    b.alterLayoutParams { 
     it.width = height/7 
     it.height = height/10 
    } 
} 

PS. Kotlin è a dir poco fantastico.