Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android開發1:基本UI界面設計——布局和組件,androidui

Android開發1:基本UI界面設計——布局和組件,androidui

編輯:關於android開發

Android開發1:基本UI界面設計——布局和組件,androidui


前言

啦啦啦~本學期要開始學習Android開發啦~

博主在開始學習前是完完全全的小白,只有在平時完成老師要求的實驗的過程中一步一步學習~從此篇博文起,博主將開始發布Android開發有關的博文,希望能在學習中和各位共同探討,一起交流,共同進步~

話不多說,首先進入我們的正題~Android開發一基本UI界面設計——布局和組件(Android Studio的配置安裝使用等在以後為各位補上~)

基礎知識

  Android的組件分為布局和控件。布局,就是讓控件在裡面按一定的次序排列好的一種組件,本身並不提供內容。控件,就是顯示內容的組件,比如顯示一張圖片,顯示文字等等。在Android中,共有五種布局方式,分別是:FrameLayout(框架布局),LinearLayout (線性布局),AbsoluteLayout(絕對布局),RelativeLayout(相對布局),TableLayout(表格布局)。


(1)FrameLayout 框架布局,放入其中的所有元素都被放置在最左上的區域,而且無法為這些元素指定一個確切的位置,下一個子元素會重疊覆蓋上一個子元素,適合浏覽單張圖片。
(2)LinearLayout 線性布局,是應用程序中最常用的布局方式,主要提供控件水平或者垂直排列的模型,每個子組件都是以垂直或水平的方式來定位.(默認是垂直)
(3)AbsoluteLayout 絕對定位布局,采用坐標軸的方式定位組件,左上角是(0,0)點,往右x軸遞增,往下Y軸遞增,組件定位屬性為android:layout_x 和 android:layout_y來確定坐標。
(4)RelativeLayout 相對布局,根據另外一個組件或是頂層父組件來確定下一個組件的位置。和CSS裡面的類似。
(5)TableLayout 表格布局,類似Html裡的Table.使用TableRow來布局,其中TableRow代表一行,TableRow的每一個視圖組件代表一個單元格。

 

線性布局

  在這其中,線性布局和相對布局是最常用的布局方式(本篇主要講線性布局,相對布局在接下來的文章中會有具體敘述和應用~)

  線性布局是程序中最常見的一種布局方式,簡單來說,直著排,橫著排都可以,還可以嵌套,正因為如此(方便且簡單),此布局運用的非常多。

  線性布局可以分為水平線性布局和垂直線性布局兩種, 通過android:orientation屬性可以設置線性布局的方向。

 

  在線性布局中主要存在以下屬性:

android:orientation      定義布局內的方向水平或垂直(horizontal/vertical ) 

android:layout_weight  子元素對未占用空間【水平或垂直】分配權重值,其值越小,權重越大。 

android:layout_width -  寬(1.fill_parent: 父元素決定,2.wrap_content: 本身的內容決定)

android:layout_height - 高(3.高直接指定一個 px 值);

android:gravity -          內容的排列形式(常用 top, bottom, left, right, center,Left|center_)

 

  在講線性布局相關的組件前,我們先講一下可以在線性布局中嵌套使用的另一種常用布局方式:

 

TableLayout

  即表格布局,當需要布局內的組件像表格一樣排列時,使用 TableLayout 比較方便。表格布局采用行、列 的形式來管理 UI 組件,TableLayout 並不需要明確地聲明包含多少行、多少列,而是通過添加 TableRow、其他組件來控制表格的行數和列數。每次向 TableLayout 中添加一個 TableRow,該 TableRow 就是一個表格行,TableRow 也是容器,因此它也可以不斷地添加其他組件,每添加一個子組件該表格就增加一列。

  如果直接向 TableLayout 中添加組件,那麼這個組件將直接占用一行。 在表格布局中,列的寬度由該列中最寬的那個單元格決定,整個表格布局的寬度則取決於父容器的寬度。(默認總是占滿父容器本身)

 

  三個重要的 xml 屬性:

  collapseColumns:設置需要被隱藏的列的列序號,多個列序號之間用逗號隔開;

  shrinkColumns:設置允許被收縮的列序號,多個列序號之間用逗號隔開;

  stretchColumns:設置允許被拉伸的列序號,多個列序號之間用逗號隔開。

  注意,列序號從0開始計數。

 

現在正式講一下線性布局中可能用到的組件:

 

TextView

  用於顯示文字內容的控件,通過設置 text 的值來顯示要顯示的內容,常用的屬性有 textColor,用於設置文字的顏色;textSize,用於設置文字大小。示例:

   

效果圖:

 

關於@color/colorAccent 這種形式的資源引用後面會講。

 

EditText

  用於接受用戶輸入的輸入框,常用屬性除了和TextView相同的 textColor和 textSize之外,還有inputType,用於設置輸入框中文本的類型,如果設置為textPassword,會使輸入的文字變為小點(·); hint,用於設置當輸入框為空時的提示內容。以一個密碼輸入框做示例:


