Android入門(八) | 常用的界面布局 及 自定義控件

文章目錄

  • LinearLayout :線性布局
    • android:layout_gravity :控件的對齊方式
    • android:layout_weight:權重
  • RelativeLayout :相對布局
    • 相對于父布局進行定位
    • 相對于控件進行定位
    • 邊緣對齊
  • FrameLayout :幀布局
  • Percent :百分比布局
  • ConstraintLayout :約束布局
    • 自定義控件
    • 封裝復用的頁面
    • 引入封裝好的布局
  • 自定義控件


LinearLayout :線性布局

線性布局有水平、垂直兩種排列方式:

  • android:orientation="vertical" :垂直方向排列,此時高度不可被指定為 match_parent
  • android:orientation="horizontal":水平方向排列,此時不能將寬度指定為 match_parent

android:layout_gravity :控件的對齊方式

如果布局方式選擇 horizontal,之后設置 button1topbutton2center_verticalbutton3bottom 。那么呈現效果如下:
在這里插入圖片描述


android:layout_weight:權重

vertical 垂直布局時,layout_weight 可以覆蓋 layout_height 屬性,根據權重來分配控件高度
在這里插入圖片描述
PS:通過上圖應該對 android:orientation="vertical" :垂直方向排列,此時高度不可被指定為 match_parent。” 這句話有了深刻了解, match_parent 屬性會導致控件占滿整個屏幕……

horizontal 水平布局時,layout_weight 可以覆蓋 layout_height 屬性,根據權重來分配控件高度

在這里插入圖片描述


RelativeLayout :相對布局

通過相對定位的方式可以使控件出現在布局的任何位置。

相對于父布局進行定位

在這里插入圖片描述
關于位置的屬性:

  • layout_alignParentLeft :處于父布局的左。
  • layout_alignParentTop :處于父布局的上。
  • layout_alignParentRight : 處于父布局的右。
  • layout_alignParentBottom :處于父布局的下。
  • layout_centerInParent :處于父布局的居中。

相對于控件進行定位

<?xml version="1.0" encoding="utf-8"?>
<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=".SecondActivity"><Buttonandroid:id="@+id/button_1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_above="@id/button_3"android:layout_toLeftOf="@id/button_3"android:text="Button 1"/><Buttonandroid:id="@+id/button_2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_above="@id/button_3"android:layout_toRightOf="@id/button_3"android:text="Button 2"/><Buttonandroid:id="@+id/button_3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:text="Button 3"/><Buttonandroid:id="@+id/button_4"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/button_3"android:layout_toLeftOf="@id/button_3"android:text="Button 4"/><Buttonandroid:id="@+id/button_5"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/button_3"android:layout_toRightOf="@id/button_3"android:text="Button 5"/></RelativeLayout>

運行結果:

在這里插入圖片描述

  • layout_above :處于被引用控件之上。
  • layout_below :處于被引用控件之下。
  • layout_toLeftOf :處于被引用控件之左。
  • layout_toRightOf :處于被引用控件之右。

通過 android:layout_centerInParent 定位 button 3 之后,以其為基準,定位其他四個 button 的位置。

邊緣對齊

  • layout_alignLeft :該控件左邊緣與被引用控件左邊緣對齊。
  • layout_alignRight:該控件右邊緣與被引用控件右邊緣對齊。
  • layout_alignTop :該控件頂部邊緣與被引用控件頂部邊緣對齊。
  • layout_alignBottom :該控件底部邊緣與被引用控件底部邊緣對齊。

在這里插入圖片描述


FrameLayout :幀布局

這種布局沒有方便的定位方式,所有的控件都默認的擺放在布局的左上角。但可以類似于 LinearLayout 中通過 layout_gravity 來指定控件在布局中的對齊方式:

在這里插入圖片描述


Percent :百分比布局

layout_weight 屬性讓設計布局變得更方便,但可惜的是只有 LinearLayout 支持該功能,因此提供了 PercentFrameLayoutPercentRelativeLayout 分別解幀布局和相對布局的功能局限性。

具體來說,即可以不再使用 wrap_contentmatch_parent 等方式來指定控件大小,而是直接指定控件在布局中所占的百分比。

使用時,由于 Android 將百分比布局定義在了 support 庫中,因此只需在 app/build.gradle 文件中添加下面依賴,需要注意的是 support 庫在 Androidx 1.0.0 及更高版本中被 AndroidX 庫完全取代了……因此添加依賴時需如此實現:

