Setel bobot tata letak TextView secara terprogram


214

Saya mencoba membuat TableRowobjek secara dinamis dan menambahkannya ke TableLayout. The TableRowbenda memiliki 2 item, seorang TextViewdan CheckBox. The TextViewitem harus memiliki tata letak set berat badan mereka untuk 1 untuk mendorong CheckBoxitem ke kanan.

Saya tidak dapat menemukan dokumentasi tentang cara mengatur berat tata letak suatu TextViewitem secara terprogram .

Jawaban:


355

Anda harus menggunakan TableLayout.LayoutParamssesuatu seperti ini:

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

Parameter terakhir adalah bobot.


15
Saya tidak menyebutkan ini sebelumnya, jadi saya minta maaf. Tetapi saya mencoba ini sebelum mengajukan pertanyaan saya. Itu membuat TextView menghilang dari tata letak. Tetapi, dengan catatan positif, saya menemukan bahwa menyetel properti stretch_columns dari TableLayout ke 0 menyebabkan efek yang saya cari (TextView di sebelah kiri, Kotak centang di sebelah kanan). Terima kasih untuk bantuannya.
eugene

8
Jika Anda mengimpor tata letak XML dan Anda tidak membuat tata letak secara dinamis, Anda dapat mengambilnya seperti ini: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
Untuk mengatur bobot tata letak secara terprogram, TableRow.LayoutParamssebaiknya digunakan sebagai ganti TableLayout.LayoutParams. Lihat jawaban @ Dorje.
Halil

impor android.widget.LinearLayout; impor android.widget.TableLayout;
Prakash

1
Perhatikan bahwa sebagian besar orang akan menggunakan 0 sebagai parameter pertama atau kedua (tergantung apakah horizontal atau vertikal) dan bukan WRAP_CONTENT karena yang mereka cari adalah mengatur bobot.
FlorianB

97

Jawabannya adalah Anda harus menggunakan TableRow.LayoutParams, bukan LinearLayout.LayoutParams atau LayoutParams lainnya.

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

LayoutParams yang berbeda tidak dapat dipertukarkan dan jika Anda menggunakan yang salah, sepertinya tidak ada yang terjadi. Induk tampilan teks adalah baris tabel, karenanya:

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


Jawaban ini banyak membantu saya ... TableLayout tidak bekerja untuk saya
sham.y

Ya ampun, kamu menyelamatkan saya begitu banyak waktu. Di mana itu ditentukan? Saya tidak menemukan apa pun dalam dokumentasi tentang Anda tidak dapat bertukarLayoutParams
Adrien Cadet

TableRow.LayoutParamsmelakukan pekerjaan untuk saya juga
Menelaos Kotsollaris

6
Bagian penting dari jawaban ini adalah 0
Leon

Ini akan mengurangi waktu kerja saya. Saya mencari ini untuk waktu yang lama. Solusi yang sangat bagus
SIVAKUMAR.

38

Dalam jawaban sebelumnya, berat diberikan ke konstruktor objek SomeLayoutType.LayoutParams yang baru. Masih dalam banyak kasus lebih mudah untuk menggunakan objek yang ada - itu membantu untuk menghindari berurusan dengan parameter yang kita tidak tertarik.

Sebuah contoh:

// 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 bisa jadi NULL jadi pastikan Anda memeriksa sebelum memanggil setLayoutParams ()
AAgg

@AAgg, tidak dalam situasi praktis. Tampilan tidak akan meningkat jika tidak ditetapkan lebar dan tinggi. Tapi saya setuju - ini praktik yang baik untuk memeriksa ketika ada keraguan tentang nol.
sberezin

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

1f dinyatakan sebagai berat = 1; Anda dapat memberikan 2f atau 3f, tampilan akan memindahkan aksen ke ruang


12

hanya mengatur tata letak params di tata letak seperti itu

buat variabel param

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

1f adalah variabel bobot

atur widget atau tata letak Anda

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

di mana Anda mendapatkan informasi ini yang berarti variabel bobot? Bisakah Anda memberikan tautan?
hayonj

@hayonj cukup periksa sumber LinearLayout.LayoutParamskonstruktor. Parameter ke-3 adalah bobot. Atau dokumentasi
mente

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

(ATAU)

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

1f disebut sebagai berat = 1; sesuai dengan kebutuhan Anda, Anda dapat memberikan 2f atau 3f, tampilan akan memindahkan accoding ke ruang. Untuk membuat jarak yang ditentukan antara tampilan dalam tata letak Linear gunakan weightsum untuk "LinearLayout".

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

Ini seharusnya bekerja untuk Anda

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

param.weight=1.0f;

7

Anda juga dapat memberikan bobot secara terpisah seperti ini,

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

 lp1.weight=1;

6

Ini bekerja untuk saya, dan saya harap ini akan bekerja untuk Anda juga

Tetapkan LayoutParams untuk tampilan induk terlebih dahulu:

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

kemudian atur untuk TextView (anak):

 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

Ada cara lain untuk melakukan ini. Jika Anda hanya perlu menetapkan satu parameter, misalnya 'tinggi':

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

1

Setelah berjuang selama 4 jam. Akhirnya, kode ini bekerja untuk saya.

3 Kolom ada berturut-turut.

  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

Saya memiliki cukup banyak kesulitan dengan solusi sesuatu yang sangat mirip dengan ini: mencoba untuk memiliki dua tombol di TableRow, dengan masing-masing menjadi setengah lebar layar. Untuk alasan apa pun, tombol kiri akan selalu sekitar 70% dari lebar, dan tombol kanan 30%. Memanggil table_layout.setStretchAllColumns (true) tidak berpengaruh, juga tidak mengatur lebar tombol menjadi setengah layar, atau mengatur berat tata letak mereka.

Solusi saya berakhir dengan itu bersarang sebuah LinearLayout di TableRows, yang tidak memperhitungkan nilai dari lebar tombol.

    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
Supaya Anda tahu untuk masa depan, solusinya adalah mengatur TableRow, Button1, dan Button2 untuk semua miliki layout_width=fill_parent, dan setelah melakukan itu, atur layout_weight=1untuk kedua button1 dan button2. Semua elemen dengan fill_parent dan layout_weight = 1 akan diberi ukuran yang sama pada inflasi.
edthethird
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.