您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

Android利用者界面详解

发布日期:2011-04-11

这个章节形貌怎么实现一个基本的Android界面。它涉及构建屏幕底子元素,怎么在xml(定义文件)内定义屏幕、用你的代码天生、在差别任务你须要利用你的利用者接口。Android天生屏幕有三种要领:xml配置天生;通过你本身利用者界面接口天生直接用代码天生。根据MVC原则,UI应该与步调逻辑相疏散,因此,在XML中定义UI布局是高度保举的。别的,一个步调从一个屏幕方案调解到另一个也容易得多。在XML中定义UI跟创建一个通常的HTML文档非常相似,比喻,你有如下的一个文件:

<html>

<head>

<title>Page Title</title> 

</head> 

<body>

The content of the body element.

</body>

</html>

就如Android的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:layout_width="wrap_content" 

android:layout_height="wrap_content"

android:text="Hello World"/> 

</LinearLayout>

3.2.1屏幕元素的层次  

   Android应用步调的底子结果单位便是Activity--android.app.Activity类中的一个东西。一个Activity可以做很多事,但是他本身并不会表现到屏幕上。想要让你的Activity表如今屏幕上并且筹划它的UI,你须要利用view和viewgroup--Android平台底子的利用者界面表达单位。

Views 

一个view是一个android.view.View底子类的东西。它是一个存储有屏幕上特定的一个矩形内结讨论内容属性的数据布局。一个View东西处理惩罚处罚测距和布局,画图,内核变动,转动条,另有屏幕地区本身表现的按键和手势。

View类作为一个基类为widget(窗体部件)办事,widget--是一组用于绘制交互屏幕元素的完全实现子类。Widget处理惩罚处罚它们本身的测距和画图,以是你可以更快速地用它们去构建你的UI。可用到的widget包括Text,EditText,InputMethod,Button,RadioButton,Checkbox,和ScrollView……。 

Viewgroups 

一个ViewGroup是一个android.view.Viewgroup类的东西。恰宛如它的名字表明的一样,一个viewgroup是一个分外的view东西,它的结果是去装载和办理一组基层的view和其他viewgroup,Viewgroup让你可以为你的UI增长布局并且将巨大的屏幕元素构建成一个独立的实体。 

Viewgroup类作为一个基类为layout(布局)办事,layout--是一组提供屏幕界面通用典范的完全实现子类。layout让你可以为一组view构建一个布局。

一个树形布局的界面 

在Android平台上,你用view树和viewgroup节点来定义一个Activity的UI,就宛如下面图表一样。这个树可以如你须要那样大抵大概巨大,并且你可以利用Android的预定义widget和layout大概你自定义的view典范来构建它。 

一个view和viewgroup树的样例: 

 

Picture 4 Android UI - Tree structure 

要将屏幕绑定一个树以便于渲染,你的Activity调用它的setContentView()要领并且转达一个参数给根节点东西。一旦Android体系得到了根节点的参数,它就可以直接通过节点来无效化,测距和绘制树。当你的Activity被激活并且得到内核时,体系会关照你的activity并且恳求根节点去测距并绘制树,根节点就会恳求它的子节点去绘制它们本身,同时,每个树上的viewgroup节点认真绘制它的直接子节点。

正如之条件到的,每个view group都有丈量它的有效空间,布局它的子东西,并且调用每个子东西的Draw()要领去绘制它们本身。子东西大概会恳求得到一个它们在父东西中的大小和位置,但是父东西敷衍每个子东西的大小和位置有终极的决定权。

LayoutParams:一个子东西怎样指定它的位置和大小 

每个viewgroup类都市利用一个承继于Viewgroup.LayoutParams的嵌套类。这个子类包括了一系列的属性典范,这些属性典范定义一个子东西位置和大小,view group类相适应。 

layoutparams的一个样例

要过细的是,每个LayoutParams子类都有它本身赋值的语法。每个子元素必须定义实用于它们父东西的LayoutParams,只管父东西大概会为子元素定义差别的LayoutParams。 

全部的viewgroup都包括宽和高。很多还包括边界的定义(margin和border)。你可以非常精确地形貌宽和高,只管你并不想通常这么做。更多时间你渴望你的view自行调解到适应内容大小,大概适应容器大小。

 Android 界面元素与Swing界面元素的比较 

   Android 界面元素

Swing 界面元素

Activities

Frame

Views

Components

TextViews

Labels

EditTexts

TextFields

Buttons

Buttons

Android和Swing的监听者设置也险些一样:

