Android - Android 控件總結

0. Overview

在這裏插入圖片描述

1. TextView

android.widget.TextView extends android.view.View

屬性 描述
android:id 唯一的標識控件ID
android:autoLink 設置是否將指定格式的文本轉換爲可單擊的超鏈接顯示,可選參數值:none;web:URL連接;email:郵箱;phone:電話號碼;map:地圖;all;
android:gravity 文本對齊顯示
android:height 高度設置
android:minHeight 最小高度
android:maxHeigt 最大高度
android:layout_height 相對於佈局的高度
android:hint 當文本爲空時顯示該文本
android:text 文本內容
android:textColor 文本顏色
android:textSize 文本大小
android:typeface 文本字體
android:ellipsize 當文字過長的時候,控件如何顯示,可選參數值:start:省略號顯示在開頭### 3.1 ;end:省略號顯示在結尾;middle:省略號顯示在中間;marquee:以跑馬燈顯示;

2.EditView

android.widget.EditView extends android.widget.TextView

屬性 描述
android:lines 設置編輯文本行數
android:maxLines 設置編輯文本最大行數
android:password 設置文本框中的內容是否顯示爲密碼
android:phoneNumber 設置內容只能是電話號碼
android:scrolHorizontally 設置爲水平滾動
android:singleLine 設置爲單行模式
android:maxLength 設置最大顯示長度
android:autoText 指定該TextView中有個文本輸入法,並自動糾正一些常見的拼寫錯誤。
android:drawableBottom 可拉伸要繪製文本的下面
android:drawableRight 可拉伸要繪製文本的右側

3. Button

android.widget.Button extends android.widget.TextView

3.1

CompoundButton: 一個帶有選中/未選中狀態的按鈕。當按鈕按下或點中時自動改變狀態。
CompoundButton extends Button

3.1.1

RadioButton 單選按鈕有兩種狀態:選中或未被選中。這允許用戶從一個組中選擇一個選項。
RadioButton extends CompoundButton

繼承自類 android.widget.TextView:

屬性 描述
android:autoText 如果設置,指定TextView中有一個文本輸入法,並自動糾正一些常見的拼寫錯誤
android:drawableBottom 可拉伸要繪製的文本下面
android:drawableRight 可拉伸要繪製的文本的右側
android:editable 如果設置,指定 TextView 有一個輸入法
android:text 要顯示的文本

繼承自類 android,view.View

屬性 描述
android:background 這是一個可拉伸爲背景來使用
android:contentDescription 定義文本簡要介紹了視圖內容
android:id 對這一觀點提供一個標識符名稱
android:onClick 在本視圖的上下文視圖被點擊時調用的方法的名稱
android:visibility 控制視圖的初始可視性

3.1.2

ToggleButton 會顯示一個按鈕,選中/取消選中狀態。它基本上是一個開/關按鈕的指示燈。
ToggleButton extends CompoundButton

屬性 描述
android:disabledAlpha alpha禁用時要應用到指示器
androidLtextoff 這是文本按鈕,它未被選中的時候
android:textOn 這是文本按鈕,它被選中時

4. ImageView

android.widget.ImageView extends android.view.View
在界面上展示圖片的一個控件。

android.widget.ImageButton extends android.widget.ImageView

android.widget.ZoomButton extends android.widget.ImageButton

5. ProgressBar

ProgressBar位於android.widget包下,其繼承於View,主要用於顯示一些操作的進度。應用程序可以修改其長度表示當前後臺操作的完成情況。因爲進度條會移動,所以長時間加載某些資源或者執行某些耗時的操作時,不會使用戶界面失去響應。ProgressBar類的使用非常簡單,只需將其顯示到前臺,然後啓動一個後臺線程定時更改表示進度的數值即可。

在界面上顯示一個進度條,表示我們的程序正在加載一些數據。

讓進度條消失使用一個屬性:
android:visibility 可選值:
visible 默認值,控件可見
invisible 控件不可見,但是仍然佔據原來的位置和大小
gone 控件不可見,且不佔用屏幕空間

代碼動態控制使用setVisibility()方法

style 修改爲其他樣式的進度條
android:max 設置進度條最大值

代碼動態控制進度條進程

int progress = progressBar.getProgress();
progress = progress + 10;
progressBar.setProgress(progress);

6. AlertDialog

AlertDialog 可以在當前的界面彈出一個對話框,這個對話框是置頂於所有界面元素之上的,能夠屏蔽掉其他空間的交互,因此AlertDialog 一般都是用於提示一些非常重要的內容或者警告信息。比如用戶刪除前彈出一個確認對話框。

7. ActionBar

過時。被Toolbar代替。

頂部操作欄。Action Bar取代了傳統的tittle bar和menu,在程序運行中一直置於頂部,對於Android平板設備來說屏幕更大它的標題使用Action Bar來設計可以展示更多豐富的內容,方便操控。

8. Toolbar

工具欄,對ActionBar的升級。

Toolbar與ActionBar的區別:

  • ToolBar就是一個View,跟其它View一樣包含在佈局中。
  • 像常規View一樣,Toolbar很容易來放置、實現動畫以及控制。
  • 一個Activity中可以有多個Toolbar。

