安卓复习.Part3

Android UI元素

Android 界面元素主要由5部分组成:

  • 视图(View)
  • 视图容器(ViewGroup)
  • 布局管理(Layout)
  • Activity
  • Fragment

视图View

常见的子类及其功能:

常见的子类及其功能

视图容器

ViewGroup类通常作为其他组件的容器使用。

示意图:

ViewGroup示意图

ViewGroup类提供的主要方法:

ViewGroup类提供的主要方法

ViewGroup的继承者大部分位于android.widget包中。

ViewGroup的继承者大部分位于android.widget包中

布局管理

布局管理器可以根据运行平台来调整组件的大小。

布局管理器

Android常用布局:

  • LinearLayout(线性布局)
  • RelativeLayout(相对布局)
  • TableLayout(表格布局)
  • AbsoluteLayout(绝对布局)

Fragment

Fragment允许将Activity拆分成多个完全独立的可重用的组件;

每个Fragment都是一个独立的模块;

与绑定的Activity紧密联系在一起;

一个Fragment可以被多个Activity所共用;

界面布局

Android中提供了两种创建布局的方式:

  • 在XML布局文件中声明;
  • 在程序中直接实例化布局及其组件;

线性布局

LinearLayout是线性布局,布局中的组件按照垂直或者水平方向进行排列。

相关属性:

线性布局

LinearLayout中子元素的位置都受LinearLayout.LayoutParams的控制。

相关属性:

相关属性

表格布局

TableLayout类似表格形式,以行和列的方式来布局子组件。

在TableLayout中,可以通过以下三类属性对单元格进行设置:

  • Shrinkable(可收缩的列)
  • Stretchable(可伸展的列)
  • Collapsed(要隐藏的列)

表格布局

示例代码:

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

使用TableRow.LayoutParams对TableRow的子元素进行修饰。

示例代码:

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:stretchColumns="0"
    android:collapseColumns="*"
    android:shrinkColumns="*">
    <TableRow tools:ignore="UselessParent">
        <TextView android:text="@string/app_name"/>
        <!--该组件占据2列-->
        <Button android:layout_span="2"/>
        <!--显示在第2列-->
        <Button android:layout_column="2"/>
    </TableRow>
</TableLayout>

相对布局

在相对布局容器中子组件的位置总是相对于兄弟组件或者父容器。

相关属性:

相关属性1

相关属性2

绝对布局

AbsoluteLayout通过指定组件的确切X、Y坐标来确定组件的位置(绝对布局现已被废弃)。

示例代码:

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    tools:ignore="MissingDefaultResource">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_x="10dp"
        android:layout_y="20dp"
        android:text="@string/app_name"/>
</AbsoluteLayout>

事件处理

Android系统中引用了三个事件模型:

  • 事件;
  • 事件源;
  • 事件监听器;

示意图:

示意图

Android中的事件监听器:

监听器

在程序中实现事件监听器,通常有以下四种形式:

  1. Activity本身作为事件监听器:通过Activity实现监听器接口,并实现事件处理方法;
  2. 匿名内部类形式:使用匿名内部类创建事件监听器对象;
  3. 内部类或外部类形式:将事件监听类定义为当前类的内部类或普通的外部类;
  4. 绑定标签:在布局文件中为指定标签绑定事件处理方法;

实现基于监听的事件处理有三步:

  1. 实现基于监听的事件处理步骤;
  2. 在事件处理方法中编写事件处理代码;
  3. 在相应的组件上注册监听器;

Activity本身作为事件监听器

通过Activity实现监听器接口,并实现该接口中对应的事件处理方法。

基于监听的事件处理模型的编程步骤:

  1. 获取所要触发事件的事件源控件;
  2. 实现事件监听器类;
  3. 调用事件源的setXXXListener()方法,将事件监听器注册给事件源对象;

示例代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    Button btn_one;

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

        btn_one = findViewById(R.id.btn_one);

        btn_one.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Log.i("btnOneClick.onClick","btnOneClick");
    }

}

匿名内部类形式

由于大部分情况下事件只是临时使用一次,匿名内部类形式的事件监听器更合适。

示例代码:

public class MainActivity extends AppCompatActivity {

    Button btn_two;

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

        btn_two = findViewById(R.id.btn_two);
        
        btn_two.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i("btnTwoClick.onClick","btnTwoClick");
            }
        });
    }
}

内部类、外部类形式

将事件监听器定义成当前类的内部类;

使用内部的优点:

  • 可以在当前类中复用内部监听类;
  • 可以访问当前类的所有界面组件;

示例代码:

public class MainActivity extends AppCompatActivity {

    Button btn_one;

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

