Come posso impostare il valore dell'attributo layout_weightper button in android in modo dinamico dal codice java?
Come posso impostare il valore dell'attributo layout_weightper button in android in modo dinamico dal codice java?
Risposte:
Puoi passarlo come parte del LinearLayout.LayoutParamscostruttore:
LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT,
1.0f
);
YOUR_VIEW.setLayoutParams(param);
L'ultimo parametro è il peso.
param = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, (float) 1.0);
1fse non ci sono posizioni decimali
Relative
Utilizzare LinearLayout.LayoutParams:
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
params.weight = 1.0f;
Button button = new Button(this);
button.setLayoutParams(params);
EDIT: Ah, la risposta di Erich è più facile!
FILL_PARENTè stato deprecato e MATCH_PARENTdeve essere utilizzato invece.
MATCH_PARENTpuò essere utilizzato anziché FILL_PARENTanche su dispositivi meno recenti.
FILL_PARENTvs. MATCH_PARENT.
Se hai già definito la tua vista nel tuo file di layout (xml), vuoi solo cambiare il peso a livello di codice, in questo modo è meglio
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)
mButton.getLayoutParams();
params.weight = 1.0f;
mButton.setLayoutParams(params);
nuovo a LayoutParams sovrascrive altri parametri definiti nel file XML come i margini, oppure è necessario specificarli tutti in LayoutParams.
Se il costruttore con larghezza, altezza e peso non funziona, provare a utilizzare il costruttore con larghezza e altezza. E quindi impostare manualmente il peso.
E se vuoi che la larghezza sia impostata in base al peso, imposta la larghezza come 0 nel costruttore. Lo stesso vale per l'altezza. Di seguito il codice funziona per me.
LinearLayout.LayoutParams childParam1 = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT);
childParam1.weight = 0.3f;
child1.setLayoutParams(childParam1);
LinearLayout.LayoutParams childParam2 = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT);
childParam2.weight = 0.7f;
child2.setLayoutParams(childParam2);
parent.setWeightSum(1f);
parent.addView(child1);
parent.addView(child2);
Se qualcuno cerca una risposta, usa questo:
LinearLayout.LayoutParams lay = (LinearLayout.LayoutParams) myLayout.getLayoutParams();
lay.weight = 0.5;
Se stai inizializzando il tuo layout dal file xml, questo sarà molto più conveniente che fornire nuovi parametri di layout per il layout lineare.
layout_weightè già stata predisposta, è necessario chiamare View.requestLayout()per l'aggiornamento.
Qualsiasi LinearLayout.LayoutParamse ha TableLayout.LayoutParamsfunzionato per me, per i pulsanti quello giusto è TableRow.LayoutParams. Questo è:
TableRow.LayoutParams buttonParams = new TableRow.LayoutParams(
TableRow.LayoutParams.MATCH_PARENT,
TableRow.LayoutParams.WRAP_CONTENT, 1f);
Informazioni sull'uso MATCH_PARENTo WRAP_CONTENTlo stesso.
FILL_PARENTè stato deprecato e MATCH_PARENTdeve essere utilizzato invece.
LayoutParamsgenitore diretto. Presumo che tu abbia avuto un arresto nel tentativo di utilizzare LinearLayout.LayoutParamssenza il genitore LinearLayout.
Se hai già definito la tua vista nel file di layout (xml) e vuoi solo modificare il peso in modo grammaticale, quindi la creazione di nuovi LayoutParams sovrascrive altri parametri definiti nel tuo file xml.
Quindi prima dovresti usare "getLayoutParams" e poi setLayoutParams
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mButton.getLayoutParams();
params.weight = 4f;
mButton.setLayoutParams(params);
Se layoutparamsè già definito (in XML o in modo dinamico), ecco una riga:
((LinearLayout.LayoutParams) mView.getLayoutParams()).weight = 1;
Usando Kotlin puoi fare qualcosa del tipo:
import android.content.Context
import android.support.v4.content.ContextCompat
import android.support.v7.widget.CardView
import android.widget.*
import android.widget.LinearLayout
class RespondTo : CardView {
constructor(context: Context) : super(context) {
init(context)
}
private fun init(context: Context) {
val parent = LinearLayout(context)
parent.apply {
layoutParams = LinearLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.WRAP_CONTENT, 1.0f).apply {
orientation = LinearLayout.HORIZONTAL
addView(EditText(context).apply {
id = generateViewId()
layoutParams = LinearLayout.LayoutParams(0,
LinearLayout.LayoutParams.WRAP_CONTENT, 0.9f).apply {
}
})
addView(ImageButton(context).apply({
layoutParams = LinearLayout.LayoutParams(0,
LinearLayout.LayoutParams.WRAP_CONTENT, 0.1f)
background = null
setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_save_black_24px))
id = generateViewId()
layoutParams = RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT).apply {
addRule(RelativeLayout.ALIGN_PARENT_RIGHT)
// addRule(RelativeLayout.LEFT_OF, myImageButton.id)
}
}))
}
}
this.addView(parent)
}
}