天天看點

UI元件-TextView及其子類

前言

時間就像海綿裡的水,隻要願擠,總還是有的。

TextView元件

TextView直接繼承了View,它的作用就是在界面上顯示文本。

代碼示例

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

    <!-- 設定文本框内文字居中 -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="15pt"
        android:text="halo_加油"
        android:gravity="center"
        />

    <!-- 設定字号為20pt,在文本框結尾處繪制圖檔 -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="HALO_加油"
        android:textSize="20pt"
        android:drawableEnd="@drawable/ic_launcher"
     />

    <!-- 設定結尾省略,所有字母大寫 -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:text="halo_加油halo_加油halo_加油halo_加油halo_加油halo_加油halo_加油halo_加油halo_加油halo_加油halo_加油"
        android:ellipsize="end"
        android:textAllCaps="true"
    />

    <!-- 對郵箱、電話增加連結 -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:text="郵箱是[email protected],電話是010666666"
        android:autoLink="email|phone"
    />

    <!-- 設定文字顔色、大小,并使用陰影  -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Halo_加油"
        android:shadowColor="#00f"
        android:shadowDx="10.0"
        android:shadowDy="8.0"
        android:shadowRadius="3.0"
        android:textColor="#f00"
        android:textSize="18pt"
    />
    <!-- 密碼框 -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="halo_加油"
        android:password="true"
    />
</LinearLayout>

           

效果

UI元件-TextView及其子類

Screenshot_20171018-095040.png

提示

andriod:drawableBottom屬性,在文本框内文本的底端繪制指定圖像。

andriod:drawableTop屬性,在文本框内文本的頂端繪制指定圖像。

andriod:drawableLeft屬性,在文本框内文本的左邊繪制指定圖像。

andriod:drawableRight屬性,在文本框内文本的右邊繪制指定圖像。

andriod:drawableEnd屬性,在文本框内文本的結尾處繪制指定圖像。

andriod:drawableStart屬性,在文本框内文本的開始處繪制指定圖像。

andriod:ellipsize屬性,設定當顯示文本超過了TextView的長度時,如何處理文本内容。(none,start,middle,end,marquee)。

andriod:lines屬性,設定該文本框預設占幾行。

andriod:linksClickable屬性,控制該文本框的URL、E-mail等連結是否可點選。

andriod:maxLines屬性,設定該文本框最多占幾行。

andriod:singleLine屬性,設定該文本框是否為單行模式。

andriod:textAllCaps屬性,設定是否将文本框的所有字母顯示為大寫字母。

andriod:autoLink屬性,是否将符合指定格式的文本轉換為可單擊的超連結形式。

andriod:shadowColor屬性,設定文本框内文本的陰影顔色。

自定義TextView元件

在有的時候,系統自帶TextView滿足不了你的要求,比如說在預設情況下,TextView是不帶邊框的,如果想為TextView添加邊框,我們可以考慮為TextView設定一個背景Drawable,該Drawable隻是一個邊框,這樣就實作了帶邊框的TextView。

drawable\bg_border.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <!-- 設定背景色為透明色 -->
    <solid android:color="#0000"/>
    <!-- 設定紅色邊框 -->
    <stroke android:width="4px" android:color="#f00"/>
</shape>

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

    <!-- 指定圓角矩形的4個圓角的半徑 -->
    <corners
        android:topLeftRadius="20px"
        android:topRightRadius="20px"
        android:bottomLeftRadius="20px"
        android:bottomRightRadius="20px"
        />

    <!-- 指定邊框線條的寬度和顔色 -->
    <stroke android:width="4px" android:color="#f0f"/>
    <!-- 指定使用漸變背景色,使用sweep類型的漸變。顔色從紅色->綠色->藍色 -->
    <gradient
        android:startColor="#f00"
        android:centerColor="#0f0"
        android:endColor="#00f"
        android:type="sweep"
        />
</shape>
           
layout\textview.xml

<?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:orientation="vertical" >

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="帶邊框的文本1"
    android:textSize="22pt"
    android:background="@drawable/bg_border"
/>
<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="圓角邊框、漸變背景的文本"
    android:textSize="22pt"
    android:background="@drawable/bg_border2"
/>
           

</LinearLayout>

UI元件-TextView及其子類

Screenshot_20171018-102316.png

EditText元件