        btn_one = findViewById(R.id.btn_one);

        btn_one.setOnClickListener(new btnOneClick());
    }

    private class btnOneClick implements View.OnClickListener{
        @Override
        public void onClick(View v) {
            Log.i("btnOneClick.onClick","btnOneClick");
        }
    }
}

绑定标签

在界面布局文件中直接为指定标签绑定事件处理方法。

示例代码:

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:stretchColumns="0"
    android:collapseColumns="*"
    android:shrinkColumns="*">
    <TableRow tools:ignore="UselessParent">
        <TextView android:text="@string/app_name"/>
        <Button android:id="@+id/btn_one"
            android:layout_span="1"
            android:layout_column="1"
            android:onClick="onClick"
            android:text="@string/btn_one"/>
    </TableRow>
</TableLayout>

Android在View中提供了五种事件处理的回调方法:

  • onKeyDown();

    捕捉手机键盘被按下的事件。

    它仅应在应用程序具有其自己的屏幕小键盘并且还希望处理硬键盘事件以使其匹配的情况下使用(包括返回键、菜单键以及Home键)。

    也就是说软件盘是无法回调此方法的。

    keyCode对应的按键:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ushm9BIe-1583724001347)(E:\宝库\markdown笔记\安卓\学习\1583133413455.png)]

  • onKeyUp();

    捕捉手机键盘按键抬起的事件。

    它仅应在应用程序具有其自己的屏幕小键盘并且还希望处理硬键盘事件以使其匹配的情况下使用(包括返回键、菜单键以及Home键)。

  • onTouchEvent();

    处理手机屏幕触摸事件。

  • onTrackBallEvent();

    处理轨迹球事件。

  • onFocusChanged()

    焦点改变回调。

常见与焦点相关的方法:

焦点

示例代码:

editText.setKeyListener(new KeyListener() {
    @Override
    public int getInputType() {
        return 0;
    }

    @Override
    public boolean onKeyDown(View view, Editable text, int keyCode, KeyEvent event) {
        return false;
    }

    @Override
    public boolean onKeyUp(View view, Editable text, int keyCode, KeyEvent event) {
        return false;
    }

    @Override
    public boolean onKeyOther(View view, Editable text, KeyEvent event) {
        return false;
    }

    @Override
    public void clearMetaKeyState(View view, Editable content, int states) {

    }
});

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        Log.i("onFocusChange","change");
    }
});

Widget简单组件

Widget组件通用属性:

widget

TextView文本框

用于在屏幕中显示静态的字符串。

继承关系如下:

继承关系

TextView的相关属性:

相关属性1

相关属性2

相关属性3

相关属性4

相关属性5

EditText编辑框

即可编辑的文本框。

常用inputType属性取值:

相关属性1

相关属性2

Button按钮

Button类常用方法:

相关属性

单选按钮和单选按钮组

RadioButton:单个圆形单选框;

RadioGroup:容纳多个RadioButton的容器;

同一个RadioGroup中,只能有一个RadioButton被选中;

不同的RadioGroup中,RadioButton互不影响;

一个RadioGroup中至少有2个RadioButton;

相关方法:

相关方法

CheckBox复选框

CheckBox复选按钮具有选中或者未选中两种状态;

在CheckBox复选框组中,允许同时选中多个;

CheckBox默认都以矩形显示;

开关控制

ToggleButton相关属性:

相关属性
Switch相关属性:

相关属性

图片视图(ImageView)

继承自View组件;

用于显示图片资源;

相关属性:

相关属性

Dialog对话框

Android常用的对话框:

  • AlertDialog提示对话框
  • ProgressDialog进度条对话框
  • DatePickerDialog日期对话框
  • TimePickerDialog时间对话框

AlertDialog提示对话框

AlertDialog继承自Dialog类;

使用Builder内部类进行创建;

可以包含一个标题、一个内容消息或者一个选择列表以及0~3个按钮;

相关属性

示例代码:

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("AlertDialog")
    .setMessage("这是一个AlertDialog")
    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            finish();
        }
    })
.create()
.show();

ProgressDialog进度对话框

  • ProgressDialog有两种显示方式:
    • 滚动的环状图标
    • 带刻度的进度条
  • 通过ProgressDialog.setProgressStyle()方法进行设置:
    • SYTLE_HORIZONTAL——刻度滚动
    • STYLE_SPINNER——图标滚动,默认选项

示例代码:

ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setTitle("progressDialog");
progressDialog.setMessage("正在加载");
progressDialog.setMax(100);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
//设置进度
progressDialog.setProgress(10);
progressDialog.show();

ProgressDialog在API27被废除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值