3.2.2 通用布局东西

下面为在你的应用中为最广泛的view groups。这里先容每种典范的一些底子信息;更深入的细节,请看每章前面的链接参考页。 

FrameLayout

FrameLayout是最大抵的一个布局东西。它被定制为你屏幕上的一个空缺备用地区,之后你可以在此中添补一个单一东西 — 比如,一张你要颁发的图像。全部的子元素将会牢固在屏幕的左上角;你不克不及为FrameLayout中的一个子元素指定一个位置。后一个子元素将会直接在前一个子元素之上举行包围添补,把它们部份或全部挡住(除非后一个子元素是透明的)。

LinearLayout

LinearLayout以你为它设置的垂直或程度的属性值,来分列全部的子元素。全部的子元素都被堆放在别的元素之后,因此一个垂直列表的每一行只会有一个元素,而不管他们有多宽,而一个程度列表将会只有一个行高(高度为最高子元素的高度加上边框高度)。LinearLayout连壮实元素之间的隔绝以及相互对齐(相对一个元素的右对齐、中间对齐大概左对齐)。 

LinearLayout还增援为单独的子元素指定weight。好处便是容许子元素可以添补屏幕上的剩余空间。这也克制了在一个大屏幕中,一串小东西挤成一堆的环境,而是容许他们放大添补空缺。子元素指定一个weight值,剩余的空间就会按这些子元素指定的weight比例分派给这些子元素。默认的weight值为0。比喻,要是有三个笔墨方块,此中两个指定了weight值为1,那么,这两个笔墨方块将等比例地放大,并填满剩余的空间,而第三个笔墨方块不会放大。

下面的两个窗体采取LinearLayout,包括一组的元素:一个按钮,几个标记,几个笔墨方块。两个窗体都为布局做了一番修饰。笔墨方块的width被设置为FILL_PARENT;别的元素的width被设置为WRAP_CONTENT。默认的对齐要领为左对齐。左边的窗体没有设置weight(默以为0);右边的窗体的comments笔墨方块weight被设置为1。要是Name笔墨方块也被设置为1,那么Name和Comments这两个笔墨方块将会有同样的高度。 

在一个水中分列的LinearLayout中,各项按他们的纯笔墨文件基线举行分列(第一列第一行的元素,即最上或最左,被设置为参考基线)。因此,人们在一个窗体中检索元素时,就不须要忐忑不安地读元素的纯笔墨文件了。我们可以在layout的XML中设置android:baselineAligned="false",来封闭这个设置。 

TableLayout

TableLayout将子元素的位置分派到行或列中。android的一个TableLayout由很多的TableRow构成,每个TableRow都市定义一个row(原形上,你可以定义别的的子东西,这在下面会表明到)。TableLayout容器不会表现row、cloumns或cell的边边框。每个row拥有0个或多个的cell;每个cell拥有一个View东西。表格由列和行构成很多的单位格。表格容许单位格为空。单位格不克不及跨列,这与HTML中的不一样。下图表现了一个TableLayout,图中的虚线代表不可视的单位格边框。 


列可以被潜伏,也可以被设置为伸张的从而添补可利用的屏幕空间,也可以被设置为陵暴列紧缩直到表格结婚屏幕大小。敷衍更过细信息,可以查察这个类的参考文档。 

AbsoluteLayout

AbsoluteLayout可以让子元素指定精确的x/y坐标值,并表如今屏幕上。(0, 0)为左上角,当向下或向右移动时,坐标值将变大。AbsoluteLayout没有页边框,容许元素之间相互重叠(只管不保举)。我们通常不保举利用AbsoluteLayout,除非你有合法来由要利用它,由于它使界面代码太过刚性,以至于在差别的配置上大概不克不及很好地变乱。 

RelativeLayout

RelativeLayout容许子元素指定他们相敷衍别的元素或父元素的位置(通过ID指定)。因此,你可以以右对齐,或上下,或置于屏幕中间的情势来分列两个元素。元素序序次分列,因此要是第一个元素在屏幕的中间,那么相敷衍这个元素的别的元素将以屏幕中间的相对位置来分列。要是利用XML来指定这个layout,在你定义它之前,被讨论干系的元素必须定义。 

这是一个RelativeLayout例子,此中有可视的和不可视的元素。底子的屏幕layout东西是一个RelativeLayout东西。