EditText與TextView非常相似,它甚至與TextView共用了絕大部分XML屬性和方法。EditText與TextView的最大差別在于:EditText可以接受使用者輸入。

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:stretchColumns="1">

    <TableRow>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="使用者名:"
            android:textSize="16sp"
            />
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="請填寫登陸賬号"
            android:selectAllOnFocus="true"
            />
    </TableRow>
    <TableRow>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="密碼:"
            android:textSize="16sp"
            />
        <!-- andriod:inputType="numberPassword"表明隻能接受數字密碼 -->
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="numberPassword"
            />
    </TableRow>
    <TableRow>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="年齡:"
            android:textSize="16sp"
            />
        <!-- inputType="number"表明是數值輸入框 -->
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="number"
            />
    </TableRow>
    <TableRow>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="生日:"
            android:textSize="16sp"
            />
        <!-- inputType="date"表明是日期輸入框 -->
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="date"
            />
    </TableRow>
    <TableRow>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="電話号碼:"
            android:textSize="16sp"
            />
        <!-- inputType="phone"表明是輸入電話号碼的輸入框 -->
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="請填寫您的電話号碼"
            android:selectAllOnFocus="true"
            android:inputType="phone"
            />
    </TableRow>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="注冊"
        />
</TableLayout>
           

UI元件-TextView及其子類

Screenshot_20171018-110532.png

android:hint屬性,設定當該文本框内容為空時,文本框内預設顯示的提示文本。

android:inputType屬性,指定文本框的類型。類似于HTML中<input.../>元素的type屬性。

Button元件

Button繼承了TextView,它主要是在UI界面上生成一個按鈕,該按鈕可以供使用者單擊,當使用者單擊按鈕時,按鈕會觸發一個onClick事件。

示例代碼

\layout\button.xml
<?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:orientation="vertical" >

    <!-- 文字帶陰影的按鈕 -->
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="文字帶陰影的按鈕"
        android:textSize="12pt"
        android:shadowColor="#aa5"
        android:shadowRadius="1"
        android:shadowDx="5"
        android:shadowDy="5"
        />
    <!-- 普通文字按按鈕 -->
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="普通按鈕"
        android:textSize="10pt"
        android:background="@drawable/red"
        />
    <!-- 帶文字的圖檔按鈕 -->
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="11px"
        android:text="帶文字的圖檔按鈕"
        android:background="@drawable/button_selector"
        />
</LinearLayout>
           
\drawable\button_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <!-- 指定按鈕按下時的圖檔 -->
    <item android:state_pressed="true"
        android:drawable="@drawable/red"
        />
    <!-- 指定按鈕松開時的圖檔 -->
    <item android:state_pressed="false"
        android:drawable="@drawable/blue"
        />
</selector>

           

UI元件-TextView及其子類

Screenshot_20171018-123121.png

這裡隻是簡單的介紹了Button元件的生成方式,Button是一個很強大的元件,使用Button生成的按鈕不僅可以是普通的文字按鈕,也可以定制成任意形狀。另外,Button的點選事件将在後面的章節介紹。

RadioButton元件和CheckBox元件

單選鈕(RadioButton)和複選框(CheckBox)繼承了Button類,是以可以直接使用Button支援的各種屬性和方法。

\layout\radio_check.xml
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <TableRow>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="性别:"
            />
        <!-- 定義一組單選按鈕 -->
        <RadioGroup
            android:id="@+id/rg"
            android:orientation="horizontal"
            android:layout_gravity="center_horizontal"
            >
            <!-- 定義兩個單選按鈕 -->
            <RadioButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/male"
                android:text="男"
                android:checked="true"
                />
            <RadioButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/female"
                android:text="女"
                />
        </RadioGroup>
    </TableRow>

    <TableRow>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="喜歡的顔色:"/>
        <!-- 定義一個垂直的現線性布局 -->
        <LinearLayout
            android:layout_gravity="center_horizontal"
            android:orientation="vertical"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            >
            <!-- 定義三個複選框 -->
            <CheckBox
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="紅色"
                android:checked="true"
                />
            <CheckBox
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="藍色"
                />
            <CheckBox
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="綠色"
                />
        </LinearLayout>
    </TableRow>
    <TextView
        android:id="@+id/show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
</TableLayout>

           
MainActivity.java
public class MainActivity extends Activity {

    RadioGroup rg;
    TextView show;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.radio_check);

        //擷取rg、show兩個元件
        rg = (RadioGroup) findViewById(R.id.rg);
        show = (TextView) findViewById(R.id.show);
        //為RadioGroup元件的OnCheckedChanged事件綁定事件監聽器
        rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                // TODO Auto-generated method stub
                String tip = checkedId == R.id.male?"您的性别是男人":"您的性别是女人";

                show.setText(tip);
            }
        });
    }

}
           

UI元件-TextView及其子類

Screenshot_20171018-131021.png

andriod:checked屬性,用于指定RadioButton、CheckBox初始時是否被選中。

