1.3 Android中的几种UI排布方法介绍
来源:互联网 发布:chainer pytorch 知乎 编辑:程序博客网 时间:2024/06/03 18:54
一、使用XML布局文件控制UI界面
关于XML基本语法介绍和XML语法总结可以参考这里:XML基本语法介绍、XML语法总结。
在Android中,提供了一种非常简单、方便的方法用于控制UI界面。该方法采用XML文件来进行界面布局,从而将布局界面的代码和逻辑控制的Java代码分离开来,使用程序的结构更加清晰、明了,这种方法就是使用XML布局文件控制UI界面。
使用XML布局文件控制UI界面可以分为以下两个关键步骤
(1)在Android应用的res/layout目录下编写XML布局文件,可以是任何符合XML命名规则的文件名。创建后R.java会自动收录该布局资源。
(2)在Activity中使用以下Java代码显示XML文件中布局的内容,如:
setContentView(R.layout.<资源文件名字>);
在上面的代码中,<资源文件名字>是XML布局文件的文件名,通过这段代码步骤就可轻松实现布局并显示UI界面功能了。
当在布局文件中添加多个UI控件时,都可以为该UI组件指定android:id属性,该属性的值代表该组件的唯一标识。接下来如果希望在Java中访问指定的UI组件,则可以通过如下代码进行访问:
findViewById(R.id.<id名称>);
一旦在程序中获得指定UI组件之后,接下来就可以通过代码来控制各个UI组件的外观和行为了,包括UI控件绑定监听器等。
二、使用Java代码控制UI界面
虽然Android推荐使用XML布局文件来控制UI界面,但是如果你愿意,Android也允许我们使用Java动态进行布局,也就是可以根据业务的需求改变界面。
实际上就是用代码写出界面,虽然代码量比较大,而且维护起来相比之下更繁琐一些,特别是一些界面空间比较多的时候。但是它也有缺点,那就是没有静态布局那种无可比拟的灵活性,而且当我们通过自定义来创造属于我们自己独一无二的控件的时候,用的基本上都是动态布局,这也是开发者钟情它的原因。
下面给个简单的栗子:
public class CodeViewActivity extends Activity { // 当第一次创建该Activity时回调该方法 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 创建一个线性布局管理器 LinearLayout layout = new LinearLayout(this); // 设置该Activity显示layout super.setContentView(layout); // 设置布局方向 layout.setOrientation(LinearLayout.VERTICAL); // 创建一个TextView final TextView show = new TextView(this); // 创建一个按钮 Button bn = new Button(this); // 设置按钮文字 bn.setText(R.string.ok); // 设置按钮大小为“包裹内容” bn.setLayoutParams(new ViewGroup.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); // 向layout容器中添加TextView layout.addView(show); // 向layout容器中添加按钮 layout.addView(bn); // 为按钮绑定一个事件监听器 bn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { show.setText(R.string.hello_world + " " + new java.util.Date()); } }); }}
其中,Button就是我们上篇说的View,LinearLayout则是ViewGroup。不难看出,无论创建那种控件都需要传入一个this参数,这是由于创建UI组件时都需要传入一个Context参数,它代表访问Android应用环境全局信息的API,让UI控件持有这么一个Context可以让它通过Context获取安卓应用环境的全局信息。
说到这儿,我想有必要和大家说一下什么是Context,因为这是我们在开发中经常用到的一个概念。
什么是context?
大家有没有想过,一个Android程序和一个Java程序,他们最大的区别在哪里?划分界限又是什么呢?
Context即是上下文
Android程序不像Java程序一样,随便创建一个类,写个main()方法就能跑了,而是要有一个完整的Android工程环境,在这个环境下,我们有像Activity、Service、BroadcastReceiver等系统组件,而这些组件并不是像一个普通的Java对象new一下就能创建实例的了,而是要有它们各自的上下文环境,也就是我们这里讨论的Context。
Context不同的意思
Context在不同的角度有不同的意思,字面意思是上下文,或者叫做场景,也就是用户与操作系统操作的一个过程。比如你打电话,场景包括电话程序对应的界面,以及隐藏在背后的数据。但是在程序的角度Context是个抽象类,他的继承关系如上图所示。
可以看到,Context的继承结构还是稍微有点复杂的,不过在这里我们看到了几个所比较熟悉的面孔,Activity、Service、还有Application(这三个面孔后面的文章里会介绍到)。由此我们就可以得出结论:Context一共有三种类型,分别是Application、Activity和Service。这三个类虽然分别各种承担着不同的作用,但它们都属于Context的一种。
Context的作用
那么Context到底可以实现哪些功能呢?这个就实在是太多了,弹出Toast、启动Activity、启动Service、发送广播、操作数据库等等都需要用到Context。由于Context的具体能力是由ContextImpl类去实现的,因此在绝大多数场景下,Activity、Service和Application这三种类型的Context都是可以通用的。
特殊的场景
有几种场景比较特殊,比如启动Activity,还有弹出Dialog。出于安全原因的考虑,Android是不允许Activity或Dialog凭空出现的,一个Activity的启动必须要建立在另一个Activity的基础之上,也就是以此形成的返回栈。而Dialog则必须在一个Activity上面弹出(除非是System Alert类型的Dialog),因此在这种场景下,我们只能使用Activity类型的Context,否则将会出错。
关于Context的其他的知识,比如:引用的保持、Context数量、使用Application的相关问题等等,我们会在后的相关文章文章中提到。
三、使用XML和Java混合控制UI界面
完全使用Java代码控制Ui界面的时候不仅繁琐,而且不利于解耦,但完全采用Xml方式虽然简单方便,但又有失灵活,因此有些时候,尤其是自定义控件的时候,我们需要用Xml和Java混合的方式来控制UI界面。
来个栗子:
- activity_main.xml
<?xml version="1.0" encoding="utf-8"?><!-- 定义一个线性布局容器 --><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity" android:id="@+id/root" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"></LinearLayout>
上面这个文件简单定义了一个线性布局容器(ViewGroup),然后我们在Java中获取该线性布局,然后通过Java动态的添加组件。
- MainActivity.java
public class MainActivity extends Activity { // 定义一个访问图片的数组 int[] images = new int[] { R.drawable.Will1, R.drawable.Will2, R.drawable.Will3, R.drawable.Will4, R.drawable.Will5, }; int nowImg = 0; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取LinearLayout布局容器 LinearLayout main = (LinearLayout) findViewById(R.id.root); // 程序创建ImageView组件 final ImageView image = new ImageView(this); // 将ImageView组件添加到LinearLayout布局容器中 main.addView(image); // 初始化时显示第一张图片 image.setImageResource(images[0]); image.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 改变ImageView里显示的图片 image.setImageResource(images[++nowImg % images.length]); } }); }}
然后我们为ImageView绑定了点击事件,这样我们就可以通过点击图片进行几张图片的轮询显示了,这就完成了一个混合编程的简单示例。
当然,我们在开发中最常用到的还是用XML布局文件进行布局的编写与调试,而用Java代码这种编写布局的方式在自定义控件的时候里才会经常被用到,而关于自定义控件方面的内容,我们会在之后的文章中提到,还请大家继续关注。
联系方式:
简书:WillFlow
CSDN:WillFlow
微信公众号:WillFlow
- 1.3 Android中的几种UI排布方法介绍
- Android UI– 排布视图
- android更新UI的几种方法
- android更新UI的几种方法
- Android更新UI的几种方法
- android更新UI的几种方法
- android更新UI的几种方法
- Android 更新UI的几种方法
- IOS中的几种延时方法介绍
- [custom UI series]android 自动排布的标签布局
- UI中的几种手势
- 探讨android更新UI的几种方法
- 探讨android更新UI的几种方法
- 探讨android更新UI的几种方法
- Android更新Ui的几种方法和见解
- 探讨android更新UI的几种方法
- Android中更新UI的几种方法
- 探讨Android更新UI的几种方法
- WEB浏览器与UHF超高频读卡器
- Uva 550 Multiplying by Rotation(模拟乘法)
- C标准库之三:errno.h
- List常用方法及3种常用遍历方式
- Spring xml配置文件头解析
- 1.3 Android中的几种UI排布方法介绍
- Android插件化开发技术
- 数据库索引实现原理
- Mycat分布式事务的实现
- 如何自定义JSTL标签与SpringMVC 标签的属性中套JSTL标签报错的解决方法
- dp基础8-- O
- android开发板实现关机功能
- 问题 : 方程求零点
- QNX手册学习————IPC(1)