【入門篇】Android學習筆記——常用佈局

来源:http://www.cnblogs.com/wisekingokok/archive/2016/03/21/5301662.html
-Advertisement-
Play Games

很多開發者一聽說Android終端的屏幕尺寸五花八門,屏幕解析度千奇百怪,就覺得Android開發在屏幕適配方面是必定是一件頭疼的事情。因為在Android問世之前,廣大開發者知道的UI解決方案大致分為兩類: 在Web開發中的CSS,一層一層的去層疊樣式。 在iOS開發中去計算每一個UIView的尺...


很多開發者一聽說Android終端的屏幕尺寸五花八門,屏幕解析度千奇百怪,就覺得Android開發在屏幕適配方面是必定是一件頭疼的事情。因為在Android問世之前,廣大開發者知道的UI解決方案大致分為兩類:

  1. 在Web開發中的CSS,一層一層的去層疊樣式。
  2. 在iOS開發中去計算每一個UIView的尺寸。

上面兩種方案,無論哪種方案面對碎片化嚴重的Android終端,那都是一場噩夢。好在Android提供了另一套解決方案來應對嚴重的終端碎片化,這就是佈局和9-patch。

這裡想來說說佈局,在Android SDK剛剛問世的時候,Android提供了AbsoluteLayout,FrameLayout,LinearLayout,RelativeLayout和Tablelayout五大佈局來應對終端碎片化問題。

但很快Android發現AbsoluteLayout是一個愚蠢的方案,在Android 1.5系統中就不再支持此佈局,剩下的四個佈局中,Tablelayout雖然依然被支持,但是由於Fragment以及新的TabLayout的出現,博主在此斷言,Tablelayout也命不久矣,被移除支持只是遲早的事兒。

所以,Android的五大基本佈局現在只剩下三個(這裡說的是基本佈局,在Android support包里引入的新的佈局不計入內),下麵分別介紹一下這三個基本佈局。

FrameLayout

FrameLayout應該是Android系統中最簡單的佈局了,在FrameLayout中的元素,預設都是以FrameLayout控制項的坐上頂點作為基準點,一層一層的重疊起來,後加進來的元素覆蓋前面的元素。

下麵先來一個演示,代碼如下:

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

    <View
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:background="#ff0000"/>

    <View
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:background="#000000"/>

    <View
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_margin="100dp"
        android:background="#00ff00"/>

</FrameLayout>

運行結果如下:

在代碼里,有三個View,而在運行結果上只能看到兩個View,一個黑色和一個綠色。這是因為紅色的View被黑色的View蓋住了。

在FrameLayout中,通過android:layout_gravity屬性去指定子元素的位置,下麵調整一下上訴例子中的黑色View的位置,讓紅色的View顯示出來,調整後的代碼如下:

<View
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:layout_gravity="bottom|right"
    android:background="#000000"/>

  

可以看到上面代碼里添加了android:layout_gravity屬性,並且指定了兩個值,一個為bottom,一個為right,表示這個View將被放到FrameLayout的右下角。運行結果如下圖所示:

LinearLayout

LinearLayout是線性佈局,它可以讓它內部的元素按照指定方向依次排開。LinearLayout的方向是通過android:orientation屬性指定,並且可以通過android:gravity屬性指定對其方式。

還是直接上段代碼看看效果,代碼如下:

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

    <View
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:background="#ff0000"/>

    <View
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:background="#000000"/>

    <View
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:background="#00ff00"/>
</LinearLayout>

  

在代碼中,設置了LinearLayout的方向為縱向,並且對其方式居中對齊,於是運行結果如下圖所示:

除了android:orientation將設為vertical外,也可以設為horizontal。讓LinearLayout內部的元素橫向排列,將上面例子中的android:orientation屬性值改為horizontal後的運行結果,如下圖所示:

RelativeLayout

RelativeLayout是基本佈局裡面最靈活,也是最複雜的佈局,它內部的元素可以通過設定彼此之間的相對關係來決定佈局,使用RelativeLayout時,推薦為其內部每個元素都設定id,下麵依然通過一個列子來演示此佈局的使用方法。代碼如下:

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

    <View android:id="@+id/red"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:background="#ff0000"/>

    <View android:id="@+id/black"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_toRightOf="@id/red"
        android:layout_below="@id/red"
        android:background="#000000"/>

    <View android:id="@+id/green"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_below="@id/black"
        android:layout_alignParentRight="true"
        android:background="#00ff00"/>

    <View android:id="@+id/gray"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_centerInParent="true"
        android:background="#888888"/>

    <View android:id="@+id/orange"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_toRightOf="@id/green"
        android:layout_below="@id/gray"
        android:background="#ff8800"/>
</RelativeLayout>

  

