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。
横向流
网格流
瀑布流