在這里插入圖片描述
在這里插入圖片描述

  • 只用完整路徑 androidx.percentlayout.widget.PercentFrameLayout 作為標簽名,因為百分比布局不像其他三個內置在系統中。
  • 必須定義一個命名空間 app 才能使用百分比布局的自定義屬性。
  • 使用 layout_widthPercentlayout_heightPercent 兩個屬性來定義控件長款,值以百分比形式表示。
  • 繼承自 FrameLayout ,因此所有控件默認擺放在左上角,可以借助 layout_gravity 來避免控件重疊。

ConstraintLayout :約束布局

常被視作增強型的相對布局,ConstraintLayout 不僅可以解決 LinearLayout 常有的嵌套布局缺陷,還具備 RelativeLayout 的相對布局功能。

自定義控件

在這里插入圖片描述

  • 所有控件都是直接或者間接地繼承自 View 的,所有布局都是直接或間接繼承自 ViewGroup 的。
  • View 是 Android 中最基本的一種 UI 組件,它可以在屏幕上繪制一塊矩形區域,響應這塊區域的各種事件,封裝好的各種控件其實就是在 View 的基礎之上添加了各自特有的功能。
  • ViewGroup 是一種特殊的 View,可以包含很多的 子View子ViewGroup,是一個放置控件和布局的容器。

封裝復用的頁面

在前端頁面中有許多重復使用頻率高的頁面,如導航欄、底部欄等,對于這些頁面,可以一次編撰代碼并封裝,之后多次調用以實現復用。

這里通過約束布局實現標題欄布局文件 title.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/cmy4"><Buttonandroid:id="@+id/title_back"android:layout_width="0dp"android:layout_height="50dp"android:layout_margin="5dp"app:layout_constraintHorizontal_weight="1"android:background="@drawable/cmy1"android:text="Back"android:textColor="#fff"app:layout_constraintTop_toTopOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toLeftOf="@id/title_text" /><TextViewandroid:id="@+id/title_text"android:layout_width="0dp"android:layout_height="wrap_content"android:gravity="center"android:text="Title Text"app:layout_constraintHorizontal_weight="2.5"android:textColor="@color/teal_200"android:textSize="24sp"app:layout_constraintTop_toTopOf="@id/title_back"app:layout_constraintBottom_toBottomOf="@id/title_back"app:layout_constraintLeft_toRightOf="@id/title_back"app:layout_constraintRight_toLeftOf="@id/title_edit" /><Buttonandroid:id="@+id/title_edit"android:layout_width="0dp"android:layout_height="50dp"android:layout_margin="5dp"app:layout_constraintHorizontal_weight="1"android:background="@drawable/cmy1"android:text="Edit"android:textColor="@color/white"app:layout_constraintTop_toTopOf="parent"app:layout_constraintLeft_toRightOf="@id/title_text"app:layout_constraintRight_toRightOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

android:background 不生效

res/values/themes.xml 中:
在這里插入圖片描述
修改為:
在這里插入圖片描述

相對定位

通過形如 layout_constraintTop_toTopOf 的屬性來定位控件,該類屬性值可為 parent 從而與父布局相適配。舉兩個例子,上述代碼中:

  • title_backapp:layout_constraintLeft_toLeftOf="parent" :意為將 title_back左邊緣 約束到 父布局左邊緣
  • title_editapp:layout_constraintStart_toEndOf="@id/title_back" :意為 title_edit起始位置title_back結束位置

相對定位中的 layout_constraintBaseline_toBaselineOf 意為 文本基線 對齊。

對齊前:在這里插入圖片描述 對齊后:在這里插入圖片描述

通過相對布局實現居中:
在這里插入圖片描述

用一張圖總結相對定位:
在這里插入圖片描述

如果兩個或以上控件通過下圖的方式約束在一起,就可以認為是他們是一條鏈(圖為橫向的鏈,縱向同理):

在這里插入圖片描述
一條鏈的第一個控件是這條鏈的鏈頭,當所有控件的 高/寬度 都為 固定值/wrap_content 時,可以在 鏈頭 中通過設置 layout_constraintHorizontal_chainStyle 來改變 鏈的樣式

  • spread :展開元素 (默認);
  • spread_inside :展開元素,但鏈的兩端貼近 parent;
  • packed :鏈的元素將被打包在一起。
    在這里插入圖片描述
    當所有控件的 高/寬度 都為 0dp 時,可以在 每個控件 中通過設置 layout_constraintHorizontal_weight(constraintVertical為縱向) 來改變 鏈的權重

界面顯示:

在這里插入圖片描述


引入封裝好的布局

  • 在布局文件中加上一句 <include layout="@layout/title"/>
  • 隱藏系統自帶的標題欄:
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) actionBar.hide();

自定義控件

