1. 程式人生 > >Android四種基本佈局

Android四種基本佈局

1.LinearLayout

  LinearLayout又稱為線性佈局,這個佈局會將它所包含的控制元件線上性方向上依次排列。

(1)android:orientation屬性

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"                             //垂直方向上排列

    tools:context="com.example.uilayouttest.MainActivity" >

</LinearLayout>

  android:orientation="vertical"                             //垂直方向上排列,控制元件高度不能指定為match_parent

  android:orientation="horizontal"                        //水平方向上排列,控制元件寬度不能指定為match_parent

(2)android:layout_gravity屬性

<Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        android:text="Button 1"
        />   
此屬性指定控制元件在佈局中的對齊方式,當android:orientation="vertical"時,只有水平方向上的對齊方式才會生效, left,center_horizontal,right,

                                                                    當android:orientation="horizontal"   時,只有垂直方向上的對齊方式才會生效,top,center_vertical,bottom

(3)android:layout_weight屬性

<EditText
        android:id="@+id/input_message"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:hint = "Type something"
        />
    <Button
        android:id="@+id/send"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Send"
        />
程式碼中將width屬性設定為0,表示這個控制元件的屬性不應該由width屬性確定,android:layout_weight="1"表示EditText和Button將在水平方向平分寬度

原理:系統首先把LinearLayout下的所有控制元件指定的layout_weight值相加,得到一個總值,然後每個控制元件所佔大小的比例就是用該控制元件的layout_weight值除以剛才算出的總值。

    <EditText
        android:id="@+id/input_message"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:hint = "Type something"
        />
    <Button
        android:id="@+id/send"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send"
        />

以上程式碼實現了,Button寬度由wrap_content計算,EditText則會佔滿螢幕所有的剩餘空間。

2.RelativeLayout

(1)控制元件相對於父佈局進行定位

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.uilayouttest.MainActivity" >
    
    <Button
        android:id = "@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"               //左上
        android:layout_alignParentTop="true"

        android:text="Button 1"
        />
    
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height = "wrap_content"
        android:layout_alignParentRight="true"          //右上
        android:layout_alignParentTop="true"

        android:text="Button 2"
        />
    
    <Button
        android:id = "@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"            //居中
        />
    
    <Button
        android:id = "@+id/button4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"         //左上
        android:layout_alignParentLeft="true"

        android:text = "Button 4"
        />
    
    <Button
        android:id="@+id/button5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"            //右下    
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"

        android:text="Button 5"
        />

</RelativeLayout>
(2)控制元件相對於控制元件進行定位

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.uilayouttest.MainActivity" >
    
    <Button
        android:id = "@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        />
    
    <Button
        android:id = "@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@id/button3"                           //button3左上方
        android:layout_toLeftOf="@id/button3"

        android:text="Button 1"
        />
    
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height = "wrap_content"
        android:layout_above="@id/button3"                          //button3右上方
        android:layout_toRightOf="@id/button3"

        android:text="Button 2"
        />
    
    <Button
        android:id = "@+id/button4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/button3"                        //button3左下方
        android:layout_toLeftOf="@id/button3"

        android:text = "Button 4"
        />
    
    <Button
        android:id="@+id/button5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/button3"                     //button3右下方
        android:layout_toRightOf="@id/button3"

        android:text="Button 5"
        />

</RelativeLayout>

注意:當一個控制元件去引用另一個控制元件的id時,該控制元件一定要定義在引用控制元件的後面,不然會出現找不到id的情況。

android:layout_alignLeft="@id/button3"表示一個控制元件的左邊緣和另一個控制元件的左邊緣對齊

android:layout_alignRight="@id/button3"表示一個控制元件的右邊緣和另一個控制元件的右邊緣對齊

android:layout_alignTop="@id/button3"表示一個控制元件的上邊緣和另一個控制元件的上邊緣對齊

android:layout_alignBottom="@id/button3"表示一個控制元件的下邊緣和另一個控制元件的下邊緣對齊