这个视图表现了屏幕元素的类名称,下面是每个元素的属性列表。这些属性一部份是由元素直接提供,另一部份是由容器的LayoutParams成员(RelativeLayout的子类)提供。RelativeLayout参数有width,height,below,alignTop,toLeft,padding和marginLeft。过细,这些参数中的一部份,其值是相敷衍别的子元素而言的,以是才RelativeLayout。这些参数包括toLeft,alignTop和below,用来指定相敷衍别的元素的左,上和下的位置。

Summary of Important View Groups 

告急View Group择要 

These objects all hold child UI elements. Some provide visible UI, and others only handle child layout. 

这些东西拥有UI子元素。一些提供可视的UI,另一些只处理惩罚处罚子元素的布局。 

Class 

Description 

AbsoluteLayout 

可以通过精确的坐标(如屏幕像素)指定子东西相对父容器的位置 

FrameLayout

认真表现单一东西的Layout 

Gallery

一个以程度转动要领表现有序图像列表的表现器 

GridView  

表现一个可转动的有m列n行的表格 

LinearLayout  

以程度或垂直要领表现子元素的Layout。要是窗体的长度超过跨过了屏幕的长度,将会出现转动条 

ListView

表现一个可转动的单列列表 

PopupList 

一个独立的带边框的元素弹出列表 

RelativeLayout  

可以大概指定子东西相敷衍别的东西(如A在B的左边)或父东西(如在父容器的顶部)的位置 

ScrollView

一个垂直的元素转动列 

Spinner

在一个单行笔墨方块中,同时只表现一个有序列表中的一个项。雷同于一个可以程度或垂直转动的单行listbox 

SurfaceView

提供直接访问一个可画图的界面。可以控制在界面顶部的子视图层。SurfaceView是提提供须要直接画像素而不是利用窗体部件的应用利用的。 

TabHost

提供一个页签选择列表,监督点击并在一个页签被点击时包管应用切换屏幕。 

TableLayout  

一个拥有恣意行和列的表格layout,每一个单位格拥有窗体部份。行会根据最大的列而主动调解大小。单位格边框不可见。 

ViewFlipper

一个在单行笔墨方块中同临时间只表现一项的列表组件。它可以根据时间周期切换表现项,雷同一个幻灯机。 

ViewSwitcher  

雷同ViewFlipper 

3.2.3数据绑定 

有些View groups会有UI。这些东西通常是AdapterView类的子类.比喻包括图库和列表视图, 它们具有两个共同的职责:

· 添补布局数据 

· 处理惩罚处罚利用者利用 

添补布局数据

添补布局数据通常通过把这个类绑定到一个Adapter来完成,Adapter从某个地方获取它的数据,大概是代码提供的一个列表,大概是来自配置数据库的查问结果。 

// Get a Spinner and bind it to an ArrayAdapter that 

// references a String array.

Spinner s1 = (Spinner) findViewById(R.id.spinner1);

ArrayAdapter adapter = ArrayAdapter.createFromResource(

    this, R.array.colors, android.R.layout.simple_spinner_item);

adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

s1.setAdapter(adapter);

// Load a Spinner and bind it to a data query.

private static String[] PROJECTION = new String[] {

        People._ID, People.NAME

    };

Spinner s2 = (Spinner) findViewById(R.id.spinner2);

Cursor cur = managedQuery(People.CONTENT_URI, PROJECTION, null, null);

     

SimpleCursorAdapter adapter2 = new SimpleCursorAdapter(this,

    android.R.layout.simple_spinner_item, // Use a template

                                          // that displays a

                                          // text view

    cur, // Give the cursor to the list adatper

    new String[] {People.NAME}, // Map the NAME column in the

                                         // people database to...

    new int[] {android.R.id.text1}); // The "text1" view defined in

                                     // the XML template

 

adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

s2.setAdapter(adapter2);

过细:利用CursorAdapter时,必须有People._ID, 不然将会孕育产生非常。

处理惩罚处罚利用者利用

Android通过设置类的AdapterView.OnItemClickListener 成员到一个监听者并捕获利用者的利用变乱,来处理惩罚处罚利用者的利用。 

 // Create a message handling object as an anonymous class.

 private OnItemClickListener mMessageClickedHandler = new OnItemClickListener() {

     public void onItemClick(AdapterView parent, View v, int position, long id)

     {

         // Display a messagebox.

         showAlert("You've got an event", "Clicked me!", "ok", false);

     }

 };

 

 // Now hook into our object and set its onItemClickListener member

 // to our class handler object. 

 mHistoryView = (ListView)findViewById(R.id.accept_button);

 mHistoryView.setOnItemClickListener(mMessageClickedHandler);