Android UI基础

Android UI概述


Android UI由View和ViewGroup组成。

ViewGroup是不可见的,用于组织和排版View和ViewGroup。

View用户显示内容,以及响应用户的操作。

可以按照需要安排UI的叠放,不过叠放的层数越少,性能上来说越好。

Android UI可以在code中生产,不过更加方便的方式是在Android的XML文件中定义UI。

Layouts 通过XML方式实现


可以通过2种方式定义界面结构。

1. 在XML定义视图结构

2. 在运行时动态创建视图结构

通过XML定义视图结构,可以有效的做到代码与界面分离,并且提高界面结构的可读性。

XML书写方式

xml的file必须包含一个root,可以是View或者ViewGroup。在节点下面增加子界面的方式来构造界面结构。

xml的基本书写结构可以参照http://developer.android.com/guide/topics/resources/layout-resource.html

加载xml资源

在编译程序阶段,所有的XML layout文件都会编译到一个统一的View资源里面。

在需要使用layout资源的时候,需要将资源加载到程序中,一般的做法是在
Activity.onCreate()中做加载的资源的操作。

如果界面的文件名称是main_layout.xml,则可以如下方式加载。

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
}

XML layout属性

每个View或者ViewGroup都有自己特有或者继承下来的属性。

ID

每一个View或者ViewGroup都有一个ID属性。该属性由class View定义。其定义语法为:

android:id="@+id/my_button"

@ 的意思是指示XML parser解析并且展开后面的内容,将其作为一个ID的资源。

+ 的意思是指示这是一个新的ID,需要将其加到资源定义文件R.java中去。

有一些系统自定的ID,如果引用这些系统自定义的ID,则不需要加+号,但需要加上包的命名空间,其定义的语法为:

android:id="@android:id/empty"
 
常用的定义一个view或者widget,并且在代码中调用的方式如下:
1.定义一个View,并且配置一个唯一的ID
<Button android:id="@+id/my_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/my_button_text"/>
2.使用这个唯一的ID在代码中创建实例
Button myButton = (Button) findViewById(R.id.my_button);
IDs在RelativeLayout中会显的更加的重要,因为需要通过IDs来指定其旁边的View。哪个View在自己的左边,哪个View在自己的右边,或者上面或者下面。

Layout相关的参数

在XML文件中,通常使用layout_something来定义View在ViewGroup中的位置

ViewGroup类会实现一个嵌套类来扩展ViewGroup.LayoutParams.这个内嵌的子类会定义类型来指定子View的位置和大小。

如下图所示,父view group会为其子view或者子view group都定义layout参数

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

Layout参数对于其父节点和对于其子节点的含义都可能是不一样的,因此要区别对待。

每一个view group一般都会包含width和height参数(layout_width and
layout_height),因此每个再其内的view都需要定义这俩个属性。

一般我们不会将其指定为某一个宽度或者高度,一般写为相对的,这样可以保证适应于多种屏幕大小的设备。

  • wrap_content:根据内容的大小调节大小

  • fill_parent:最大化达到父几点所允许的,在API level 8后名字改为match_parent

Layout的位置

View作为一个几何图形,具有4个属性对应于他所属的容器,分别是left, top, width和height,每个属性的单位是pixel

参考API文档,可以很多函数获取位置以及View的大小信息。getLeft()getTop()getRight()getBottom()

获取的值一般都是相对应与父节点的位置和大小信息

Size,Padding和Margins

Size由View的width和height来表示。

width和height有2种类型,一种是对应于父容器的measured width和measured
height,其是相对于父容器的高度和宽度。可以由getMeasuredWidth()getMeasuredHeight()获取。

另外一种是针对于整个界面的实际width和height,可以由getWidth()getHeight()获取。

Padding也会被计算入measure
size内,Padding,顾名思义,是内容与View空间直接的间隔。可以由函数setPadding(int,
int, int, int)
进行设置。可由getPaddingLeft()getPaddingTop()getPaddingRight()getPaddingBottom()获取相对应额值。

View并未提供Margins属性,该属性一般由ViewGroup设置。

Layout的通常模式

