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