RadioButton與CheckBox的不同之處在于,一組RadioButton隻能選中其中一個,是以RadioButton通常要與RadioGroup一起使用。

ToggleButton元件和Switch元件

狀态開關按鈕(ToggleButton)和開關(Switch)由Button派生出來,是以它們的本質也是按鈕,隻不過它們通常用于切換程式中的某種狀态。

/layout/togglebutton_switch.xml
<?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:orientation="vertical" >

    <!-- 定義一個ToggleButton按鈕 -->
    <ToggleButton
        android:id="@+id/toggle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textOff="橫向排列"
        android:textOn="縱向排列"
        android:checked="true"
        />
    <!-- 定義一個Switch按鈕 -->
    <Switch
        android:id="@+id/switcher"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textOff="橫向排列"
        android:textOn="縱向排列"
        android:checked="true"
        />
    <!-- 定義一個可以動态改變方向的線性布局 -->
    <LinearLayout
        android:id="@+id/test"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="button1"
            />
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="button2"
            />
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="button3"
            />

    </LinearLayout>
</LinearLayout>
           
public class MainActivity extends Activity {

    ToggleButton toggle;
    Switch switcher;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.togglebutton_switch);

        toggle = (ToggleButton) findViewById(R.id.toggle);
        switcher = (Switch) findViewById(R.id.switcher);

        final LinearLayout test = (LinearLayout) findViewById(R.id.test);

        OnCheckedChangeListener listener = new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub
                if(isChecked)
                {
                    //設定LinearLayout垂直布局
                    test.setOrientation(1);
                    toggle.setChecked(true);
                    switcher.setChecked(true);
                }
                else
                {
                    //設定LinearLayout水準布局
                    test.setOrientation(0);
                    toggle.setChecked(false);
                    switcher.setChecked(false);
                }
            }
        };
        toggle.setOnCheckedChangeListener(listener);
        switcher.setOnCheckedChangeListener(listener);
    }

}

           

UI元件-TextView及其子類

Screenshot_20171018-133244.png

UI元件-TextView及其子類

Screenshot_20171018-133246.png

andriod:textOff屬性,設定目前按鈕的狀态關閉時顯示的文本。

andriod:textOn屬性,設定目前按鈕的狀态關打開時顯示的文本。

AnalogClock元件和TextClock元件

時鐘UI元件是兩個非常簡單的元件,直接上代碼。

<?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:orientation="vertical"
    android:gravity="center_horizontal" >
    <!-- 定義模拟時鐘 -->
    <AnalogClock
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
    <!-- 定義數字時鐘-->
    <DigitalClock
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:textSize="10pt"
        android:textColor="#f0f"
        />
</LinearLayout>
           

UI元件-TextView及其子類

Screenshot_20171018-135214.png

目前TextClock已經取代了早期的DigitalClock元件,需要API17以上才能使用。TextClock元件能以24小時制或12小時制來顯示時間,而且可以由程式員來指定時間格式。

Chronometer元件

計時器(Chronometer)元件繼承自TextView,它顯示的是從某個起始時間開始,一共過去了多長時間。

Chronometer的用法也很簡單,它隻提供了一個andriod:format屬性,用于指定計時器的計時格式。除此之外,還支援如下常用方法。

  • setBase(long base):設定計時器的起始時間。
  • setFormat(String format):設定顯示時間的格式。
  • start():開始計時。
  • stop():停止計時。
  • setOnChronometerTickListener(Chronometer.OnChronometerTickListener listener):為計時器綁定事件監聽器,當計時器改變時觸發該監聽器。

public class MainActivity extends Activity {
    Chronometer ch;
    Button start;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.chronometer);

        ch = (Chronometer) findViewById(R.id.test);
        start = (Button) findViewById(R.id.start);

        start.setOnClickListener(new Button.OnClickListener() {

            @Override
            public void onClick(View v) {
                //設定開始計時時間
                ch.setBase(SystemClock.elapsedRealtime());
                //啟動計時器
                ch.start();
                start.setEnabled(false);
            }
        });
        //為Chronometer綁定監聽事件
        ch.setOnChronometerTickListener(new OnChronometerTickListener() {

            @Override
            public void onChronometerTick(Chronometer ch) {
                //如果從現在開始計時到現在超過了20s
                if(SystemClock.elapsedRealtime() - ch.getBase() > 20 * 1000)
                {
                    ch.stop();
                    start.setEnabled(true);
                }
            }
        });
    }
}

           

UI元件-TextView及其子類

Screenshot_20171018-143258.png

程式中用到的SystemClock類僅是一個擷取系統時間、運作時間的工具類。

繼續閱讀