android 接口怎么创建对象,Layouts

在一个activity中,你的layout是支撑用户界面的整体架构。它定义了布局结构,容纳所有的用户能直接接触的元素。你可以使用以下两种方式声明你的layout:

Android提供了一个明确的对应于View类以及其子类的词汇(vocabulary),比如widgets和layout。

在运行时实例化layout元素。你的应用可以用编程的方式创建View和ViewGroup对象(以及操作它们的属性(properties))。

Android Framework赋予你一定的灵活性来使用他们当中的一种或所有的方法去声明和管理你的应用UI。

举个例子,你可以在XML中声明你的应用的默认布局,包括屏幕元素以及他们的属性。你也可以在运行期添加代码去修改屏幕对象的状态,包括在XML中声明的对象。

ADT

Plugin for Eclipse为你的XML提供了一个layout预览-打开XML文件,选择Layout标签

你还应该尝试一下

Hierarchy Viewer工具,来调试layouts - 它显示layout属性的值,

使用padding/margin指示器来描绘线框图,以及渲染出完整的view结构,当你在模拟器或者真机上调试的时候。

layoutopt工具可以帮助你快速地分析你的layouts和层级结构是否有存在效率低下或者其他的问题。

在XML中声明UI的优点是你可以尽可能地把应用的表现与控制行为的代码分隔开。你的UI描述脱离于在你的应用程序的代码,这就意味着你可以修改或调整它(UI)而不用修改源代码或者说重新编译。举个例子,你可以为不同的屏幕方向,不同的设备屏幕尺寸甚至是不同的语言创建相应的XML布局。另外,在XML中声明layout会让你的UI结构可视化变得更容易,同时受益的还有调试问题。本篇文档聚焦于教你怎样在XML中声明你的layout。如果你更倾向于在运行时实例化View对象,请参看

一般说来,声明UI元素所用到的XML词汇(vocabulary)跟类和方法的命名以及结构对应得很紧密,体现在元素的名字对应于类名而属性名对应于方法名。事实上,这种对应很直接以致于你可以猜到某一个类方法对应的XML属性,或者是根据XML元素猜到对应的类名。

然而,请记住,并不是所有的词汇都是像这样的。在一些情形中,有一些细微的命名差异。举例来说

,EditText元素有一个text属性对应于EditText.setText()方法。

小提示:想要学习更多有关不同layout类型的内容,参看Common

Layout Objects。还有一系列的有关创建各种layouts教程,参看

Hello Views指导。

Write the XML

为了你的阅读方便,与UI相关联的类的API文档列出了所有可用的对应于类方法的XML属性,包括继承得来的属性。

想要学习更多有关XML元素,属性以及XML文件格式的内容,请参看Layout Resources。

使用Android的XML词汇。你可以快速地设计出UI layouts和他们包含的元素.你可以用同样的方法创建web页面-使用一系列的嵌套元素。

每一个layout文件都必须明确地包含一个根元素,它必须是View或ViewGroup类的对象。只要你定义了一个根元素,你就可以添加额外的layout对象或者窗口部件(widget)作为子元素逐渐地建立一个View层次来定义你的layout。

举例来说,下面是一个使用了垂直here's an XML layout that uses a vertical

在XML中声明了你的layout之后,以.xml扩展名保存在你的Android工程的res/layout/目录下,然后才能顺利编译。

稍后我们将会讨论这里展示的每一个属性(attribute)

Load the XML Resource

当编译你的应用程序的时候,每一个XML layout文件被编译成一个

R.layout.layout_file_name的格式传递给它就能做到:

举例来说,如果你的XML layout被保存为main_layout.xml,你就可以像下面这样载入到你的Activity中:

publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main_layout);}

当你的Activity被启动的时候,你的Activity中的onCreate()回调方法就会被Android Framework调用。(在Activities文档中查看有关Activities的讨论)

Attributes

每一个View和ViewGroup对象都支持它们自己的XML属性,一些attributes对于View类来说是特定的(举个例子:TextView支持textSize属性),但是这些属性也会被扩展自View类的对象所继承。

一些属性对于所有的View对象是相通的,因为它们都是从根View类中继承来的(就像id属性)。还有一些属性被认为是“layout Parameters”,意思就是它们用来描述特定的View对象的layout方向,就像在他们的父ViewGroup中定义的一样。

ID

任意一个View对象都可能伴随着一个整数类型的ID用来唯一地标识这个View。当应用被编译的时候,ID是作为一个整数来引用的,

