Bagaimana cara mengatur atribut layout_weight secara dinamis dari kode?


245

Bagaimana saya bisa mengatur nilai untuk atribut layout_weightuntuk tombol di android secara dinamis dari kode java?


Ini akan sangat mirip dengan pertanyaan / jawaban ini: stackoverflow.com/questions/4638832/… dan yang ini: stackoverflow.com/questions/4637233/…
Rich Schuler

Jika Anda sudah menentukan tampilan dalam file tata letak (xml), kemudian membuat LayoutParams baru menimpa params lain yang ditentukan dalam file xml. Jadi, pertama-tama Anda harus menggunakan "getLayoutParams". Lihat jawaban lengkap stackoverflow.com/questions/4641072/…
Shirish Herwade

Jawaban:


463

Anda dapat meneruskannya sebagai bagian dari LinearLayout.LayoutParamskonstruktor:

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

Parameter terakhir adalah bobot.


2
Seharusnyaparam = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, (float) 1.0);
Mithun Sreedharan

49
Jika Anda tidak ingin melakukan double dari float, cukup beri nilai 1.0f
Xample

8
Atau bahkan lebih sederhana 1fjika tidak ada tempat desimal
sandalone

4
apa yang harus dilakukan jika tata letak indukRelative
Pratik Butani

9
@pratik jika tata letak induk relatif Anda tidak menggunakan bobot
invertigo

121

Gunakan 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, jawaban Erich lebih mudah!


27
Server Erich mungkin lebih mudah ditulis, tetapi milik Anda lebih mudah dibaca. Karena dikatakan atribut 1.0f digunakan untuk.
Johan

3
Anda menetapkan bahwa Anda dapat memodifikasi bobot saat itu dengan memanggil 'view.getLayoutParams ()' lalu ubah nilainya.
RobGThai

1
FILL_PARENTtelah usang dan MATCH_PARENTharus digunakan sebagai gantinya.
Simon Forsberg

2
@LocalPCGuy Tidak benar. Selama Anda menargetkan SDK> = 8 (yang memang seharusnya), MATCH_PARENTdapat digunakan sebagai pengganti FILL_PARENTbahkan pada perangkat yang lebih lama.
Kevin Coppock

2
@LocalPCGuy Tidak ada yang menggunakan API 7 atau kurang lagi . Jika Anda mencoba untuk membuat aplikasi yang kompatibel dengan API 7 atau kurang, Anda mungkin akan mengalami seluruh banyak masalah lain sebelum mengkhawatirkan FILL_PARENTvs MATCH_PARENT.
Simon Forsberg

82

Jika Anda sudah mendefinisikan tampilan dalam file tata letak (xml), hanya ingin mengubah bobot secara program, cara ini lebih baik

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

baru a LayoutParams menimpa params lain yang didefinisikan dalam file xml Anda seperti margin, atau Anda perlu menentukan semuanya di LayoutParams.


2
Dengan "params.weight = 1f;" Anda sudah mengatur bobot pada objek LayoutParams. Tidak perlu memanggil "mButton.setLayoutParams (params);".
MrMaffen

2
Tidak, Anda harus menelepon setLayoutParams
SIr Codealot

1
Ini sebenarnya jawaban paling elegan dan langsung mengubah objek UI tertentu. Jawaban terbaiknya juga bagus dan lebih tua dari pada posting ini. Jadi pantas sebagai jawaban terbaik. Saya memutakhirkan posting ini.
Android Asli

Solusi hebat dan sederhana!
Jeremy

Bekerja seperti pesona! Terima kasih banyak :)
Vinay Vissh

26

Jika konstruktor dengan lebar, tinggi dan berat tidak berfungsi, coba gunakan konstruktor dengan lebar dan tinggi. Dan kemudian secara manual mengatur berat.

Dan jika Anda ingin lebar diatur sesuai dengan berat, atur lebar sebagai 0 pada konstruktor. Hal yang sama berlaku untuk ketinggian. Kode di bawah ini berfungsi untuk saya.

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

Apa yang saya butuhkan! Setiap orang berbicara tentang mengatur bobot di sini, tidak ada yang ditampilkan apa yang terjadi ketika anak-anak yang ditimbang itu ditambahkan ke Parent View! Saya benar-benar mencari cara menambahkan weightSum di ParentView! Terima kasih!
sud007

14

Jika saya seseorang mencari jawaban, gunakan ini:

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

Jika Anda menginisialisasi tata letak Anda dari file xml, ini akan jauh lebih nyaman daripada memberikan parameter tata letak baru untuk Tata Letak Linear.


Ini harus menjadi jawaban yang diterima karena tidak mengubah variabel yang ditetapkan sebelumnya seperti lebar / tinggi / margin / padding dll. Semuanya disimpan dan digunakan kembali saat bobot diubah.
MrMaffen

1
Jika tampilan untuk diatur layout_weightsudah ditata, Anda perlu menelepon View.requestLayout()untuk memperbarui.
Attacktive

6

Salah satu dari LinearLayout.LayoutParams dan TableLayout.LayoutParamsbekerja untuk saya, untuk tombol yang tepat TableRow.LayoutParams. Itu adalah:

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

Tentang menggunakan MATCH_PARENTatau WRAP_CONTENTmenjadi sama.


3
FILL_PARENTtelah usang dan MATCH_PARENTharus digunakan sebagai gantinya.
Simon Forsberg

Saya pikir LayoutParams.MATCH_PARENT harus diubah menjadi 0.
CoolMind

Anda memanggil LayoutParamsorangtua langsung. Saya berasumsi Anda mengalami kerusakan saat mencoba menggunakan LinearLayout.LayoutParamstanpa orang tua LinearLayout.
Abandoned Cart

4

Jika Anda sudah mendefinisikan tampilan dalam file layout (xml) dan hanya ingin mengubah bobotnya tata bahasa, maka membuat LayoutParams baru akan menimpa params lain yang ditentukan dalam file xml Anda.

Jadi pertama-tama Anda harus menggunakan "getLayoutParams" dan kemudian setLayoutParams

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


3

Jika layoutparamssudah didefinisikan (dalam XML atau dinamis), Berikut ini adalah satu baris:

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

Jawaban yang diremehkan
Adam Higgins

0

Menggunakan Kotlin Anda dapat melakukan sesuatu seperti:

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)
    }
}
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.