效果如下

未輸入前:

輸入之後:

 



ImageView

顯示圖片的控件,通過設置 src 來設置要顯示的圖片

 

  sysu.jpg

關於 ImageView 的 src 和 background 屬性的區別,自行查閱資料。

 

RadioButton 和 RadioGroup

RadioButton是單選按鈕,一組單選按鈕需要包括在一個RadioGroup中,並且需要對RadioGroup和其包括的每一個RadioButton都設置id,RadioButton才能正常工作。示例:

可通過設置 checked 屬性來使某個 RadioButton 被選中。

 

組件的介紹就到這裡,下面簡單介紹以下幾個重要的通用屬性:

 

layout_width 和 layout_height

  這兩個屬性分別指定所屬組件的寬度和高度,屬性值可以是具體的距離,如:20dp,更常見的是指定為 match_parent 或者 wrap_content,match_parent 指的是組件的寬度或高度與父組件的寬度或高度一致,如果組件沒有父組件,那麼組件的寬度或高度與屏幕的寬度或高度一致。wrap_content 指組件的寬度或高 度剛好可以包裹住組件內的子組件即可。

 

layout_gravity 和 gravity

  這兩個屬性的基本屬性值有五種:top、bottom、center、left、right,可以使用組合屬性,如 left|bottom 表示左下角。區別在於 layout_gravity 用於指定設置該屬性的組件相對於父組件的位置,gravity 用於指定設置該屬性的組件下的子組件的位置。

  

layout_margin 和 padding

  layout_margin 指定外邊距,padding 指定內邊距,這兩個屬性配合上四個方向還各有四個屬性,如layout_marginTop,paddingTop等。

 

實驗步驟

接下來我們來看一看本次實驗的要求:

實現一個 Android 應用,界面呈現如下效果:


 

  這裡我們需要使用LinearLayout 即線性布局(布局內組件按線性排列的布局)。

  運用android:orientation="vertical"將整體布局設置為縱向。使用TextView組件(用於顯示文字內容的控件,通過設置 text的值來顯示要顯示的內容)顯示標題信息,按照要求設置好文本屬性,接著使用ImageView組件(顯示圖片的控件,通過設置 src來設置要顯示的圖片)將圖片素材添加進去。

  在添加輸入框時我們需要使用TextView和EditText(用於接受用戶輸入的輸入框)組件。在這裡使用嵌套,使用兩個橫向的線性結構,將兩行輸入框設置好。將密碼輸入框的inputType屬性設置為"textPassword",防止輸入密碼時可見。

  在設置單選按鈕時我們使用RadioButton和 RadioGroup組件(RadioButton是單選按鈕,一組單選按鈕需要包括在一個RadioGroup中,並且需要對RadioGroup和其包括的每一個 RadioButton都設置id,RadioButton才能正常工作),按照要求設置四個單選按鈕將第一個按鈕的checked屬性設置為"true"。

 

主界面代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorWhite"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/SYSU"
        android:layout_gravity="center"
        android:layout_marginTop="20dp"
        android:text="課外體育積分電子認證系統"
        android:textSize="20sp"
        android:textStyle="bold" />

    <ImageView
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:id="@+id/Image"
        android:layout_gravity="center"
        android:layout_marginBottom="20dp"
        android:layout_marginTop="20dp"
        android:contentDescription="@string/app_name"
        android:src="@mipmap/sysu" />

    <TableLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:stretchColumns="1"
        android:layout_marginRight="20dp"
        android:layout_marginLeft="20dp">
        <TableRow>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/username1"
                android:text="@string/username1"
                android:textSize="@dimen/etWordSp"/>
            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="textPersonName"
                android:hint="@string/username2"
                android:id="@+id/editText"/>
        </TableRow>
        <TableRow
            android:layout_marginTop="10dp">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/password1"
                android:text="@string/password1"
                android:gravity="end"
                android:textSize="@dimen/etWordSp"/>
            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="textPassword"
                android:hint="@string/password2"
                android:id="@+id/editText2"/>
        </TableRow>
    </TableLayout>

    <RadioGroup
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="10dp"
        android:orientation="horizontal">

        <RadioButton
            style="@style/radioButtonStyle"
            android:id="@+id/radio1"
            android:checked="true"
            android:text="@string/student" />

        <RadioButton
            style="@style/radioButtonStyle"
            android:id="@+id/radio2"
            android:text="@string/teacher" />

        <RadioButton
            style="@style/radioButtonStyle"
            android:id="@+id/radio3"
            android:text="@string/corporation" />

        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/radio4"
            android:text="@string/manager"
            android:textSize="@dimen/etWordSp" />

    </RadioGroup>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="20dp"
        android:orientation="horizontal">

        <Button
            style="@style/Button"
            android:layout_marginRight="5dp"
            android:text="@string/signIn" />

        <Button
            style="@style/Button"
            android:text="@string/register" />

    </LinearLayout>

