Android - Android 控件总结

本文总结了Android中常用的UI控件,包括TextView、EditText、Button、ImageView、ProgressBar、AlertDialog、ActionBar、Toolbar、ListView和RecyclerView。详细讲解了各控件的特性、用法及如何提升ListView的运行效率。还介绍了RecyclerView作为ListView的替代品,支持更多布局方式。
摘要由CSDN通过智能技术生成

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:disabledAlphaalpha禁用时要应用到指示器
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。

横向流
网格流
瀑布流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值