每一个ViewGroup都会提供一种特有的排列方式。下面是几种常看见的方式。

Note:尽管可以通过在layout中嵌入其他的layout方式来设计一个结构复杂的layout,但是这样会导致layout的结构变的复杂。不利于UI的性能。尽量保持UI嵌套的层数少些。















Linear Layout

Relative Layout

Web
View
将内容排列成横列或者竖列显示,如果超出屏幕,则显示滚动条。 可以灵活的设置子view的位置,已经子view之间的位置。 像浏览器一样显示HTML文档

绑定数据源

如果需要在界面上显示的内容是动态获取的话,可以使用使用Adapter和继承AdapterView的View来动态显示。

Adapter是数据源和AdapterView之前的桥梁,由他从数据源获取数据,然后转换为一组实体,填充到View。

一般的数据显示模式如下:












List View

Grid View
可以上下滚动的单行列表 可以滚动的行和列的表格

在Adapter中填入数据

可以简单的使用继承自AdapterView的View来绑定Adapter,来获取外部数据源的数据。

Andorid也提供了一些继承自Adapter的子类用于处理不同的数据形式来建立View,下面是3种比较常见的Adapter:

ArrayAdapter

当数据源是一个数组的时候,可以使用这个Adapter,默认,ArrayAdapter在调用toString()后会为每个Item创建一个TextView

举个例子,如果想在ListView中显示一个字符串数组,需要实例化一个ArrayAdapter,指定其Layout,每个String的名称,和String列表

ArrayAdapter adapter = new ArrayAdapter<String>(this, 
        android.R.layout.simple_list_item_1, myStringArray);
参数分别为:app Context,含义显示String的TextView的layout,String列表
第二步:在ListView上设置Adapter
ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(adapter);

如果需要定义String的输出格式,可以重载toString(),或者可以不用TextView,换做其他可以显示丰富内容的控件,比如ImageView

可以方便的扩展ArrayAdaptergetView()来满足不同的显示样式。

SimpleCursorAdapter

如果数据源是来自于游标(Cursor)的时候,使用这个Adapter。使用这个Adapter的时候,需要指定Cursor的哪个行,哪个列插入Layout的View。

举例来说,有一个游标包含了People的数据,People包含name和number字段。

这时候,需要创建一个字符串数组用于指定哪些字段需要显示。一个整形数组,用于指定字段需要显示到哪个控件上

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

当实例化SimpleCursorAdapter时候,传入这些参数

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
        R.layout.person_name_and_number, cursor, fromColumns, toViews, 0);
ListView listView = getListView();
listView.setAdapter(adapter);

SimpleCursorAdapter会将fromColumns的内容填入toViews的View中。

如果,在程序的周期内,如果在Adapter内的数据被改变,那么必须调用notifyDataSetChanged(),这个函数将会通知与这个adapter相关的View并且刷新自己。

处理点击事件

可以通过实现AdapterView.OnItemClickListener接口来让AdapterView响应点击事件。

// 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) {
// Do something in response to the click
}
};

listView.setOnItemClickListener(mMessageClickedHandler);

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

参考文档:http://developer.android.com/guide/topics/ui/declaring-layout.html

Android UI基础,码迷,mamicode.com

时间: 2025-01-02 16:30:52

Android UI基础的相关文章

Android UI 基础知识

[相关概念] View 视图 ViewGroup   视图容器 Layout  布局 Activity 活动 Fragment 片段 Widget  部件 Dialog   对话框 Material Design  材料设计/原质化设计 Material Design 中文版 参考资料:http://hukai.me/android-training-course-in-chinese/basics/firstapp/building-ui.html Android 的图形用户界面由多个视图(V

Android Activity基础详解

一.Activity简介 Activity 是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话.拍摄照片.发送电子邮件或查看地图等操作. 每个 Activity 都会获得一个用于绘制其用户界面的窗口.窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上. 一个应用通常由多个彼此松散联系的 Activity 组成. 一般会指定应用中的某个 Activity 为"主" Activity,即首次启动应用时呈现给用户的那个 Activity. 而且每个 Activity 均可启动另

