Bir TextView öğesinin yerleşim ağırlığını programlı olarak ayarlama


214

Dinamik olarak TableRownesneleri oluşturmak ve bir eklemek için çalışıyorum TableLayout. TableRowNesneler 2 öğe, bir sahiptir TextViewve CheckBox. TextViewÜrün itmek için 1'e onların düzen ağırlık seti olması gerekir CheckBoxsağında öğeleri.

Bir TextViewöğenin düzen ağırlığının programlı olarak nasıl ayarlanacağı ile ilgili belgeleri bulamıyorum .

Yanıtlar:


355

Bunun TableLayout.LayoutParamsgibi bir şeyle kullanmanız gerekir :

TextView tv = new TextView(v.getContext());
tv.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1f));

Son parametre ağırlıktır.


15
Bundan daha önce bahsetmedim, bu yüzden üzgünüm. Ama sorumu sormadan önce bunu denedim. TextView öğesini mizanpajdan kaybolur. Ancak, olumlu bir notta, TableLayout öğesinin stretch_columns özelliğinin 0 olarak ayarlanmasının aradığım etkiye neden olduğunu buldum (TextView en solda, CheckBoxes sağda). Yardım için teşekkürler.
eugene

8
Bir XML mizanpajı içe aktarıyorsanız ve mizanpajınızı dinamik olarak oluşturmuyorsanız, şu şekilde yakalayabilirsiniz:TextView tv = (TextView) findViewById(R.id.your_textview_inside_the_linearlayout); tv.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 0.1f));
Eric Leschinski

5
Düzen ağırlığını programlı olarak ayarlamak için TableRow.LayoutParamsyerine kullanılmalıdır TableLayout.LayoutParams. Bkz. @ Dorje'nin cevabı.
Halil

ithalat android.widget.LinearLayout; ithalat android.widget.TableLayout;
Prakash

1
Çoğu insanın WRAP_CONTENT yerine birinci veya ikinci parametre olarak (yatay veya dikey olmasına bağlı olarak) 0 kullanacağını, çünkü aradıklarının ağırlığı ayarlamak olduğunu unutmayın.
FlorianB

97

Cevap, LinearLayout.LayoutParams veya başka bir LayoutParams değil TableRow.LayoutParams kullanmanız gerektiğidir.

TextView tv = new TextView(v.getContext());
LayoutParams params = new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
tv.setLayoutParams(params);

Farklı LayoutParams değiştirilemez ve yanlış olanı kullanırsanız, hiçbir şey olmuyor gibi görünür. Metin görünümünün üst öğesi bir tablo satırıdır, dolayısıyla:

http://developer.android.com/reference/android/widget/TableRow.LayoutParams.html


Bu cevap bana çok yardımcı oldu ... TableLayout benim için çalışmadı
sham.y

Ah adamım, beni çok zaman kazandın. Nerede belirtilir? LayoutParams
Adrien Cadet

TableRow.LayoutParamsbenim için de iş yaptı
Menelaos Kotsollaris

6
Bu cevabın anahtar kısmı 0
Leon

Çalışma süremi azaltacak. Bunu uzun zamandır arıyorum.Çok harika bir çözüm
SIVAKUMAR.J

38

Daha önceki cevaplarda ağırlık yeni bir SomeLayoutType.LayoutParams nesnesinin yapıcısına iletilir. Yine de birçok durumda mevcut nesneleri kullanmak daha uygundur - ilgilenmediğimiz parametrelerle uğraşmaktan kaçınmaya yardımcı olur.

Bir örnek:

// Get our View (TextView or anything) object:
View v = findViewById(R.id.our_view); 

// Get params:
LinearLayout.LayoutParams loparams = (LinearLayout.LayoutParams) v.getLayoutParams();

// Set only target params:
loparams.height = 0;
loparams.weight = 1;
v.setLayoutParams(loparams);

loparams NULL olabilir böylece () setLayoutParams çağırmadan önce kontrol emin olun
AAGG

@Agg, pratik bir durumda değil. Genişlik ve yükseklik ayarlanmamışsa görünüm şişirilmezdi. Ama katılıyorum - null hakkında şüphelerin olup olmadığını kontrol etmek iyi bir uygulamadır.
sberezin

16
TextView txtview = new TextView(v.getContext());
LayoutParams params = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
txtview.setLayoutParams(params);

1f, ağırlık = 1; 2f veya 3f verebilirsiniz, görünümler alana göre hareket eder


12

sadece bu düzende düzen parametrelerini ayarlayın

param değişkeni yarat

 android.widget.LinearLayout.LayoutParams params = new android.widget.LinearLayout.LayoutParams(
            LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1f);

1f ağırlık değişkenidir

widget'ınızı veya düzeninizi aşağıdaki gibi ayarlayın

 TextView text = (TextView) findViewById(R.id.text);
 text.setLayoutParams(params);

