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?

Adham
sumber
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.

Erich Douglass
sumber
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!

Kevin Coppock
sumber
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.

pkliang
sumber
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);
Ganindu
sumber
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.

Abu
sumber
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.

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

Shirish Herwade
sumber
3

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

((LinearLayout.LayoutParams) mView.getLayoutParams()).weight = 1;
SolidSnake
sumber
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)
    }
}
Hasan A Yousef
sumber