前面大概瞭解了兩個常用的佈局,線性佈局和相對佈局,接下來看看其他佈局
一、TableLayout
TableLayout繼承LinearLayout,其有個特殊的子節點TableRow,這個TableRow相當於一個orientation屬性值爲horizontal的LinearLayout,然後添加多個TableRow排成多行,形成一個類似表格的界面。
TableLayout常用的屬性:
android:shrinkColumns 設置允許被收縮的列的序列號
android:stretchColumns設置允許被拉伸的列的序列號
android:collapseColumns設置需要被隱藏的序列號
序列號指TableRow裏的子組件的從左至右的順序,並且從0開始,選擇多個序列號時可以用逗號隔開
基本使用:
<?xml version="1.0" encoding="utf-8"?>
<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,2"
android:collapseColumns="0"
tools:context="com.example.yougel.otherlayoutdemo.TableLayoutActivity">
<TableRow>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按鈕一"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按鈕二"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按鈕三"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按鈕四"
/>
</TableRow>
<TableRow>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按鈕五"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按鈕六"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按鈕七"
/>
</TableRow>
<TableRow>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按鈕八"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按鈕九"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按鈕十"
/>
</TableRow>
</TableLayout>
二、FrameLayout
FrameLayout(幀佈局)也有的叫層佈局,層佈局的概念佈局好理解,所以我就用層的概念來總結一下FrameLayout
我們從手機來看的FrameLayout:
其實它是層層佈局的,從3D角度看:
(當然樓主畫工差就不過多自槽)
基本使用:
<?xml version="1.0" encoding="utf-8"?>
<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"
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.yougel.otherlayoutdemo.FrameLayoutActivity">
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@color/color1"
android:width="320dp"
android:height="320dp"
/>
<TextView
android:id="@+id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@color/color2"
android:width="280dp"
android:height="280dp"
/>
<TextView
android:id="@+id/text3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@color/color3"
android:width="240dp"
android:height="240dp"
/>
<TextView
android:id="@+id/text4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@color/color4"
android:width="200dp"
android:height="200dp"
/>
<TextView
android:id="@+id/text5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@color/color5"
android:width="160dp"
android:height="160dp"
/>
<TextView
android:id="@+id/text6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@color/color6"
android:width="120dp"
android:height="120dp"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/start"
android:layout_weight="1"
android:text="開始"/>
<Button
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/stop"
android:text="停止"/>
</LinearLayout>
</FrameLayout>
Activity:
package com.example.yougel.otherlayoutdemo;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.Timer;
import java.util.TimerTask;
public class FrameLayoutActivity extends AppCompatActivity {
Button start,stop;
//設置顏色數組
int[] colors={
R.color.color1,
R.color.color2,
R.color.color3,
R.color.color4,
R.color.color5,
R.color.color6
};
int changeColor=0;
//設置textView數組
int[] names={
R.id.text1,
R.id.text2,
R.id.text3,
R.id.text4,
R.id.text5,
R.id.text6
};
boolean isPause;
TextView[] views=new TextView[names.length];
//設置handler
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what==110&&isPause==false){
for(int i=0;i<names.length;i++){
views[i].setBackgroundResource(colors[(i+changeColor)%colors.length]);
}
changeColor++;
}
super.handleMessage(msg);
}
};
Timer timer=new Timer();
//設置timer
public void setTimer(){
isPause=false;
TimerTask timerTask=new TimerTask() {
@Override
public void run() {
handler.sendEmptyMessage(110);
}
};
timer.schedule(timerTask,0,500);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_frame_layout);
for(int i=0;i<names.length;i++){
views[i]= (TextView) findViewById(names[i]);
}
start= (Button) findViewById(R.id.start);
stop=(Button)findViewById(R.id.stop);
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
setTimer();
}
});
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
isPause=true;
}
});
}
}
上面代碼通過設置一個定時器Timer類來定時更改FrameLayout中每個TextView的顏色,形成類似霓虹燈的效果。
在在這裏有個常識就是Android中子線程是無法修改UI主線程界面的,由於Timer的使用需要新建子線程,這裏就採用Handle的發送消息的方式對主線程界面進行修改。
至於AbsoluteLayout(絕對佈局)就不多說了,我們可以將子組件放到佈局中指定的座標處,但不利於兼容不同尺寸的設備,所以在高版本的API是棄用的。