前言
Android应用的UI组件大多数都在Android.widget包及其子包、Android.view包及其子包中。Android应用的所有UI组件都继承View类,View组件类似IOS中的UIView,代表一个白色的显示UI区域。
View类还要一个重要的子类:ViewGroup(容器类)。
Android所有的UI组件底层都是继承于View,一些组件继承于ViewGroup的子类。Android在UI开发过程中采用的”组合器“设计模式进行UI的布局。 布局都是依靠一个UI容器(ViewGroup),在容器内添加UI组件的方式。
UI布局
Android开发过程中,会遇到各种样式的UI开发,程序员都有自己的开发习惯,有的热衷于纯代码开发,有的人会选择XML,还有的会选择混合使用。
接下来用三个例子,讲解三种模式的UI开发
一、纯代码(不推荐)
在Activity的onCreate方法中,直接开发书写UI布局
// 导入 头文件
import java.util.Date;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 线性布局LinearLayout是ViewGroup的子类
LinearLayout layout = new LinearLayout(this);
super.setContentView(layout);
layout.setOrientation(LinearLayout.VERTICAL);
final TextView show = new TextView(this);
Button btn = new Button(this);
// R.string.MainBtn MainBtn是在res/values/string.xml定义的按钮名字
btn.setText(R.string.MainBtn);
btn.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
layout.addView(show);
layout.addView(btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText("Hello World, " + new Date());
}
});
}
运行结果如图所示:
在上述代码中,可以看到所有UI组件在创建过程中都会把当前Activity(this)传给组件。点击组件初始化方法,可以看到创建UI组件时需要传入一个Context 类参数。
查看Android官方文档Context的解释如下:
Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.
从上述可知Context一下三点作用:
- 它描述的是一个应用程序环境的信息,即上下文。
- 该类是一个抽象(abstract class)类,Android提供了该抽象类的具体实现类
- 通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个Activity,发送广播,接受Intent
Android中的Activity、Service都继承于Context,所以UI组件通过this获取Context传给UI组件。
二、XML(推荐)
Android的Activity页面的类如下:
// 导入 头文件
import java.util.Date;
//Activity内的onCreate方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView show = findViewById(R.id.show);
Button nextBtn = findViewById(R.id.btn);
nextBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText("Hello World, " + new Date());
}
对应Activity的XML UI布局文件如下
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:id="@+id/root"
>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="@+id/root"
android:id="@+id/show"
>
</TextView>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn"
android:text="@string/MainBtn"
app:layout_constraintStart_toStartOf="@+id/root"
app:layout_constraintTop_toBottomOf="@+id/show"
app:layout_goneMarginBottom="10dp"
>
</Button>
</androidx.constraintlayout.widget.ConstraintLayout>
通过XML布局UI,把所有的UI组件都创建在XML文件中,通过Activity进行控制UI组件。
三、XML + 代码
Android通过XML+代码的方式,就不详细列举了。可以参考前两种的方式。
总结
Android的UI开发,更多的采用XML的方式。