Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
UI布局讨论
发布于 2015-04-09 23:15:52 浏览:3519
订阅该版
今天在QQ上和amsl聊起UI的布局,提到Android UI方式很值得借鉴,所以开一个这样的贴,讨论下UI布局的事情。 按照Android UI的方式,是类似于UI和代码没什么太大的关系,是完全的松耦合关系。按照prife的说法也是,一些apk,可以解包出来,然后修改其中的资源文件,从而实现UI调整,语言汉化什么的(也是,早期的时候,UI汉化是主要工作之一啊)。 amsl提到: “Android的每个页面称为Activity,意思是活动页,Android为每个Activity在后台创建一个FragmentActivity的隐形对象,Fragment有个参数mView,即代表一个控件,UI创建时,有个attach过程,这里会使用xml的布局参数(这些参数也是Android预定义的)进行布局。其中每个View对象都有一个参数int mID,记录的就是xml布局文件中的控件的ID。用户使用某个控件时,使用findViewByID(R.id.button1)这样的方法来获取控件对象,其中R.id.button1就是R文件中定义的一个常数。这是使用的一个从内存中的所有对象中遍历哪个mID与R.id.button1相符的笨办法来获取控件对象的。Android就是使用的这种笨办法解决UI设计与代码编辑分离的。"
查看更多
14
个回答
默认排序
按发布时间排序
amsl
2015-04-10
这家伙很懒,什么也没写!
近期在做Android app,在这儿谈下对Android的一些了解,希望能对大家有帮助. Android的UI设计使用起来是挺容易的,简单拖拽几下就能实现了.但是不要以为Android省掉了与界面相关的代码,相反,它增加了更多的代码来完成自动布局的工作. 用户在开发Android时是看不到这些代码的,它们会在构建.dex时根据SDK版本和用户设定自动的添加这些代码,它们包含事件处理,资源访问,IO,loader,UI layout,net等,具体添加什么代码是通过扫描用户代码的结果决定的.这些源代码都在Android SKD/sources/目录下. 这里谈谈UI方面的内容. Android因为使用了java进行编码,所有它就把用到的所有内容都看作一个java对象,并为每个对象唯一编号(int型),并将该编号记录在对象中的一个成员变量中,同时将所有编号记录在一个R.java文件中(后面简称R文件),这个就是用户的资源编号文件,用户可通过它们访问真实的资源,当然也可以直接访问Android定义的很多资源编号(在android.jar包中android预定义了很多资源编号,它们通常作为对象属性的默认值). R文件中根据资源的不同又将编号分成了不同的子类, 列举部分内容: ``` public final class R { public static final class attr {//属性 } public static final class dimen {//预留边距 public static final int activity_horizontal_margin=0x7f040000; public static final int activity_vertical_margin=0x7f040001; } public static final class drawable {//可绘制资源 public static final int ic_launcher=0x7f020000; } public static final class id {//图形组件 public static final int button1=0x7f080001; } public static final class layout {//布局文件 public static final int activity_main=0x7f030000; } public static final class menu {//菜单 public static final int main=0x7f070000; } public static final class string {//字符串 public static final int app_name=0x7f050000; } public static final class style {//样式 public static final int AppBaseTheme=0x7f060000; } } ``` 上面的是java语法代码, static修饰代码不可更改, final修饰参数可以被直接访问(java特性,在被访问的同时创建对象本身),这个特点和C语言的const修饰的效果是相同的.所以android引用上面button1的方法就是R.id.button1,R代表R对象,id代表id子对象(讲这么啰嗦是给不懂java语法的同学看的),换言之,最后插入android代码中的就是一个个的int常量.android提供了不同的函数获取不同的资源,例如findViewById(R.id.button1)获取一个按钮对象,getResources().getString(R.string.app_name)获取字符串,getResources().getDrawable(R.drawable.ic_launcher)获取图标,还有一些方法不一一列举了.既然这些方法可以直接通过给定的ID访问到对象,那么android肯定在内存中创建了这些对象,这是毋庸置疑的. 任何简单易用的特性背后都需要付出一些代价的,是的,android也不例外.android代价的是,内存开销大了.效率降低了,不过硬件的性能发展很快,掩盖了这些缺陷,android这样的选择就是成功的. 我们着重分析一下UI的创建.android为了实现自动布局,在后台引入了Fragment(碎片)对象概念,其目的是为了让手机和平板的显示效果相同.事实证明这样做的效果非常棒.从Fragment的名字也可以猜到它们在内存中是杂乱无序的,它用一个FragmentManager对象来管理这些对象.对于用户来说,这些工作都是后台完成的,平时不可见. Fragment由Activity负责管理,生命周期与Activity同步。创建它们的意义是给Activity服务,完成一些动态的变形和布局工作。Activity被创建时,调用attach方法触发Fragment组件向Activity的依附过程,在内存中创建Fragment实例,它们可以是Android可支持的任何类型组件。 android是如何知道需要创建哪些Fragment对象的呢?这里就要提到一个工具程序aapt.exe,它是android的资源预处理打包程序,主要工作就是扫描工程中的所有资源文件,处理AndroidManifest.xml,生成resources.ap_文件,生成R.java文件,其中resources.ap_文件就是构建程序用到的一个中间文件,里面就包含了我们在layout/*.xml布局文件中定义的UI组件的相关信息,包含组件的类型,引用的资源,设定的属性,构建程序就根据这些信息生成符合我们工程的Fragment源文件(修正:这里分析的是错误的,后来查询资料才明白要建哪些控件,怎么建,都是从resources提取信息动态生成的),所以Fragment对象已经包含了布局xml中定义的所有属性.然后在显示UI时,FragmentManager来处理布局工作,用户需要使用某个UI组件时,引用R文件总的编号即可.自动布局相关代码在SDK源文件的layoutlib文件夹下,感兴趣的同学可以研究一下. 到这里,基本上把android如果管理UI以及用户如何使用UI组件的问题分析清楚了,当然还有如何关联消息处理,如何调用系统服务实现加载去载,访问io等工作也是穿插在一起的.例如访问图片就会用到io.本文只分析UI,希望能对UI感兴趣的同学有些帮助,欢迎一起讨论. 引用android guide/resources/layout-resource.html内容: For the ID value, you should usually use this syntax form: "@+id/name". The plus symbol, +, indicates that this is a new resource ID and the aapt tool will create a new resource integer in the R.java class, if it doesn't already exist. 引用android guide/resources/accessing-resources.html内容: Once you provide a resource in your application (discussed in Providing Resources), you can apply it by referencing its resource ID. All resource IDs are defined in your project's R class, which the aapt tool automatically generates. When your application is compiled, aapt generates the R class, which contains resource IDs for all the resources in your res/ directory. For each type of resource, there is an R subclass (for example, R.drawable for all drawable resources), and for each resource of that type, there is a static integer (for example, R.drawable.icon). This integer is the resource ID that you can use to retrieve your resource. 引用android guidemanifestuses-feature-element.html内容: You can use the aapt tool, included in the Android SDK, to determine how Google Play will filter your application, based on its declared features and permissions. To do so, run aapt with the dump badging command. This causes aapt to parse your application's manifest and apply the same rules as used by Google Play to determine the features that your application requires.
amsl
2015-04-10
这家伙很懒,什么也没写!
提到Android,不得不赞一下它的Activity设定,是优雅的和便捷的。android没有想C函数一样的main入口概念,这是在一开始设计Android时就定好的规则,并且它的加载器也遵循这一点,只要在Manifest.xml文件中为某个activity设定了action过滤规则为MAIN,则加载器就认为它是第一个入口activity,有奶就是娘的感觉。 Android规定每个Activity管理自己的所有事物,拥有自己的堆栈。基于这样的设定,每个Activity都成为独立个体。加载器为入口Activity分配进程资源,当入口Activity打开了新的Activity页面时,可使用相同进程ID。被隐藏的Activity会保护好现场等待下次被唤醒。这个特点保证了像电话服务这样的应用被随时唤醒,且使用完成电话服务后还可以安全返回到之前的工作。以上综述之,只要知道任何activity的context和它对应的class文件,就可以直接调用它,无论这些Activity时用户的还是系统的。所以Android的很多服务都是以class文件存在的(java特性),他们就存放在存储芯片里,需要的时候把他们“显示”出来即可。 设计UI可以借鉴下Android的这个特点。
bernard
2015-04-10
这家伙很懒,什么也没写!
建议在github上开个入门的repo,这样大家好一起来学习 ^-^
amsl
2015-04-10
这家伙很懒,什么也没写!
先普及一下基本概念吧,用android开发的人还是太少。
amsl
2015-04-10
这家伙很懒,什么也没写!
Android的资源管理 Android apk包使用代码与资源完全分离的方式构建。这个是Android的一大特点。换句话说,apk只要反编译一下,用户就可以自由的更改里面的资源文件。究其原因,这样做是为了方便。因为Android是构建在Java基础上的,Java属于字节码,可以被100%的还原出源代码。字节码与资源数据如果混在一起不方便区分吧,所以干脆就完全分离开来。Android提供了两个类,Resources类管理apk内嵌的资源,AssetManager类管理包外的资源,这样通过类提供的一些方法既可以自由的访问所有资源了。粗略的分析了下Resources方法查找资源的流程,过程很复杂,首先根据ID判断出资源是文件还是非文件,如果是文件,查找文件名相符的文件,如果找到,则根据文件类型调用相关方法进行解析,并生成一个对象返给调用者。如果是非文件,则在资源包中查找,然后判断它是什么类型,再返回与类型相符的一个对象。嗯,资源文件访问效率明显是偏低下的。好处就是使用起来很方便,代码显得清爽。 Resources打包时,会把xml文件二进制化,将标号去重,统一索引成整数值,建立索引序列,这样做可以减小存储空间,而且解析速度更快,避免了字符串比较。这个很有借鉴意义。R文件与资源对应的也是一张索引表,查找资源的过程,第一步会从先得到最匹配资源,当然像前面所述,如果是文件,会有一个访问和解析过程。如果是动态组件资源,也有一个查找配对过程。 Android资源ID的编码规则B3 B2 B1 B0 B3代表包编号(Java语言有包的概念) B2代表资源类型,即R文件中对应的子类的编号 B1B0代表在同类型中的编号 从编码规则来看,如果内存创建UI组件时按照同样的规则给它们的mID赋值(前面帖子有提到),则创建过程可是独立存在的,不依赖配对R文件的值。而查找时则在内存中同类型对象列表中查找编号相同的那个对象,然后判断mID是否相同,相同则说明是需要的对象。 打包资源包时,aapt对相同类型的资源依次排列,并根据偏移量生成编号写进R文件中。所以Android官方要求不可以自行修改R文件的内容,否则引用的顺序就错了,甚至引用的偏移量在资源包中找不到,会触发异常。 结合Android的资源文件回忆下UI的创建过程。例如活动页是MyActivity,MyActivity的显示从调用onCreate方法开始,会先调用Activity的onCreate,方法会在后台扫描资源文件,看看用到了哪些资源,然后在内存中创建它们,并根据资源文件中的排列顺序给资源编号。之后会调用setContentView(R.layout.xxxxx)方法,调用该方法时会从资源包中查找该布局文件,再利用类LayoutInflater可以从xml来生成一个视图,并根据xml解析的结果修改内存中相关对象的成员变量,最后的视图被显示到屏幕前端。后面就是用户自己的代码了。
bernard
2015-04-10
这家伙很懒,什么也没写!
另外一个可能,传统的GUI十分可能重用Android里的这些资源文件,例如xml布局文件等。也可以是一个转换层什么的,转换成兼容的资源文件,或代码。
amsl
2015-04-10
这家伙很懒,什么也没写!
是的。MS弄的那个Android开发环境,就是重用的Android的SDK,中间就弄了个Java与C#的转换层,就可以用C#直接开发Android应用了,现在有一些公司做了一些同时支持iOS和Android的应用组件,也是弄个转换层实现的。
amsl
2015-04-11
这家伙很懒,什么也没写!
熊哥,有一个bootstrap可视化布局技术,挺有意思的。使用html+css+javascript,布局效果也很赞。可到w3cschool看看。
bernard
2015-04-12
这家伙很懒,什么也没写!
我是觉得啊,html+css就是个坑,类似javascript+css的,QT的qml就是这样干的
amsl
2015-04-12
这家伙很懒,什么也没写!
>我是觉得啊,html+css就是个坑,类似javascript+css的,QT的qml就是这样干的 --- 使用什么样的技术方法,达到目的就行,最后殊途同归啊.html+css和xml的作用差不多,前者有浏览器引擎布局,后者只需要写个单独的布局引擎.使用类似js脚本,估计也是为了省事吧.
撰写答案
登录
注册新账号
关注者
0
被浏览
3.5k
关于作者
bernard
这家伙很懒,什么也没写!
提问
414
回答
5943
被采纳
76
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【NXP-MCXA153】 定时器驱动移植
2
GD32F450 看门狗驱动适配
3
【NXP-MCXA153】看门狗驱动移植
4
RT-Thread Studio V2.2.9 Release Note
5
CherryUSB的bootuf2配置
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
7
个答案
2
次被采纳
a1012112796
15
个答案
1
次被采纳
Ryan_CW
5
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
本月文章贡献
YZRD
3
篇文章
6
次点赞
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
8
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部