但是这个ID通常在layout XML文件的id属性中被指定为一个字符串。这是一个和所有View对象(在

android:id="@+id/my_button"

字符串开头的(@)标记表明XML解析器应该解析和扩展ID字符串的剩余部分,并且把它定义为标识为一个ID资源。(+)标记意味着这是一个应该被创建并且加入到我们的资源(R.java文件)当中的新的资源名称。

提供了大量的其他的ID资源。当你引用一个Android 资源ID的时候,你没有必要使用“+”,但是你必须加上android的包命名空间。像这样:

android:id="@android:id/empty"

合适地使用android包命名空间,我们就可以引用来自android.R的资源ID,而不是本地的资源类。

为了创建views并且在应用中引用他们,通常的模式是:

在layout中定义一个view或者widget,赋予它们唯一的ID:

创建一个view对象的实例,然后从layout当中捕获它(通常是在ButtonmyButton=(Button)findViewById(R.id.my_button);

当你创建一个

在整个的layout结构中一个ID没有必要是唯一的,但是在你正在搜索的那一部分结构中它应该是唯一的。(很有可能是你整个结构,因此你最好尽可能地让他完全唯一化)。

Layout Parameters

被命名为layout_something的XML的layout属性在自己所处的View中为适合ViewGroup的View定义了layout parameters。

每一个ViewGroup类都实现了一个继承了

31b05c6f9a981e4252db3c0de7b5f43d.png

Figure 1. Visualization of a view hierarchy with layout

parameters associated with each view.

请注意:每一个LayoutParams子类都有它自己的设定值的语法。每一个子元素都必须定义适应它的父元素的LayoutParams,尽管它也可能为它自己的子元素定义不同的LayoutParams。

所有的view group都包含一个宽度和高度属性(layout_width和layout_height),每一个view都要定义他们。很多LayoutParams还会包含可选的margin以及border属性。

你可以用精确的数字指定width与height,虽然你将很可能不会经常这样做。更多地,你将会使用下面这些常量之一去设置你的height和width:

wrap_content告诉你的view调整自己到内容所要求的尺寸。

fill_parent(修改自API 8中的match_parent)告诉你的view变得跟它的parent view group所能允许的最大尺寸一样。

一般来说,使用类似像素的绝对单位来指定一个layout的height和width是不被推荐的,取而代之地,

使用例如密度无关像素单位(dp),wrap_content,fill_parent等相对量度是一种更好的解决办法,

因为这样能帮助你确定你的应用能恰当地显示在大量的不同尺寸的设备屏幕上。这个可接受的衡量方式定义在Available Resources文档中。

Layout Position

View的几何形状是一个矩形,每一个view有一个用left和top的坐标来确定的定位,

另外还有两个量度,height和weight来确定view的高度和宽度。定位的尺寸的单位都是pix(像素)。

用调用

另外,这里还给了几个简便的方法来避免不必要的计算,例如getLeft() + getWidth()。

Size, Padding and Margins

View的大小以width和height显示出来,事实上一个view拥有两对height和width值。

第一对被叫做measured width和measured height。它们定义了一个view在它的parent中显示为多大。

实际的尺寸可通过调用

第二对被简单地称为width和height,有的时候也被叫做drawing width和drawing height。它们在绘制时间以及布局之后定义view在屏幕上的实际尺寸。

这些值可能不必与measured height 和measured width不同。Height和width可以通过调用

为了测量尺寸,view把它的padding计算在内。Padding包括view的上下左右四个部分,单位是像素。Padding可以用特定的像素数来抵消view的内容部分。

举例来说,值为2的left padding将会把view的内容从左边缘向右推2pixels。Padding可以用

尽管view可以定义padding,但是它没有提供任何对margins的支持。然而view groups提供了这样的支持。

更多信息请查询

更多有关dimensions的信息,请参看

Dimension Values.

Common Layouts

请注意:尽管你可以在layout中嵌套使用多个layout来实现你的UI设计,但是你还是应该力求保持你的layout层级尽量地浅显易懂。

你的layout嵌套地越少就会绘制地越快(一个宽泛的view层级比一个深度的要好)。

Although you can nest one or more layouts within another

layout to acheive your UI design, you should strive to keep your layout hierarchy as shallow as

possible. Your layout draws faster if it has fewer nested layouts (a wide view hierarchy is

better than a deep view hierarchy).

linearlayout-small.png

把它的子元素组织在一个单独的水平或竖直的行列里边的layout。如果窗口的长度超过了屏幕的尺寸,那么它会自动建立一个scrollbar(滚动条)。

relativelayout-small.png

它使你能够制定子对象相对于彼此(child A to the left of child B)或者相对于父元素的定位(aligned to the top of the parent)。

Building Layouts with an Adapter

当你的layout内容是动态的或者不是事先确定的,你就可以在使用

常见的被Adapter支持的layout如下:

listview-small.png

显示一个可滚动的单列列表。

gridview-small.png

显示一个可滚动的行列组成的网格。

Filling an adapter view with data

你可以在Adapter绑定

Android提供了一些对提取不同类型数据以及为

当你的数据源是数组的时候使用这个Adapter。默认情况下,

举个例子:如果你有一个想要展示在

ArrayAdapteradapter=newArrayAdapter(this,android.R.layout.simple_list_item_1,myStringArray);

这个构造器的参数是:

你的app的

包含了为数组中每个字符串指定内容的

字符串数组。

ListViewlistView=(ListView)findViewById(R.id.listview);listView.setAdapter(adapter);

为了定制每一个条目的外观,你可以为数组中每个对象重写

当你的数据来自于一个

String[]fromColumns={ContactsContract.Data.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER};int[]toViews={R.id.display_name,R.id.phone_number};

当你实例化

SimpleCursorAdapteradapter=newSimpleCursorAdapter(this,R.layout.person_name_and_number,cursor,fromColumns,toViews,0);ListViewlistView=getListView();listView.setAdapter(adapter);

然后fromColumns插入到对应的toViews view中,并以此在.

如果在你的应用的生命周期当中,你改变了底层可以被Adapter读取的数据,你应该调用

Handling click events

// Create a message handling object as an anonymous class.privateOnItemClickListenermMessageClickedHandler=newOnItemClickListener(){publicvoidonItemClick(AdapterViewparent,Viewv,intposition,longid){// Do something in response to the click}};listView.setOnItemClickListener(mMessageClickedHandler);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值