不光布局會被重復使用,某些控件其功能是固定的,比如返回按鈕,都是銷毀當前活動。因此也可以對其進行封裝復用,創建一個自定義類 TitleLayout.java 繼承 LinearLayout,并且重寫里面的構造方法

public class TitleLayout extends LinearLayout {public TitleLayout(Context context, Attributes attrs){super(context, (AttributeSet) attrs);LayoutInflater.from(context).inflate(R.layout.title, this);}
}

此時,在布局中引入 TitleLayout 控件就會調用這個構造函數,因此使用 LayoutInflater 來實現動態加載,from() 方法可以構建出一個 LinearLayout 對象,然后調用 inflate 可以動態加載一個布局文件,里面傳入兩個參數:

  • 加載布局文件的 id
  • 參數一的父布局。

現在可以在其他 xml 文件中(比如 second_layout.xml)添加這個自定義控件:

<com.example.activitytest.TitleLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"></com.example.activitytest.TitleLayout>

com.example.activitytestTitleLayout 文件所在的完整路徑名。如此一來即可把 title 布局界面直接搬到 second_layout 布局中,那么 SecondActivity 其顯示的布局自然就是 title.xml 的樣子。

此時我們可以為布局中的控件注冊點擊事件:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443708.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443708.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443708.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android入門(九)| 滾動控件 ListView 與 RecyclerView

文章目錄ListView內置類型的簡單運用定制數據類型提升效率點擊事件RecyclerView布局管理器點擊事件ListView 內置類型的簡單運用 由于手機屏幕空間有限&#xff0c;能夠一次性在屏幕上顯示的內容不多&#xff0c;當我們的程序有大量數據需要顯示的時候就可以借助 ListView 來…

關于“三門問題”的一些想法

三門問題&#xff08;Monty Hall problem&#xff09;亦稱為蒙提霍爾問題、蒙特霍問題或蒙提霍爾悖論&#xff0c;大致出自美國的電視游戲節目Let’s Make a Deal。問題名字來自該節目的主持人蒙提霍爾&#xff08;Monty Hall&#xff09;。參賽者會看見三扇關閉了的門&#xf…

Android入門(10)| Fragment碎片詳解

文章目錄為什么要使用碎片&#xff08;Fragment&#xff09;實例布局文件FragmentActivity動態添加碎片布局文件FragmentActivity碎片通信Fragment布局文件Activity生命周期為什么要使用碎片&#xff08;Fragment&#xff09; 我們在手機上看新聞可能是這樣的&#xff1a; Re…

Android開發(1) | Fragment 的應用——新聞應用

文章目錄Item&#xff1a;標題子項布局文件Java代碼標題碎片布局文件Java代碼新聞內容碎片布局文件Java代碼新聞內容活動布局文件Java代碼首界面布局文件Java代碼Item&#xff1a;標題子項 布局文件 news_item.xml&#xff1a; <TextViewxmlns:android"http://schema…

Java Web整體異常處理

在實際的J2EE項目中&#xff0c;系統內部難免會出現一些異常&#xff0c;就如StrutsSpringHibernate項目&#xff1a;通常一個頁面請求到達后臺以后&#xff0c;首先是到action&#xff08;就是MVC中的controller&#xff09;&#xff0c;在action層會調用業務邏輯層service&am…

Android入門(11)| 全局廣播與本地廣播

文章目錄廣播概念接收廣播動態注冊實例靜態注冊實例發送廣播發送標準廣播廣播的跨進程特性發送有序廣播本地廣播廣播概念 Android 中的每個應用程序都可以對自己感興趣的廣播進行注冊&#xff0c;這樣該程序就只會接收到自己所關心的廣播內容&#xff0c;這些廣播可能是來自系…

Android開發(2) | 廣播 Broadcast 的應用——強制下線功能

文章目錄功能簡介關閉所有活動登陸界面發送強制下線的廣播廣播接收器AndroidManifest.xml運行結果功能簡介 強制下線功能只需要彈出一個對話框&#xff0c;讓用戶只能點擊確定按鈕&#xff0c;回到登錄界面。 如果在每一個活動中添加一個對話框的話太過繁瑣&#xff0c;用廣播…

Android入門(12)| 數據持久化

文章目錄數據持久化文件存儲將數據存儲進文件實例從文件中讀取數據實例SharedPreferences存儲將數據存儲進文件實例從文件中讀取數據實例實現記住密碼的功能SQLite數據庫存儲創建自己的幫助類調用自己的幫助類補全 onUpgrade() 方法增刪查改增&#xff1a;SQLiteDatabase.inser…

Android入門(13)| Android權限 與 內容提供器

