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 ...
随机推荐
- Testing和Instrumentation(转)
Android提供了一系列强大的测试工具,它针对Android的环境,扩展了业内标准的JUnit测试框架.尽管你可以使用JUnit测试Android工程,但Android工具允许你为应用程序的各个方面 ...
- android设备连接不上电脑的解决方法
先检查手机usb调试是否开启,已经开启还是连不上按照以下步骤操作: 1. 打开cmd,输入adb devices 查看设备是否连接 2.服务未启动,先杀掉服务:adb kill-server 3.启 ...
- 【python自动化第二篇:python入门】
内容概览 模块 python运行过程 基本数据类型(数字,字符串) 序列类型(列表,元组,字典) 模块使用 模块我们可以把它想象成导入到python以增强其功能的一种拓展.需要使用import来导入模 ...
- jetty之建立多Connector
转自:http://blog.csdn.net/kongxx/article/details/7218787 在嵌入运行Jetty的时候,有时候想要启动两个端口,或者通过一个Jetty server提 ...
- Android Socket编程基础
前些天写了一个Android手机在局域网内利用Wifi进行文件传输的Demo,其中用到了Socket编程,故此总结(盗了网友的一些图和文字).好久好久没来博客园了~~ 1.什么是Socket? soc ...
- java-常用快捷键
alt+/:代码提示 ctrl+/:代码提示 ctrl+1:快速生成impl代码
- 通过查看mysql 配置参数、状态来优化你的mysql
mysql的监控方法大致分为两类: 1.连接到mysql数据库内部,使用show status,show variables,flush status 来查看mysql的各种性能指标. 2. 直接使用 ...
- tty、pty、pts等(小记)
http://blog.csdn.net/dbzhang800/article/details/6939742 1> tty(终端设备的统称):tty一词源于Teletypes,或者telety ...
- 基于HBase0.98.13搭建HBase HA分布式集群
在hadoop2.6.0分布式集群上搭建hbase ha分布式集群.搭建hadoop2.6.0分布式集群,请参考“基于hadoop2.6.0搭建5个节点的分布式集群”.下面我们开始啦 1.规划 1.主 ...
- Java基础知识强化之集合框架笔记62:Map集合之HashMap嵌套HashMap
1. HashMap嵌套HashMap 传智播客 jc 基础班 陈玉楼 20 高跃 ...