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 ...
随机推荐
- FileStream的使用
一.写入文件 string strContent = textBox2.Text.ToString(); //创建文件流(文件路径,文件操作,创建) using (FileStream fs = ne ...
- android4.0 FaceDetection笔记
这几天研究了下andoid4.0.3的FaceDetection这里写一下大致的流程,方便日后查阅. 相关说明可以在这里找到: frameworks/base/docs/html/guide/topi ...
- PTA 07-图4 哈利·波特的考试 (25分)
哈利·波特要考试了,他需要你的帮助.这门课学的是用魔咒将一种动物变成另一种动物的本事.例如将猫变成老鼠的魔咒是haha,将老鼠变成鱼的魔咒是hehe等等.反方向变化的魔咒就是简单地将原来的魔咒倒过来念 ...
- jQuery ajax传递特殊字符参数(例如+)
使用jQuery ajax向后台传递参数para=1+1时后台接收到的参数为para=1 1,解决方案是 使用json传递,代码如下. var url = "/test/check" ...
- Android自定义属性时TypedArray的使用方法
有时候android传统的页面布局不足以满足我们的需求,常常需要自己定义view,通常继承View,然后重写构造方法以及onDraw等函数,再 具体实现自己定义的复杂view.我们知道在给控件赋属性时 ...
- 数据结构与算法/leetcode/lintcode题解
http://algorithm.yuanbin.me/zh-hans/index.html
- Qt OpenGL三维绘图
简介 OpenGL是为三维绘图提供的标准应用编程接口. OpenGL处理的仅仅是三维绘图方面,而很少或是根本不提供图形用户界面编程方面的支持.OpenGL*应用程序的用户界面必须由其它工具包创建,比 ...
- kafka Windows客户端Linux服务器---转
原文:http://blog.csdn.net/jingshuigg/article/details/25001979 一.对于服务器端的搭建可以参考上一篇文章:kafka单机版环境搭建与测试 服务器 ...
- 安装MySQL和HandlerSocket
CentOS 6.5MySQL 5.6.33HandlerSocket 1.1.2 # Get packagesshell> wget http://dev.mysql.com/get/Down ...
- centos 安装mysqldb 记录
vim setup_pofix.py #修改mysql_config路径 <pre> ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /us ...