1f ağırlık değişkeni anlamına gelen bu bilgiyi nereden edinebilirsiniz? Lütfen bir link verebilir misiniz?
hayonj

@hayonj sadece LinearLayout.LayoutParamsyapıcı kaynaklarını kontrol et . 3. parametre ağırlıktır. Veya dokümantasyon
mente

11
TextView text = new TextView(v.getContext());
text.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 
                                                LayoutParams.WRAP_CONTENT, 1f));

(VEYA)

TextView tv = new TextView(v.getContext());
LayoutParams params = new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
tv.setLayoutParams(params);

Lf, ağırlık = 1; ihtiyaca göre 2f veya 3f verebilirsiniz, görünümler uzaya göre hareket edecektir. Doğrusal düzen kullanımı içinde görünümler arasında belirtilen mesafeyi yapmak için weightsum "LinearLayout" için.

LinearLayout ll_Outer= (LinearLayout ) view.findViewById(R.id.linearview);
LinearLayout llInner = new LinearLayout(this);
            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FillParent, LinearLayout.LayoutParams.WrapContent);
            llInner.Orientation = Orientation.Horizontal;
            llInner.WeightSum = 2;
            ll_Outer.AddView(llInner);

8

Bu size uygun olmalı

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT LayoutParams.MATCH_PARENT);

param.weight=1.0f;

7

Bunun gibi ayrı olarak da ağırlık verebilirsiniz,

LayoutParams lp1 = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);

 lp1.weight=1;

6

Bu iş benim için ve umarım senin için de çalışır

İlk olarak üst görünüm için LayoutParams'ı ayarlayın:

myTableLayout.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.FILL_PARENT,
                TableLayout.LayoutParams.FILL_PARENT));

daha sonra TextView (alt öğe) için ayarlayın:

 TableLayout.LayoutParams textViewParam = new TableLayout.LayoutParams
     (TableLayout.LayoutParams.WRAP_CONTENT,
     TableLayout.LayoutParams.WRAP_CONTENT,1f);
     //-- set components margins
     textViewParam.setMargins(5, 0, 5,0);
     myTextView.setLayoutParams(textViewParam); 

1

Bunu yapmanın başka bir yolu var. Yalnızca bir parametre ayarlamanız gerekiyorsa, örneğin 'yükseklik':

TextView textView = (TextView)findViewById(R.id.text_view);
ViewGroup.LayoutParams params = textView.getLayoutParams();
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
textView.setLayoutParams(params);

1

4 saat boyunca mücadele ettikten sonra. Sonunda, Bu kod benim için çalıştı.

Arka arkaya 3 sütun var.

  TextView serialno = new TextView(UsersActivity.this);
  TextView userId = new TextView(UsersActivity.this);
  TextView name = new TextView(UsersActivity.this);

  serialno.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));
  userId.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));
  name.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));

-1

Buna çok benzer bir çözümle adil bir zorluk yaşadım: her biri ekran genişliğinin yarısı olan bir TableRow'da iki düğmeye sahip olmaya çalışıyorum. Hangi nedenle olursa olsun, sol düğme her zaman genişliğin yaklaşık% 70'i ve sağ düğme% 30 olacaktır. Table_layout.setStretchAllColumns (true) öğesinin çağrılmasının hiçbir etkisi olmamış, düğmenin genişliğini ekranın yarısına ayarlamamış veya yerleşim ağırlıklarını ayarlamamıştır.

Ben TableRows, bir LinearLayout iç içe olduğu ile sona erdi çözüm yoktu dikkate düğmeleri genişliğinin değerini alır.

    TableLayout layout = new TableLayout(this);
    TableRow top_row = new TableRow(this);
    left_button = styleButton();
    right_button = styleButton();
    LinearLayout toprow_layout = new LinearLayout (this);
    toprow_layout.setOrientation(LinearLayout.HORIZONTAL);
    toprow_layout.addView (left_button);
    toprow_layout.addView(right_button);
    toprow.addView(top_layout);
    layout.addView(top_row)

    private Button styleButton() {
            Button btn = new Button (this);
            android.view.Display display = ((android.view.WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();      
            btn.setWidth((int)(display.getWidth()/2));    // set width to half
            btn.setHeight(((int)display.getHeight()/6));  // set height to whatevs
            btn.setText("foo");
            return btn;
        }

1
Gelecek için bildiğiniz gibi, çözüm TableRow, Button1 ve Button2'yi hepsine sahip olarak layout_width=fill_parentayarlamak ve bunu yaptıktan sonra layout_weight=1hem button1 hem de button2 için. Fill_parent ve layout_weight = 1 olan tüm öğelere, enflasyon üzerine eşit boyut verilir.
edthethird
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.