1.setNavigationIcon: 即設定 up button 的圖標,因爲 Material 的介面,在 Toolbar這裏的 up button樣式也就有別於過去的 ActionBar 哦。
2. setLogo: APP 的圖標。
3. setTitle: 主標題。
4. setSubtitle: 副標題。
5. setOnMenuItemClickListener: 設定菜單各按鈕的動作

9. ListView

9.1 Overview

ListView 以列表的形式展示具體內容,並且能夠根據數據的長度自適應顯示。

ListView 允許用戶通過手指上下滑動的方式將屏幕外的數據滾動到屏幕內,同時屏幕上原有的數據會滾動出屏幕。

9.2 定製ListView界面

ListView是展示大量數據的。
數據無法直接傳遞給ListView,需要藉助適配器來完成。例如,適配器ArrayAdapter。

1.新建一個ListView控件

    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </ListView>

2.一般定義一個實體類,作爲適配器的適配類型。

public class Fruit {

    private String name;
    private int imageId;

    public Fruit(String name, int imageId) {
        this.name = name;
        this.imageId = imageId;
    }

    public String getName() {
        return name;
    }

    public int getImageId() {
        return imageId;
    }
}

3.然後爲ListView的子項指定一個佈局,在layout目錄下創建一個新的xxxx.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">

    <ImageView
        android:id="@+id/fruit_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/fruit_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="10dp"
        />
</LinearLayout>

4.然後創建一個自定義的適配器,繼承自ArrayAdapter,並將泛型指定爲實體類。

public class FruitAdapter extends ArrayAdapter<Fruit>

5.重寫了父類的一組構造函數,用於將上下文、ListView子項佈局的id和數據傳遞進來。

 public FruitAdapter(Context context, int textViewResourceId,
                        List<Fruit> objects) {
        super(context, textViewResourceId, objects);
        resourceId = textViewResourceId;
    }

6.又重寫了getView()的方法,在每個子項被滾動到屏幕內時候會被調用。在getView()方法中,先使用getItem()方法得到當前項的實體類實例,然後使用LayoutInflater來爲這個子項加載我們傳入的佈局。調用View的findViewById()分別獲取到實例,分別調用它們的setImageView和SetText設置顯示的圖片和文字。

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Fruit fruit = getItem(position);
        View view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
        ImageView fruitImage = view.findViewById(R.id.fruit_image);
        TextView fruitName = view.findViewById(R.id.fruit_name);
        fruitImage.setImageResource(fruit.getImageId());
        fruitName.setText(fruit.getName());
        return view;
    }

7.把數據按照實體類格式存儲入List fruitList中

    private List<Fruit> fruitList = new ArrayList<>();
    ...
    initFruits();
	...
    private void initFruits() {
        for (int i = 0; i < 2; i++) {
            Fruit apple = new Fruit("Apple", R.drawable.img_1);
            fruitList.add(apple);
            Fruit banana = new Fruit("Banana", R.drawable.img_2);
            fruitList.add(banana);
            Fruit orange = new Fruit("Orange", R.drawable.img_2);
            fruitList.add(orange);
            Fruit grape = new Fruit("Grape", R.drawable.img_2);
            fruitList.add(grape);
        }
    }

6.最後調用ListView的setAdapter()方法,將構建好的適配器對象傳遞進入。

        FruitAdapter adapter = new FruitAdapter(MainActivity.this,
                R.layout.fruit_item, fruitList);
        ListView listView = findViewById(R.id.list_view);
        listView.setAdapter(adapter);

9.3 提升ListView 的運行效率

9.3.1

在之前的FruitAdapter的getVIew()方法中,每次都把佈局重新加載一遍,當ListView快速滾動時,這就成爲了性能的瓶頸。

        View view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);

getVIew()方法中還有一個convertView參數,這個參數用於將之前加載好的佈局進行緩存,以便之後可以進行重用。

    public View getView(int position, View convertView, ViewGroup parent) {

如果不爲null,重用佈局。

        View view;
        if (convertView == null) {
            view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
        } else {
            view = convertView;
        }

9.3.2

每次在getVIew()方法中會調用View的findViewById()方法來獲取一次控件的實例。

        ImageView fruitImage = view.findViewById(R.id.fruit_image);
        TextView fruitName = view.findViewById(R.id.fruit_name);

創建一個內部類,用於對控件實例進行緩存。(注意內部類是 class 不是 Class)

    class ViewHolder {

        ImageView fruitImage;
        TextView fruitName;
    }

如果佈局爲空,則創建一個控件的實例,如果不爲空,則複用之前的控件實例,重新獲取ViewHolder

 ViewHolder viewHolder;
        if (convertView == null) {
            view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
            viewHolder = new ViewHolder();
            viewHolder.fruitImage = view.findViewById(R.id.fruit_image);
            viewHolder.fruitName = view.findViewById(R.id.fruit_name);
            view.setTag(viewHolder);
        } else {
            view = convertView;
            viewHolder = (ViewHolder) view.getTag();
        }

9.4 ListView的點擊事件

給ListView中的子項響應用戶點擊事件。

        ListView listView = findViewById(R.id.list_view);
        listView.setAdapter(adapter);
		listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                // 響應點擊事件邏輯
            }
        });

10. RecycleView

ListView的不足有二:、

  • 性能比較差,不得不使用一些技巧提升運行效率;
  • 擴展性比較差,只能實現數據縱向滾動的效果,做不到橫向滾動。
    因此使用RecyclerView替代ListView。

橫向流
網格流
瀑布流

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章