文章目錄普通權限與危險權限運行時申請權限內容提供器運用安卓封裝好的內容提供器自實現的內容提供器概念實現普通權限與危險權限 主要用于不同應用程序之間在保證被訪數據的安全性的基礎上&#xff0c;實現數據共享的功能。 在 Android 6.0 開始引入了運行時權限的功能&…

Java實現身份證號碼的驗證,JAVA后臺驗證身份證號碼

代碼如下&#xff1a; package cn.gov.csrc.util;/*** 18 位身份證驗證器* * author admin* */ public class IDCard {final int[] wi { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 };final int[] vi { 1, 0, X, 9, 8, 7, 6, 5, 4, 3, 2 };private int[] ai n…

Android入門(14)| 通知

文章目錄創建通知點擊效果其它小功能實例創建通知 創建通知的步驟&#xff1a; 管理通知的 NotificationManager&#xff0c;通常通過當前 Context 的 getSystemService() 獲取實例。它接受一個字符串參數用于確定獲取系統的什么服務。Android 8.0(O) 版本后需要通知通道&…

Android開發(3) | 權限和內容提供器的應用——調用相機和相冊

文章目錄拍照并保存到 ImageView 控件布局文件 notice_layout.xml按鈕 button_takePhoto 的點擊操作隱式 Intent 啟動后的回調AndroidManifest.xml從相冊選取照片并在 ImageView 控件中顯示布局文件 notice_layout.xml按鈕 button_takePhoto 的點擊操作自定義打開相冊的方法 op…

Android開發(4) | 系統權限、MediaPlayer類 和 VideoView類 的應用——播放多媒體文件

文章目錄MediaPlayer類播放音頻的實例VideoView類播放視頻的實例MediaPlayer類 對多種格式的音頻文件提供了全面的控制方法&#xff1a; 如何獲得MediaPlayer實例&#xff1f; 通過構造函數&#xff1a; MediaPlayer mp new MediaPlayer();調用 MediaPlayer.create() 方法&…

Android入門(15)| 網絡

文章目錄WebViewHTTP使用HttpURLConnection使用OkHttp封裝網絡操作封裝HttpURLConnection封裝OkHttpWebView WebView 可以在 應用程序中&#xff08;而不是瀏覽器&#xff09; 展示一些網頁。 布局文件 web_layout.xml&#xff1a; <LinearLayoutxmlns:android"http…

Java-單例模式

單例模式相信大家都不陌生&#xff0c;在JAVAEE應用中&#xff0c;單例模式是一種應用非常廣泛的設計模式&#xff0c;應用中許多組件都只需要單個實例&#xff0c;下面介紹單例模式。 使用單例模式的優點&#xff1a; 1.減少創建JAVA實例所帶來的系統開銷。 2.便于系統跟蹤單…

Android入門(16)| 服務

文章目錄概念Android 多線程繼承 Thread繼承 Runable 接口匿名類異步消息處理AsyncTask使用服務框架啟動/停止服務綁定/解綁服務服務的生命周期前臺服務IntentService完整版下載示例下載過程的回調接口&#xff1a;DownloadListener繼承 AsyncTask 實現下載功能&#xff1a;Dow…

2020德勤面試開始了嗎_2020國考面試開始,近期面試公告匯總,附結構化小組面試流程...

2020年國家公務員考試面試環節逐步恢復考試&#xff0c;各個招錄部門已經發布面試考察公告&#xff0c;對于進入面試環節的國考考生來說&#xff0c;有必要了解近期國考面試的招錄動態&#xff0c;提前做好面試準備。2020國考國家統計局機關面試面試確認&#xff1a;請進入面試…

項目積壓需求項目計劃_需求變更頻繁,項目經理如何做好需求管理?

項目實施過程中&#xff0c;項目經理常常面臨一個重大挑戰——需求變更。需求變更無處不在&#xff0c;市場條件變化、新業務出現、戰略目標調整、客戶需求修改、資源限制等&#xff0c;都會造成需求變更。需求變更會影響項目的時間、成本和質量&#xff0c;對整個項目和團隊成…

Android | Sensor.TYPE_ORIENTATION被廢棄后的解決辦法

文章目錄概述getOrientation 方法根據 旋轉矩陣R 獲取 設備旋轉弧度getRotationMatrix 方法根據 地磁場、加速度傳感器對象 獲取 旋轉矩陣R代碼參考資料概述 Sensor.TYPE_ORIENTATION 常數在 API 8 中已棄用&#xff0c;官方推薦使用 SensorManager.getOrientation() 替代。關…

【JAVA 開發小問題】 | String操作合集

文章目錄截取特定兩個字符之間的字符串截取特定兩個字符之間的字符串 利用正則表達式&#xff0c;圖片來源