3.FrameLayout

此佈局沒有任何的定位方式,所有的控制元件都會擺放在佈局的左上角

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.uilayouttest.MainActivity" >
    
    <Button
        android:id = "@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text = "Button"
        />
    <ImageView
        android:id="@+id/image_view"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:src="@drawable/ic_launcher"
        />
</FrameLayout>

4.TableLayout

  此佈局允許我們使用表格的方式來排列控制元件

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:stretchColumns="1"                                                       //1表示如果表格不能完全佔滿螢幕寬度,就將第二列進行拉伸,0表示將第一列進行拉伸
    tools:context="com.example.uilayouttest.MainActivity" >
    
    <TableRow>                                                                                  //TableRow中的控制元件是不能指定寬度的
        <TextView
            android:id = "@+id/account_text_view"
            android:layout_height="wrap_content"
            android:text="Account:"
            />
        <EditText
            android:id="@+id/account_editText"
            android:layout_height="wrap_content"
            android:hint="Input your account"
            />
    </TableRow>
    
    <TableRow>
        
        <TextView
            android:id="@+id/passWord_textView"
            android:layout_height="wrap_content"
            android:text="PassWord:"
            />
        <EditText
            android:id="@+id/passWord_editText"
            android:layout_height="wrap_content"
            android:inputType="textPassword"                               //把EditText變為密碼輸入框
            />
        
    </TableRow>
    
    <TableRow >
        <Button
            android:id="@+id/logIn_button"
            android:layout_height="wrap_content"
            android:layout_span = "2"                                            //對單元格進行合併,讓登陸按鈕佔據兩列的空間
            android:text="Log in"
            />
    </TableRow>
</TableLayout>
5.引入佈局

通過建立一個新的佈局,使其他佈局呼叫他即可,避免程式碼重複。

title.xml檔案程式碼:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/title_bg">
    
    <Button
        android:id="@+id/title_back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="5dip"
        android:background="@drawable/back_bg"
        android:text="Back"
        android:textColor="#fff"
        />
    
    <TextView
        android:id = "@+id/title_text"
        android:layout_width="0dip"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_weight="1"
        android:gravity="center"
        android:text="Title Text"
        android:textColor="#fff"
        android:textSize="24sp"
        />
    <Button
        android:id="@+id/title_edit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="5dip"
        android:background="@drawable/edit_bg"
        android:text="Edit"
        android:textColor="#fff"
        />
</LinearLayout>

activity_main.xml程式碼:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.uicustomviews.MainActivity" >
    
    <include layout = "@layout/title"/>            //用此語句將標題欄佈局引入即可

</RelativeLayout>

6.建立自定義控制元件

TitleLayout類做自定義控制元件:

package com.example.uicustomviews;

import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;

public class TitleLayout extends LinearLayout
{
    public TitleLayout(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        LayoutInflater.from(context).inflate(R.layout.title, this);                      //實現動態載入佈局檔案R.layout.title,載入好的檔案的父佈局為this
        Button titleBack = (Button)findViewById(R.id.title_back);
        Button titleEdit = (Button)findViewById(R.id.title_back);
        
        titleBack.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                // TODO Auto-generated method stub
                ((Activity)getContext()).finish();
            }
        });
        
        titleEdit.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                // TODO Auto-generated method stub
                Toast.makeText(getContext(), "You clicked Edit button", Toast.LENGTH_LONG).show();
            }
        });
        
        // TODO Auto-generated constructor stub
    }

}

7.在編寫Android程式時,儘量將控制元件或佈局的大小指定成match_parent或wrap_content,如果必須要指定一個固定值,則使用dp來作為單位,

指定文字大小的時候使用sp作為單位。

獲得當前螢幕密度值:

        float xdpi = getResources().getDisplayMetrics().xdpi;
        float ydpi = getResources().getDisplayMetrics().ydpi;
        Log.d("MainActivity", "xdpi is" + xdpi);
        Log.d("MainActivity", "ydpi is" + ydpi);