Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách đặt layout_weight cho Button động từ Java code Android

Giới thiệu

Ví dụ này minh họa cách tạo Button động (programmatically) và gán layout_weight thông qua LinearLayout.LayoutParams trong Java code.

Các bước thực hiện

Bước 1: Tạo dự án mới

Android Studio → File → New Project → Empty Activity.

Bước 2: Layout gốc (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:id="@+id/linearLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:gravity="center"
    android:padding="4dp"
    tools:context=".MainActivity">
</LinearLayout>

Bước 3: Code MainActivity (src/MainActivity.java)

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.LinearLayout;

public class MainActivity extends AppCompatActivity {

    LinearLayout linearLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        linearLayout = findViewById(R.id.linearLayout);

        // Button 1: weight = 0.3 (30% không gian)
        LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);
        params1.weight = 0.3f;
        Button button1 = new Button(this);
        button1.setText("Button 1 (30%)");
        button1.setLayoutParams(params1);
        linearLayout.addView(button1);

        // Button 2: weight = 0.7 (70% không gian)
        LinearLayout.LayoutParams params2 = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);
        params2.weight = 0.7f;
        Button button2 = new Button(this);
        button2.setText("Button 2 (70%)");
        button2.setLayoutParams(params2);
        linearLayout.addView(button2);
    }
}

Bước 4: Manifest (androidManifest.xml)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.sample">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                

Chạy ứng dụng

Kết nối thiết bị, nhấn Run. Hai Button chia sẻ chiều ngang theo tỷ trọng 30% - 70%.

Cách đặt layout_weight cho Button động từ Java code Android Cách đặt layout_weight cho Button động từ Java code Android

Giải thích kỹ thuật

  • LinearLayout.LayoutParams: Class tham số layout cho con của LinearLayout.
  • weight: Float, tỷ trọng không gian còn lại sau khi cấp phát kích thước cơ bản (wrap_content/match_parent).
  • width = WRAP_CONTENT + weight > 0: View sẽ mở rộng để lấp đầy tỷ trọng.
  • Tổng weight không cần = 1. Hệ thống chia tỷ lệ: viewWeight / totalWeight.

Mở rộng: Cập nhật weight tại runtime

// Lấy params hiện tại, ép kiểu
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) button.getLayoutParams();
params.weight = 0.5f; // Thay đổi weight
button.setLayoutParams(params); // Áp dụng lại
button.requestLayout(); // Yêu cầu layout lại

Kotlin Extension Function (Tiện ích)

fun View.setWeight(weight: Float) {
    val params = layoutParams as? LinearLayout.LayoutParams
            ?: LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)
    params.weight = weight
    layoutParams = params
}

// Sử dụng:
button1.setWeight(0.3f)
button2.setWeight(0.7f)

Lưu ý

  • Chỉ hoạt động trong LinearLayout (horizontal hoặc vertical).
  • ConstraintLayout không dùng weight, dùng app:layout_constraintWidth_percent (0.0-1.0) hoặc Chain/Barrier.
  • Tạo View động nhiều → cân nhắc RecyclerView + Adapter thay vì addView thủ công.