Android 学习手札(三) 视图(View)
在Android 系统红,任何可视化组件都需要从android.view.View类继承。可以使用两种方式创建View对象。
· 一种方式是使用XML来配置View的相关属性,然后使用相应的方法来装载这些View。
· 另一种方式是完全使用java代码的方式来建立View。
1、 视图简介
Android中的视图可分为3种:布局类(Layout)、视图容器类(View Container)和视图类(例如,TextView就是一个直接继承与View类的视图类)。
android.view.ViewGroup是一个容器类,该类也是View的子类,所有的布局类和视图容器类都是ViewGroup的子类,而视图类直接继承自View类。

2、使用XML布局文件控制视图
XML布局文件是Android系统中定义视图的常用方法。所有XML布局文件必须保存在res/layout目录中。
XML布局文件的命名及定义需要注意如下6点:
· XML布局文件的扩展名必须是xml。
· 由于ADT会根据每一个XML布局文件名在R里中和生成一个变量,这个变量名就是XML布局文件名,因此XML布局文件名(不包含扩展名)必须符合java变量名的命名规则。
· 每一个XML布局文件的根节点可以是任意的组件(widget)。
· XML布局文件的根节点必须包含android命名空间,而且命名空间的值必须是http://schemas.android.com/apk/res/android。
· 为XML布局文件中的标签指定ID时需要使用这样的格式:@+id/somestringvalue,其中@+语法标识如果ID值在R.id类中不存在,则新产生一个与ID同名的变量,如果在R.id类中存在该变量,则直接使用这个变量。
· 由于每一个视图ID都会在R.id类中生成与之对应的变量,因此视图ID的值也要符合java变量的命名规则,这一点与XML布局文件名的命名规则相同。
下面是一个标准的XML布局文件的内容:
<!-- main.xml -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:id="@+id/textview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="textview" />
<Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="第一个按钮" />
</LinearLayout>
如果要使用上面的XML布局文件(main.xml),通常需要在onCreate方法中使用setContentView方法指定XML布局文件的ziyuanID,代码如下:
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.mian);
}
如果想要获得在mian.xml文件中定义的某个View,可以使用如下代码:
TextView textView = (TextView)findViewById(R.id.textview);
Button button = (Button)findViewById(R.id.button);
在获得XML布局文件中的视图对象时需要注意如下3点:
· 在使用findViewById方法之前必须先使用SetContentView方法装载XML布局文件,否则系统会抛出异常。
· 虽然所有的XML布局文件中的视图ID都在R.id类中生成了相应的变量,但使用findViewById方法只能获得已经装在的XML布局文件中的视图对象。
· 在不同的XML布局文件中可以有相同ID值的视图,但在同一个XML布局文件中,虽然也可以有相同ID值的视图,但通过ID值过得视图对象时,只能获得按定义顺序的第一个视图对象,其他相同ID值的视图对象将无法获得。因此,在同一个XML布局文件中应尽量是视图的ID值唯一。
3、在代码中控制视图
虽然使用XML布局文件可以非常方便的对组件进行布局,但若想控制这些组件的行为,仍然需要编写java代码。
下面的代码获得了一个TextView对象,并修改了TextView的文本。
TextView textView = (TextView)findViewById(R.id.textview);
textView.setText("一个新的文本");
setText方法不仅可以直接使用字符串来修改,也可以使用字符串资源对TextView的文本进行修改。
textView.setText(R.string.hello);
注:当setText方法的参数值是int类型时,会被人为这个参数值是一个字符串资源ID,因此,如果要将TextView的文本设为一个证书,需要将这个整数转换成String类型。
任何应用程序都离不开事件,在Android应用程序中一般使用以setOn开头的方法来设置事件类的对象实例。下面的代码为一个Button对象设置了单击事件。
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(this);
在更高级的Android应用中,往往需要动态添加视图。要实现这个功能,最重要的是获得被添加的视图所在的容器对象,这个容器对象所对应的类需要继承ViewGroup。通常这些容器视图呗定义为XML布局文件的根节点。例如,<LinearLayout>、<RelativeLayout>等。
将其他的视图添加到电脑跟前的容器视图中需要如下几步:
· 获得当前的容器视图对象。
· 获得或创建待添加的视图对象。
· 将相应的视图对象添加到容器视图中。
例:
假设有两个XML布局文件:test1.xml 和 test2.xml 。这两个XML布局文件的根节点都是<LinearLayout>,下面的代码获得了 test2.xml 文件中的LinearLayout对象,并将该对象座位test1.xml文件中的<LinearLayout>标签的子节点添加到test1.xml的 LinearLayout对象中。
//获得test1.xml中的LinearLayout对象
LinearLayout testLinearLayout1 = (LinearLayout)getLayoutInflater().inflate(R.layout.test1, null);
//将test1.xml中的LinearLayout对象设为当前容器视图
setContentView(testLinearLayout1);
//获得test2.xml中的LinearLayout对象,并将该对象添加到test1.xml的LinearLayout对象中
LinearLayout testLinearLayout2 = (LinearLayout)getLayoutInflater().inflate(R.layout.test2, testLinearLayout1);
其中inflate方法的第一个参数标识XML布局资源文件的ID,第二个参数标识获得容器视图对象后,要将该对象添加到那个容器视图对象中。在这里testLinearLayout1对象。如果不想将获得的容器视图对象添加到融合其他的容器中,inflate放的第二个参数需要设为null。
除了上面添加方式外,也可以使用addView方法向容器视图中添加视图对象,但要将inflate方法的第二个参数值设为null。
//获得test1.xml中的LinearLayout对象
LinearLayout testLinearLayout1 = (LinearLayout)getLayoutInflater().inflate(R.layout.test1, null);
//将test1.xml中的LinearLayout对象设为当前容器视图
setCOntentView(testLinearLayout1);
//获得test2.xml 中的LinearLayout对象,并将该对象添加到test1.xml的LinearLayout对象中
LinearLayout testLinearLayout2 = (LinearLayout)getLayoutInflater().inflate(R.layout.test2, null);
testLinearLayout1.addView(testLinearLayout2);
除此之外,还可以完全使用java代码创建一个视图对象,并将该对象添加到布局视图中,代码如下:
EditText editText = new EditText(this);
testLinearLayout1.addView(editText);
向布局视图添加视图对象时需要注意如下2点:
· 如果使用setCOntentView方法将容器视图设为当前视图后,还想向容器视图中添加新的视图或进行其他的操作,setContentView方法的参数值应直接使用容器视图对象,因为这样可以向容器视图对象中添加新的视图。
· 一个视图只能有一父视图,也就是说,一个视图只能被包含在一个容器视图中,因此,在向容器视图添加其他视图时,不能将XML布局文件中非根节点的视图对象添加到其他的容器视图中。例如,在前面的例子中不能将使用testLinearLayout.findViewById(R.id.textView2)获得的TextView对象添加到testLinearLayout1对象中,这是因为这个TextView对象已经属于test2.xml中的<LinearLayout>标签了,不能再属于test1.xml中的<LinearLayout>标签了。
Android 学习手札(三) 视图(View)的更多相关文章
- 三、Android学习第三天——Activity的布局初步介绍(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 三.Android学习第三天——Activity的布局初步介绍 今天总结下 ...
- android学习日记06--View视图
一.android 界面开发 1.三个重要的类:View视图.Canvas画布.Paint画笔2.android 界面开发常用三种视图 View --只能在主线程中更新,没有缓存 ...
- 【Android】完善Android学习(三:API 3.0)
备注:之前Android入门学习的书籍使用的是杨丰盛的<Android应用开发揭秘>,这本书是基于Android 2.2API的,目前Android已经到4.4了,更新了很多的API,也增 ...
- android学习日记06--SurfaceView视图
一.API关SurfaceView的介绍 SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface.你可以控制这个Surface的格式和尺寸.Surfacev ...
- Oracle 学习笔记 11 -- 视图 (VIEW)
本次必须学习一个全新的概念-- 视图 (VIEW).在前面的笔记中曾提到过,数据对象包含:表.视图.序列.索引和同义词.前面的笔记都是对表的想剖析,那么本次笔记就对视图的世界进行深入的剖析. 视图是通 ...
- Android编程动态创建视图View的方法
在Android开 发中,在Activity中关联视图View是一般使用setContentView方法,该方法一种参数是使用XML资源直接创 建:setContentView (int layout ...
- 关于Android界面编程与视图(View)组件
UI组件--------------->android.widget.* View组件------------->android.view.* 视图(View)组件 所有UI组件都是建立在 ...
- Android学习第三天-打包常用命令
在前面<Android学习第一天-adb常用命令>和 <Android学习第二天-android常用命令>两篇博文中,我们重点讲解了adb和android的常用命令,下面我们讲 ...
- Android学习笔记(第二篇)View中的五大布局
PS:人不要低估自己的实力,但是也不能高估自己的能力.凡事谦为本... 学习内容: 1.用户界面View中的五大布局... i.首先介绍一下view的概念 view是什么呢?我们已经知道一个Act ...
随机推荐
- [SAM4N学习笔记]按键程序(查询方式)
一.准备工作: 将上一节搭建的工程复制一份,命名为"5.key scanf".这一节主要讲如何使用SAM4N的GPIO输入功能,实现按键的输入. 二.程序编写: ...
- 依据linux Oops信息准确定位错误代码所在行
在linux下调tvp5150am1的过程中,遇到了一kernel oops,内容如下: [ 66.714603] Unable to handle kernel paging request a ...
- hug and Compression Resistance
Hugging => content does not want to grow Compression Resistance => content does not want to sh ...
- UIView frame, bounds and center
http://stackoverflow.com/questions/5361369/uiview-frame-bounds-and-center Since the question I asked ...
- 【Java重构系列】重构31式之封装集合
2009年,Sean Chambers在其博客中发表了31 Days of Refactoring: Useful refactoring techniques you have to know系列文 ...
- Sruts2文件上传的ContentType的取值列表
".*"="application/octet-stream" ".001"="application/x-001" & ...
- java接口相关例题
java接口相关习题 interface Graphics{ //接口里面只能用抽象方法 public abstract double area(); }//设置 平面类class Plan ...
- 部分 CM11 系统 Android 平板执行植物大战僵尸 2 黑屏的解决的方法
原文 http://forum.xda-developers.com/showthread.php?t=2755197 部分 CM11 系统的 Android 平板(比如三星 GT-P5110 )执行 ...
- EF 命令
我们选VS中工具-库程序包管理器-程序包管理器控制台, 这时在VS底部会出现控制台 这时候我们要执行四个操作: 下载安装EF 到工程.PM> Install-Package EntityFram ...
- .NET 解析HTML代码——NSoup
NSoup是一个开源框架,是JSoup(Java)的.NET移植版本 1.直接用起来 NSoup.Nodes.Document htmlDoc = NSoup.NSoupClient.Parse(HT ...