android UI设计时需要注意遵循的设计原则

1.Android设备屏幕尺寸分布 首先看一下各种屏幕的尺寸和屏幕密度划分,下图是各种屏幕尺寸对应的范围: 从上图可以看出,对应normal尺寸的屏幕范围集中在常见的3到5寸屏之间,large尺寸对应的就主要是5到7寸的nottpad之类的设备,例如三星的Note和Nexus7平板等,再网上走就是平板电脑了.接下来是屏幕密度(dpi),需要说明的时,平时所说的屏幕分辨率其实不能作为屏幕适配的依据,应该依据屏幕密度和屏幕尺寸来换算,屏幕密度是指每寸屏幕内容纳的像素数,屏幕密度从ldpi到xhdpi

Android零基础入门第16节:Android用户界面开发概述

相信通过前面15期的学习,Android的开发环境已经基本掌握了,如果仍有问题,欢迎到Android零基础入门技术讨论微信群交流,从本期开始正式来一步一步踏入Android开发之路. Android应用开发的一项内容就是用户界面的开发.Android提供了非常丰富的用户界面组件,借助于这些用户界面组件,开发者可以非常方便地进行用户界面开发,而且可以开发出非常优秀的用户界面. 一.界面UI元素介绍 Android应用是运行于手机系统上的程序,这种程序给用户的第一印象就是用户界面.接下来从以下几个方

20155208 实验四 Android开发基础

20155208 实验四 Android开发基础 实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件.布局管理器的使用: 3.掌握Android中事件处理机制. 实验要求 选做,有加分 实验步骤 (一)Android Stuidio的安装测试 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)>第二十四章 安装 Android Stuidio 完成Hello World

转发-UI基础教程 – 原生App切图的那些事儿

UI基础教程 – 原生App切图的那些事儿 转发:http://www.shejidaren.com/app-ui-cut-and-slice.html 移动APP切图是UI设计必须学会的一项技能,切图虽然简单,但还是有很多地方需要注意的,下面由tgideas的 LV主唱大人 跟大家讲讲原生App切图的那些事儿,对UI入门或需了解APP切图的设计师来说会有帮助哦. 如何切图? 了解iphone界面的尺寸 最小的分辨率是320×480,我们把这个尺寸定为基准界面尺寸(baseline),基准尺寸所

十二、Android UI开发专题(转)

http://dev.10086.cn/cmdn/bbs/viewthread.php?tid=18736&page=1#pid89255Android UI开发专题(一) 之界面设计 近期很多网友对Android用户界面的设计表示很感兴趣,对于Android UI开发自绘控件和游戏制作而言掌握好绘图基础是必不可少的.本次专题分10节来讲述,有关OpenGL ES相关的可能将放到以后再透露.本次主要涉及以下四个包的相关内容: android.content.res 资源类 android.gra

Android UI开发神兵利器之Angrytools

最近很多人在问我,个人App开发者如何去设计UI. 其实这是个人开发者最头痛的问题,搞技术的人,确实没法做到面面俱到,不可能花大量的时间去切图,去做原型设计,去做美工. 当然,虽然我们设计不出那么复杂,精巧的UI,但是简单的东西,我们在没有美工的基础上,通过一些手段,也是可以做的不错的,从本文开始,我们将介绍一些关于Android界面开发的神兵利器,正是这些大神们开发的工具,让Coder也能做出一些不是那么见不得人的设计. Angrytools,我们今天的主角,我想当初作者也是被UI弄的Angr

Android UI 绘制过程浅析(五)自定义View

前言 这已经是Android UI 绘制过程浅析系列文章的第五篇了,不出意外的话也是最后一篇.再次声明一下,这一系列文章,是我在拜读了csdn大牛郭霖的博客文章<带你一步步深入了解View>后进行的实践. 前面依次了解了inflate的过程,以及绘制View的三个步骤:measure, layout, draw.这一次来亲身实践一下,通过自定义View来加深对这几个过程的理解. 自定义View的分类 根据实现方式,自定义View可以分为以下3种类型. 自绘控件.View的绘制代码(onDraw