Android – Quản lý Layout

3/5 - (1 vote)

Trong phần này chúng ta sẽ tìm hiểu một số loại layout trong Android.

Layout sẽ quy định kích thước cũng như sự sắp xếp của các View trên màn hình. Android có rất nhiều lớp layout, LinearLayout sẽ sắp xếp các View trên một hàng hoặc một cột, FrameLayout chỉ hiển thị một View, RelativeLayout sắp xếp các View theo mối quan hệ giữa chúng, GridLayout sắp xếp các View theo dạng bảng.

Hiển thị ảnh với FrameLayout

Bên trong thư mục res của project có các thư mục drawable để chúng ta đặt các file tài nguyên vào trong đó và chúng ta có thể tham chiếu đến chúng trong file layout dễ dàng. Chẳng hạn ở đây mình đặt một file ảnh với tên zamok.jpg trong thư mục drawable-hdpi.

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_gravity="top" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" >
    
    <ImageView android:layout_height="match_parent" 
        android:layout_width="match_parent" 
        android:src="@drawable/zamok" />        
</FrameLayout>

Trong file main.xml, chúng ta sử dụng FrameLayout làm ViewGroup chính, bên trong FrameLayout này chúng ta đặt một thẻ ImageView.

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_gravity="top" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" >

Thuộc tính layout_gravity sẽ bố trí FrameLayout ở các vị trí khác nhau, ở đây top tức là đưa lên đầu màn hình, ngoài ra còn có các giá trị khác như bottom, left, right, center... Thuộc tính layout_widthlayout_height với giá trị wrap_content sẽ quy định kích thước layout vừa đủ để bọc lấy các thành phần bên trong nó.

<ImageView android:layout_height="match_parent" 
    android:layout_width="match_parent"
    android:src="@drawable/zamok" />

Lớp ImageView sẽ hiển thị ảnh, đường dẫn đến file ảnh được truyền vào thuộc tính android:src.

Capture

LinearLayout

Trong ví dụ dưới đây, chúng ta sẽ thiết kế một hàng các Button.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    
  <Button 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:text="Button1" />

  <Button 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:text="Button2" />
      
  <Button 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content"
        android:text="Button3" />
      
  <Button 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:text="Button4" />      
      
</LinearLayout>

Lớp LinearLayout sẽ sắp xếp các View theo hàng hoặc theo cột.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" >

Thuộc tính widthheight có giá trị match_parent tức là vừa khít với kích thước của thiết bị.

<Button android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:text="Button1" />

Mỗi Buttonwidthheightwrap_content, tức là kích thước của chúng vừa đủ để bọc lấy đoạn text bên trong nó.

Capture

Thiết kế bằng Java

Ngoài việc thiết kế trong file layout, chúng ta cũng có thể thiết kế trong file Activity.

package com.phocode;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.LinearLayout;

public class MainActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
 
        Button btn1 = new Button(this);
        btn1.setText("Button");
 
        Button btn2 = new Button(this);
        btn2.setText("Button");
 
        Button btn3 = new Button(this);
        btn3.setText("Button");
 
        Button btn4 = new Button(this);
        btn4.setText("Button");
 
        LinearLayout ll = new LinearLayout(this);
        ll.setOrientation(LinearLayout.HORIZONTAL);
 
        ll.addView(btn1);
        ll.addView(btn2);
        ll.addView(btn3);
        ll.addView(btn4);
 
        setContentView(ll);
    }
}

Ở đây chúng ta cũng thiết kế lại giống như ví dụ trước là đặt 4 Button nằm trên cùng một hàng.

Button btn1 = new Button(this);
btn1.setText("Button");

Để tạo Button thì chúng ta dùng tới lớp android.widget.Button, phương thức setText() sẽ thiết lập nội dung Button.

LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.HORIZONTAL);

Tương tự với lớp android.widget.LinearLayout.

ll.addView(btn1);
ll.addView(btn2);
ll.addView(btn3);
ll.addView(btn4);

Phương thức addView() sẽ thêm các View vào layout.

setContentView(ll);

Phương thức setContentView() sẽ nhận đối tượng LinearLayout thay vì nhận ID của file XML như trước.

Kết hợp các Layout

Chúng ta có thể lồng các layout vào nhau để kết hợp chúng lại.

<?xml version="1.0" encoding="utf-8"?>  
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" >  
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        android:orientation="vertical" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" >

        <Button 
            android:layout_height="wrap_content" 
            android:layout_width="wrap_content" 
            android:text="Button" />    
        
        <Button 
            android:layout_height="wrap_content" 
            android:layout_width="wrap_content" 
            android:text="Button" />    
        
        <Button 
            android:layout_height="wrap_content" 
            android:layout_width="wrap_content" 
            android:text="Button" />    
        
        <Button 
            android:layout_height="wrap_content" 
            android:layout_width="wrap_content" 
            android:text="Button" />               
    </LinearLayout>
</FrameLayout>   

Trong ví dụ này chúng ta lồng LinearLayout vào bên trong Framelayout.

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" > 

FrameLayout có kích thước vừa đủ để bọc lấy các phần tử bên trong nó. Các phần tử bên trong FrameLayout sẽ nằm chính giữa màn hình theo thuộc tính layout_gravitycenter.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" >