先分析代碼,可以看到每一個View都被設置了一個id值,分別為red,black,green,gray和orange。然後通過代碼,可以看出black位於red的右邊和下麵,green位於black的下麵並且右對齊其父元素(即RelativeLayout),gray居中對齊父元素(即RelativeLayout), orange位於green的右邊同時位於gray的下麵,運行結果如圖所示:

在此在歸納一下RelativeLayout中,與佈局相關的屬性:

  • android:layout_below:位於指定元素的下方
  • android:layout_above:位於指定元素的上方
  • android:layout_toLeftOf:位於指定元素的左側
  • android:layout_toRightOf:位於指定元素的右側
  • android:layout_centerVertical:垂直居中對齊父元素
  • android:layout_centerHorizontal:水平居中對齊父元素
  • android:layout_centerInParent:居中對齊父元素
  • android:layout_alignParentRight:與父元素右對齊
  • android:layout_alignParentLeft:與父元素左對齊
  • android:layout_alignParentTop:與父元素上對齊
  • android:layout_alignParentBottom:與父元素下對齊
  • android:layout_alignRight:與指定元素右對齊
  • android:layout_alignLeft:與指定元素左對齊
  • android:layout_alignTop:與指定元素上對齊
  • android:layout_alignBottom:與指定元素下對齊

從Android 4.2開始,也就是從API Level 17開始,Android增強了RelativeLayout,使其能夠更好的應對並本地化這一需求,比如在有的國家,文字是從右往左閱讀,這也就是所說的RTL。為了應對RTL,RelativeLayout又增加了以下屬性:

  • android:layout_alignStart:與指定元素的開始位置對齊
  • android:layout_toStartOf:位於指定元素的開始側
  • android:layout_alignParentStart:與父元素與開始側對齊
  • android:layout_alignEnd:與指定元素的結束始位置對齊
  • android:layout_toEndOf:位於指定元素的結束側
  • android:layout_alignParentEnd:與指定元素的結束位置對齊

這裡的開始和結束我們可以做如下理解:

  • 開始:在從左到右閱讀習慣的國家,開始側等於左側,toStartOf的顯示效果就等於toLeftOf。但是在從右往左閱讀習慣的國家,那麼開始側就變成了右側,toStartOf的顯示效果就等於了toRightOf。
  • 結束:同上面對開始的理解一樣,結束側在從左到右閱讀習慣的國家就是右側,反之則在左側。

 

 

 

 

歡迎轉載,轉載同時請尊重版權,附上本文原文鏈接:點擊這裡

 

 

==============================

 更多內容,歡迎查看本人博客:林彥君的博客

==============================


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xxx...}: java.lang.IllegalStateException: Couldn't read row 0, col -1 from Curs
  • 如果想對自己自定義的類進行解檔和歸檔的話 必須遵循一個協議:NSCoding Student.h 文件 Student.m 文件 客戶端代碼 運行結果:
  • 此文章來自:聽雲博客 很多時候需要網路抓包分析,在iPhone上抓包稍有不同,下麵介紹三種常用的方式。分析工具以wireshark為例。 一、最簡單的方式:用PC作為熱點,在PC上抓包 優點:簡單 缺點:不能抓真機2g/3g/4g網路數據 步驟如下: 1、PC接上有線 2、PC用wifi方式共用網路
  • 載入使用AnimationUtils.load方法載入 一般都用代碼控制 如果需要 用XML控制可以在res\下建立 animator,即可, 在這個目錄建立XML文件如果 下方法導入
  • 先說一下為什麼要講框架的設計。 第一、IM應用一般是基於長連接的,也就是後臺一直在收發數據,那這裡就有一個後臺的概念; 第二、如果用戶是一個人群裡面的中心人物的話,那麼他的的數據量就會很大。頁面的顯示及資料庫的處理就需要關註了; 第三、分解app有利於我們降低耦合,在後期維護和升級時,稍微容易一點。
  • iOS證書突然失效 今早上班打包直接報錯,錯誤如圖 根據錯誤信息到“鑰匙串”裡面看了一下證書,證書都莫名其妙的失效了,昨天還是好好的。 重新去鑰匙串從證頒發中心獲取證書,然後登陸開發者賬號重新申請證書,然後添加到鑰匙串中,再次打包發現剛申請成功的證書還是無效的。折騰了半天才找到解決方案。 解決方法:
  • UICollectionView是一種新的數據展示方式,簡單來說可以把他理解成多列的UITableView(請一定註意這是UICollectionView的最最簡單的形式)。如果你用過iBooks的話,可能你還對書架佈局有一定印象:一個虛擬書架上放著你下載和購買的各類圖書,整齊排列。其實這就是一個U
  • 屏幕左邊緣右滑返回,TabBar 滑動切換,你是否喜歡並十分依賴這兩個操作,甚至覺得 App 不支持這類操作的話簡直反人類?這兩個操作在大屏時代極大提升了操作效率,其背後的技術便是今天的主題:視圖控制器轉換(View Controller Transition)。 視圖控制器中的視圖顯示在屏幕上有兩
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...