</LinearLayout>

 

  最後在設置按鈕時,我們需要設置自定義背景邊框來實現登錄按鈕的背景:

 

  當需要將一個 button設置為圓角矩形時,光設置 button的屬性是達不到效果的,需要定義一個背景邊框來達到這個效果。這種自定義的背景邊框定義在drawable文件夾下——在drawable文件夾下新建一個Drawable resource file,填寫file name,然後把自動生成的 selector標簽改為shape,shape下有多個屬性,padding,radius,solid等等,按照教程 http://blog.csdn.net/sysukehan/article/details/52022307 將其中的屬性設置好,在Button中設置background為@drawable/shape.xml來引用這個自定義的背景(android:background="@drawable/shape")。

 

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <solid android:color="#3F51B5" />
    <corners android:radius="10dip" />
    <padding
        android:bottom="5dp"
        android:left="10dp"
        android:right="10dp"
        android:top="5dp" />
</shape>

 

  此外,Android項目中不建議使用硬編碼來使用資源,建議將各類資源定義在 res文件夾中的 values文件夾下,字符串資源定義在strings.xml中,顏色資源定義在colors.xml中,距離,字體大小資源定義在 dimens.xml中。圖片資源例外,是存放在res文件夾中的mipmap文件夾下或者drawable文件夾下。style定義在 res/values/styles.xml文件中,也是一種資源。例如當多個TextView具有相同的 layout_height,layout_width,textSize,textColor設定時,如果每次都要把這些屬性設定一次會很煩,而且如果全部需要修改的話(改變字體大小)也不方便,因此可以把這些屬性統一定義為一個style,這樣使用的時候只要直接引用這個style即可。在這裡我們設置兩個style,即radioButtonStyle和Button。

 strings.xml

<resources>
    <string name="app_name">My Application1</string>
    <string name="action_settings">Settings</string>
    <string name="signIn">登錄</string>
    <string name="register">注冊</string>
    <string name="student">學生</string>
    <string name="teacher">老師</string>
    <string name="corporation">社團</string>
    <string name="manager">管理者</string>
    <string name="username1">用戶名:</string>
    <string name="username2">請輸入用戶名</string>
    <string name="password1">密碼:</string>
    <string name="password2">請輸入密碼</string>
</resources>

 

styles.xml

    <style name="radioButtonStyle">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_marginRight">10dp</item>
        <item name="android:textSize">@dimen/etWordSp</item>
    </style>

    <style name="Button">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:textSize">@dimen/etWordSp</item>
        <item name="android:textColor">@color/colorWhite</item>
        <item name="android:background">@drawable/shape</item>
    </style>

 

關於資源的引用

  Android 項目中不建議使用硬編碼來使用資源,建議將各類資源定義在 res 文件夾中的 values 文件夾下, 字符串資源定義在 strings.xml 中,顏色資源定義在 colors.xml 中,距離、字體大小資源定義在 dimens.xml 中。圖片資源例外,是存放在 res 文件夾中的 mipmap 文件夾下或者 drawable 文件夾下。給個示例看一下怎麼定義:

colors.xml

 

 

  通過鍵值對來定義,使用的時候用@color/colorAccent 即可引用到對應資源,注意是@color 不是@colors,這裡和文件名是不相同的。其它資源的引用也一樣。

 

關於自定義 style

  style 定義在 res/values/styles.xml 文件中,也是一種資源。例如當多個 TextView 具有相同的 layout_height,layout_width,textSize,textColor 設定時,如果每次都要把這些屬性設定一次會很煩,而 且如果全部需要修改的話(改變字體大小)也不方便,因此可以把這些屬性統一定義為一個 style,這樣 使用的時候只要直接引用這個 style 即可。

  定義 style 的方法(styles.xml ):

 

  一個自定義 style 下包含多個鍵值對,引用的時候設置 style=“@style/my_edittext_style”即可,注意不要寫成 android:style=“@style/my_edittext_style”。在引用 style 之後,還可以繼續定義屬性,如果有重復,以繼續定義的屬性為准。

 

如何在應用中顯示布局

首先,需要在 res/layout 文件夾下寫好布局文件

 

然後創建一個 java 文件


在該文件中將布局引入

 

 

然後在注冊文件中注冊,將該 Activity 設置為應用啟動時第一個加載的 Activity

 

 

然後就可以運行了。

 

實驗結果截圖

 

 

 

1、本實驗實驗環境:

操作系統 Windows 10 

實驗軟件 Android Studio 2.2.1

虛擬設備:Nexus_5X

API:23

2、貼代碼的時候由於插入代碼框的大小問題,代碼格式不太嚴整,望見諒~

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved