Layout_weight özniteliği koddan dinamik olarak nasıl ayarlanır?


245

layout_weightJava kodundan androidde düğme özelliğinin değerini nasıl dinamik olarak ayarlayabilirim ?



Düzen (xml) dosyasında zaten görünüm tanımladıysanız, yeni LayoutParams oluşturmak xml dosyasında tanımlanan diğer parametrelerin üzerine yazar. Yani önce "getLayoutParams" kullanmalısınız. Cevabı görmek için bkz. Stackoverflow.com/questions/4641072/…
Shirish Herwade

Yanıtlar:


463

LinearLayout.LayoutParamsYapıcı bir parçası olarak geçirebilirsiniz :

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
    LayoutParams.MATCH_PARENT,
    LayoutParams.MATCH_PARENT,
    1.0f
);
YOUR_VIEW.setLayoutParams(param);

Son parametre ağırlıktır.


2
O olmalıparam = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, (float) 1.0);
Mithun Sreedharan

49
Bir
çiftten

8
Veya 1fondalık basamak yoksa daha basit ifade
sandalone 27:13

4
ebeveyn düzeni ise ne yapmalıRelative
Pratik Butani

9
@pratik ana düzen göreceli ise ağırlık kullanmazsınız
invertigo

121

Kullanım 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, Erich'ın cevabı daha kolay!


27
Erich'ın anser'ini yazmak daha kolay olabilir, ama seninkini okumak daha kolaydır. 1.0f hangi özellik için kullanıldığını söylediğinden.
Johan

3
sizinki, 'view.getLayoutParams ()' öğesini çağırarak ağırlığı değiştirebildiğinizi ve ardından değeri değiştirebileceğinizi belirledi.
RobGThai

1
FILL_PARENTkullanımdan kaldırılmıştır ve MATCH_PARENTbunun yerine kullanılmalıdır.
Simon Forsberg

2
@LocalPCGuy Doğru değil. SDK'yı hedeflediğiniz sürece = = 8 (ki mutlaka olması gerekir), eski cihazlarda bile MATCH_PARENTkullanılabilir FILL_PARENT.
Kevin Coppock

2
@LocalPCGuy Artık hiç kimse API 7 veya daha azını kullanmıyor . Uygulamanızı API 7 veya daha azıyla uyumlu hale getirmeye çalışıyorsanız, FILL_PARENTvs. ile ilgili endişelenmeden önce büyük olasılıkla bir sürü başka sorunla karşılaşırsınız MATCH_PARENT.
Simon Forsberg

82

Görünümünüzü düzen (xml) dosyanızda zaten tanımladıysanız, yalnızca ağırlığı programlı olarak değiştirmek istiyorsanız, bu şekilde daha iyidir

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)   
mButton.getLayoutParams();
params.weight = 1.0f;
mButton.setLayoutParams(params);

yeni bir LayoutParams, kenar boşlukları gibi xml dosyanızda tanımlanan diğer parametrelerin üzerine yazar veya tümünü LayoutParams'ta belirtmeniz gerekir.


2
"Params.weight = 1f;" zaten LayoutParams nesnesinde ağırlığı ayarlıyorsunuz. "MButton.setLayoutParams (params);" demeye gerek yoktur.
MrMaffen

2
Hayır, setLayoutParams
SIr Codealot'ı

1
Bu aslında en zarif cevaptır ve doğrudan belirli bir UI nesnesini değiştirir. En iyi cevap bu yazıdan daha iyi ve daha eski. Bu yüzden en iyi cevabı hak ediyor. Yine de bu gönderiyi iptal ettim.
Orijinal Android

Harika ve basit bir çözüm!
Jeremy

Tıkır tıkır çalışıyor! Çok teşekkürler :)
Vinay Vissh

26

Genişlik, yükseklik ve ağırlıktaki kurucu çalışmıyorsa, genişlik ve yükseklikteki kurucuyu kullanmayı deneyin. Ve sonra ağırlığı manuel olarak ayarlayın.

Genişliğin ağırlığa göre ayarlanmasını istiyorsanız, yapıcıda genişliği 0 olarak ayarlayın. Aynı şey yükseklik için de geçerlidir. Aşağıdaki kod benim için çalışıyor.

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

Tam ihtiyacım olan şey! Herkes burada ağırlık ayarlamaktan bahsediyor, hiç kimse tartılmış Çocuklar Ebeveyn Görüşüne eklendiğinde ne olduğunu göstermedi! Aslında ParentView üzerinde weightSum eklemek için bakıyordu! Teşekkürler!
sud007

14

Birisi cevap arıyorsanız, bunu kullanın:

LinearLayout.LayoutParams lay = (LinearLayout.LayoutParams) myLayout.getLayoutParams();
lay.weight = 0.5;

Düzeninizi xml dosyasından başlatıyorsanız, bu, Doğrusal Düzen için yeni düzen parametreleri sağlamaktan çok daha uygun olacaktır.


Bu, genişlik / yükseklik / kenar boşluğu / dolgu vb. Gibi önceden ayarlanmış değişkenleri değiştirmediği için kabul edilen cevap olmalıdır.
MrMaffen

1
Ayarlanacak görünüm layout_weightönceden düzenlenmişse, View.requestLayout()güncellemek için arama yapmanız gerekir .
Saldırgan

6

Herhangi biri LinearLayout.LayoutParamsve TableLayout.LayoutParamsbenim için çalıştı, düğmeler için doğru olanı TableRow.LayoutParams. Yani:

            TableRow.LayoutParams buttonParams = new TableRow.LayoutParams(
                    TableRow.LayoutParams.MATCH_PARENT,
                    TableRow.LayoutParams.WRAP_CONTENT, 1f);

Kullanma MATCH_PARENTya WRAP_CONTENTda aynı olma hakkında.


3
FILL_PARENTkullanımdan kaldırılmıştır ve MATCH_PARENTbunun yerine kullanılmalıdır.
Simon Forsberg

Bence LayoutParams.MATCH_PARENT 0 olarak değiştirilmelidir.
CoolMind

LayoutParamsDoğrudan ebeveynin adını çağırırsınız . LinearLayout.LayoutParamsEbeveyn olmadan kullanmaya çalışan bir kilitlenme olduğunu varsayıyorum LinearLayout.
Terk Edilmiş Sepet

4

Eğer varsa zaten düzen (xml) dosyasında görünümünüzü tanımlanmış ve sadece ağırlığını değiştirmek istediğiniz sonra o zaman xml dosyasında tanımlanan yeni LayoutParams üzerinde yazma diğer params oluşturarak, dilbilgisi pro.

Yani önce "getLayoutParams" kullanmalı ve sonra setLayoutParams

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mButton.getLayoutParams(); params.weight = 4f; mButton.setLayoutParams(params);


3

Eğer layoutparamszaten (XML veya dinamik olarak) tanımlanır, burada bir astar var:

((LinearLayout.LayoutParams) mView.getLayoutParams()).weight = 1;

Yetersiz cevap
Adam Higgins

0

Kotlin'i kullanarak aşağıdakileri yapabilirsiniz:

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)
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.