LinearLayout bên trong FrameLayout chứa 4 Button được sắp xếp theo chiều dọc.

Capture

RelativeLayout

RelativeLayout sắp xếp các View dựa trên vị trí của chúng với nhau hoặc với View cha.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" >
    
    <EditText 
        android:id="@+id/etId" 
        android:layout_marginTop="10dp" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" />  
        
    <Button 
        android:id="@+id/btn_sendId" 
        android:layout_below="@+id/etId" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="Send" />          
          
    <Button 
       android:id="@+id/btn_clearId" 
       android:layout_below="@+id/etId" 
       android:layout_toRightOf="@+id/btn_sendId" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="Clear" />    
     
</RelativeLayout>  

Trong ví dụ này chúng ta hiển thị 1 EditText và 2 Button.

<EditText 
    android:id="@+id/etId" 
    android:layout_marginTop="10dp" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" /> 

EditText sẽ có bề ngang chiếm toàn bộ màn hình, chiều cao chỉ vừa đủ bọc lấy đoạn text bên trong. Ngoài ra thuộc tính marginTop quy định EditText cách cạnh trên của màn hình 10dp.

<Button 
    android:id="@+id/btn_sendId" 
    android:layout_below="@+id/etId" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Send" />   

Chúng ta có 2 Button, trong đó Button “Send” sẽ được đặt phía dưới EditText nhờ vào thuộc tính layout_below, thuộc tính này nhận id của EditText.

<Button 
    android:id="@+id/btn_clearId" 
    android:layout_below="@+id/etId" 
    android:layout_toRightOf="@+id/btn_sendId" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Clear" />   

Button “Clear” được đặt phía dưới EditText và nằm phía bên phải Button “Send”, ở đây chúng ta dùng thêm thuộc tính layout_toRightOf để chỉ định View nằm phía bên phải của View nào.Capture

GridLayout

GridLayout sắp xếp các View con theo dạng bảng, bảng bao gồm nhiều hàng và cột, hàng và cột giao nhau tạo thành các ô, một View có thể chiếm một hoặc nhiều ô. Thuộc tính gravity cho biết View sẽ được đặt ở đâu trong bảng.

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" >
    
    <Button 
        android:text="(0, 0)" 
        android:layout_row="0" 
        android:layout_column="0" />    
       
    <Button 
        android:layout_row="0" 
        android:layout_column="1" 
        android:layout_columnSpan="2" 
        android:layout_gravity="fill_horizontal" />       
      
    <Button 
        android:text="(0, 3)" 
        android:layout_row="0" 
        android:layout_column="3" />       
    
    <Button 
        android:text="(0, 4)" 
        android:layout_row="0" 
        android:layout_column="4" />       
      
    <Button 
        android:layout_row="1" 
        android:layout_column="0" 
        android:layout_rowSpan="3" 
        android:layout_columnSpan="5" 
        android:layout_gravity="fill" />   
      
    <Button 
        android:text="Center" 
        android:layout_row="4" 
        android:layout_column="0" 
        android:layout_columnSpan="5" 
        android:layout_gravity="center_horizontal" />      
      
    <Button 
        android:text="Right" 
        android:layout_row="5" 
        android:layout_column="0" 
        android:layout_columnSpan="5" 
        android:layout_gravity="right" />           
    
</GridLayout>

Trong ví dụ này chúng ta có một GridLayout chứa một nhóm các Button.

<Button 
    android:text="(0, 0)" 
    android:layout_row="0" 
    android:layout_column="0" />  

Thuộc tính layout_row biểu thị số hàng còn thuộc tính layout_column biểu thị số cột, ở đây hàng 0 cột 0 tức là Button này nằm ở góc trái phía trên bảng.

<Button 
    android:layout_row="0" 
    android:layout_column="1" 
    android:layout_columnSpan="2" 
    android:layout_gravity="fill_horizontal" /> 

Button ở đoạn code trên nằm ở ô (0,1) nhưng có chiều ngang dài thêm 2 ô do được thiết lập trong thuộc tính columnSpan nhưng chúng ta phải khai báo thêm thuộc tính layout_gravityfill_horizontal, nếu không thì Button này vẫn sẽ có kích thước như cũ.

<Button 
    android:layout_row="1" 
    android:layout_column="0" 
    android:layout_rowSpan="3" 
    android:layout_columnSpan="5" 
    android:layout_gravity="fill" /> 

Tương tự Button ở đoạn code trên nằm ở hàng 1 cột 0, thuộc tính layout_rowSpan quy định chiều cao của Button này dài thêm 3 hàng, thuộc tính columnSpan quy định Button này dãn kích thước theo chiều ngang thêm 5 cột nữa, thuộc tính layout_gravity là fill sẽ lấp đầy khoảng trống được dãn ra đó.

<Button 
    android:text="Center" 
    android:layout_row="4" 
    android:layout_column="0" 
    android:layout_columnSpan="5" 
    android:layout_gravity="center_horizontal" />  

Button ở đoạn code trên nằm ở giữa cột nhờ vào thuộc tính layout_gravitycenter_horizontal.

Capture

0 0 votes
Article Rating
Subscribe
Thông báo cho tôi qua email khi
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments