Android 中的Theme和Style

一,Android 中各种XML文件的作用

1、arrays.xml 定义数组

2、colors.xml 定义颜色

3、dimens.xml 定义尺寸

4、strings.xml 定义字符串

5、styles.xml 定义样式

6、phoinix_popumenu_style.xml selector选择

7、menu 菜单

8、drawable 图片及自定义控件资源如: white_background.xml 白色圆角矩形做背景

9、anim 旋转动画资源

Android 中各种XML文件的作用

二,API文档Android 包介绍

包含应用程序在平台上使用的各种资源,并且定义了应用程序使用系统功能的权限,在这个包中,只需要经常查看Manifest.permission和R.style两个类

Manifest类,继承自java . lang . object,含有一个Public 构造方法:Manifest();和两个嵌套类:Manifest.permission Manifest.permission_group

Manifest.permission:对权限进行声明,如:public static final String SEND_SMS

Manifest.permission_group :对手机固有功能进行声明,如:public static final String PHONE;

R:继承自java . lang . object,含有一个构造方法和以下22个嵌套类:

R.anim:对动画相关常量进行声明 R.animator :声明了淡入,淡出两个常量 R.array R.attr :声明了资源固有属性 R.bool:仅有一个 R.bool()构造函数 R.color:声明了系统默认的颜色 R.dimen:声明了应用程序图标的尺寸,dialog和通知的尺寸R.drawable :对控件资源进行了声明 R.fraction R.id:定义了可访问性控件标识符
R.integer R.interpolator R.layout R.menu R.mipmap R.plurals R.rawR.string:字符串 R.style:定义了主题和样式 R.styleable:定义了可变的样式 R.transition R.xml

在文档里去探究这实在是没什么意义,可以使用这些R类资源,但最好还是用自己应用程序的资源文件,特别是 R.drawable资源,因为平台不同版本之间可能不同,唯一可直接用的是style资源。

三,Android的主题Theme和样式style

这里,主题Theme,是宏观上的风格,是装扮全局的;样式style:是对细节的样式,对具体部件的。

在R.style,很明显可以看出三大块:TextAppearance打头的,为文本外观样式;Theme打头的,为主题;Widget打头的,为小部件样式。和少数几个控件。同时还可以注意三个关键词段:DeviceDefault,Holo,Material

关于Theme,Theme_Material,Material主题;Theme_DeviceDefault,target API在14及以上的默认主题;Theme_Holo,target API在11–13的默认主题;Theme,是target API在10及以下的默认主题;其他的是派生子主题。如果从高API开始就是用默认主题,在不同的设备上显示就可能不一样,所以,需要在清单文件里显示指出,如

Theme_Holo是3.0开始有的,后来Android 4.0发布同时也发布了指导性的应用设计规范《Android Design》 ,有了设计规范的指导,就有了更多应用采用了Holo Theme,尤其国外的应用。Holo Theme的主要特点是轻快的颜色、适当的阴影、卡片化布局、方角矩形。Android的Holo Theme。Android
Design 与 Holo Theme。DeviceDefault主题(继承自Holo主题),实际上就是在Holo主题上定制主题(For厂商)。透过下面Theme_Holo及其派生主题解释,另外的主题意思也不能明白

1、Theme_Holo

意思为:New Honeycomb全屏显示样式,默认是黑背景。

1.1、Theme_Holo_Dialog

意思为:将activity显示成对话框的样式,需自定义大小,否则View可能显示不全。

1.1.1、Theme_Holo_Dialog_MinWidth

意思为:将activity显示成对话框的样式,显示最小状态时,

1.1.2、Theme_Holo_DialogWhenLarge

意思为:将activity显示成对话框的样式,显示最大状态时,

1.1.3、Theme_Holo_DialogWhenLarge_NoActionBar

意思为:将activity显示成对话框的样式,显示最大状态时,且没有action bar

1.1.4、Theme_Holo_Dialog_NoActionBar

意思为:将activity显示成对话框的样式,且没有action bar,默认状态 ,需自定义大小,否则View可能显示不全

1.1.5、Theme_Holo_Dialog_NoActionBar_MinWidth

意思为:将activity显示成对话框的样式,且没有action bar,显示最小状态时

1.2、Theme_Holo_InputMethod

类似于panel;需自定义大小

1.3、Theme_Holo_NoActionBar

意思为: 默认状态下,没有action bar的样式。

1.3.1、Theme_Holo_NoActionBar_Fullscreen

意思为: 默认状态下,没有action bar且全屏的样式。

1.4、Theme_Holo_Wallpaper

意思为: 使用墙纸做为样式背景,默认状态下。

1.4.1、Theme_Holo_Wallpaper_NoActionBar

意思为: 使用墙纸做为样式背景,且没有action bar。

1.5、Theme_Holo_Panel

意思为: 默认将一个activity显示成一个对话框样式,区别于对话框,这个没有外边框,没有任何样式元素只有一个空的矩形框。

2、Theme_Holo_Light

意思为: 默认样式,区别于黑背景,这个属于亮背景。

2.1、Theme_Holo_Light_Dialog

意思为: 默认将一个activity显示成一个对话框样式,区别于黑背景,这个属于亮背景。

2.1.1、Theme_Holo_Light_Dialog_MinWidth

意思为: 默认将一个activity显示成一个对话框样式,区别于黑背景,这个属于亮背景,显示最小状态时。

2.1.2、Theme_Holo_Light_DialogWhenLarge

意思为: 默认将一个activity显示成一个对话框样式,区别于黑背景,这个属于亮背景,显示最大状态时。

2.1.3、Theme_Holo_Light_DialogWhenLarge_NoActionBar

意思为: 默认将一个activity显示成一个对话框样式,区别于黑背景,这个属于亮背景,显示最大状态,且没有action bar时。

2.1.4、Theme_Holo_Light_Dialog_NoActionBar

意思为: 默认将一个activity显示成一个对话框样式,区别于黑背景,这个属于亮背景,且没有action bar时。需自定义大小

2.1.5、Theme_Holo_Light_Dialog_NoActionBar_MinWidth

意思为: 默认将一个activity显示成一个对话框样式,区别于黑背景,这个属于亮背景,且没有action bar时,显示最小状态时。

2.2、Theme_Holo_Light_Panel

意思为: 默认将一个activity显示成一个对话框样式,区别于对话框,这个没有外边框,没有任何样式元素只有一个空的矩形框,区别于黑背景,这个属于亮背景。需自定义大小

3、Theme_NoTitleBar_OverlayActionModes

意思为:( 这里我按照api翻译为:没有标题栏,但状态栏将覆盖应用内容,而不是将应用内容挤下去为自己腾出空间。)不太明白哪里会用到此主题。留待以后去解决

4、Theme_WithActionBar

意思为:显示action Bar的主题样式

Theme Holo

四,从源码看Style和Theme
UI设计,是从Style和Theme开始,使用和自定义View,处理事件响应。从源头弄明白Style和Theme是很有必要的。
1、位置

在Android的frameworks/base/core/res/res/values目录下有一下几个文件:
这几个定义了系统的theme:
themes.xml
themes_device_defaults.xml

themes_holo.xml

themes_leanback.xml

themes_material.xml

themes_micro.xml

这几个文件定义了系统的style:
styles.xml

styles_device_defaults.xml

styles_holo.xml

styles_leanback.xml

styles_material.xml

styles_micro.xml

其中micro是为手表的,leanback是为电视的
2,Theme.xml
对theme的几个文件浏览一下,结构大体相同,第一个

AndroLua学习(12)——Intent意图

一、什么是Intent
Intent(意图)主要是解决Android应用的各项组件之间的通讯。
Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述.
Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。

因此,Intent在这里起着一个媒体中介的作用
专门提供组件互相调用的相关信息
实现调用者与被调用者之间的解耦。

例如,在一个联系人维护的应用中,当我们在一个联系人列表屏幕(假设对应的Activity为listActivity)上
点击某个联系人后,希望能够跳出此联系人的详细信息屏幕(假设对应的Activity为detailActivity)
为了实现这个目的,listActivity需要构造一个 Intent
这个Intent用于告诉系统,我们要做“查看”动作,此动作对应的查看对象是“某联系人”
然后调用startActivity (Intent intent),将构造的Intent传入

系统会根据此Intent中的描述到ManiFest中找到满足此Intent要求的Activity,系统会调用找到的 Activity,即为detailActivity,最终传入Intent,detailActivity则会根据此Intent中的描述,执行相应的操作。

二、Intent使用案例
1、调用浏览器搜索关键字
import “android.content.Intent”
import “android.app.SearchManager”
intent = Intent()
intent.setAction(Intent.ACTION_WEB_SEARCH)
intent.putExtra(SearchManager.QUERY,”Alua开发手册”)
activity.startActivity(intent)

2、调用浏览器打开网页
import “android.content.Intent”
import “android.net.Uri”
url=”http://www.androlua.cn”
viewIntent = Intent(“android.intent.action.VIEW”,Uri.parse(url))
activity.startActivity(viewIntent)

AndroLua学习(11)——网络管理

一、WIFI操作
1、WIFI相关信息

import "android.content.Context"
wifi = activity.Context.getSystemService(Context.WIFI_SERVICE)
wi1 = wifi.isWifiEnabled() --WIFI是否打开
wi2 = wifi.getWifiState() --WIFI状态
print(string.match(tostring(wifi.getConfiguredNetworks()),[[KeyMgmt: (.-) P]])) --WIFI加密类型
wifiInfo = wifi.getConnection

2、WIFI是否已连接
connManager = activity.getSystemService(Context.CONNECTIVITY_SERVICE)
mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if tostring(mWifi):find(“none)”) then
–未连接
else
–连接
end

3、打开关闭wifi

import "android.content.Context"
wifi = activity.Context.getSystemService(Context.WIFI_SERVICE)
wifi.setWifiEnabled(true)--关闭则false

4、wifi信号强度

wifiManager=activity.Context.getSystemService(Context.WIFI_SERVICE);
wifiInfo=wifiManager.getConnectionInfo();
print(wifiInfo.getRssi())

5、网络名称

wifiManager=activity.Context.getSystemService(Context.WIFI_SERVICE);
wifiInfo=wifiManager.getConnectionInfo();
print(wifiInfo.getSSID())

6、SSID是否隐藏

wifiManager=activity.Context.getSystemService(Context.WIFI_SERVICE);
wifiInfo=wifiManager.getConnectionInfo();
print(wifiInfo.getHiddenSSID())

二、数据网络操作
1、数据网络是否连接

manager = activity.getSystemService(Context.CONNECTIVITY_SERVICE);  
gprs = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();  
if tostring(gprs)== "CONNECTED" then
print"当前数据网络"
end

三、其他
1、查看IP
–查看某网站IP地址
address=InetAddress.getByName(“www.10010.com”);

–查看本机IP地址
address=InetAddress.getLocalHost();

–查看IP地址
wifi = activity.Context.getSystemService(Context.WIFI_SERVICE).getDhcpInfo()
string.match(tostring(wifi),”ipaddr(.-)gate”)

2、获取DNS
import “android.content.Context”

–获取Dns1
wifi = activity.Context.getSystemService(Context.WIFI_SERVICE).getDhcpInfo()
print(string.match(tostring(wifi),”dns1 (.-) dns2″))

–获取Dns2
wifi = activity.Context.getSystemService(Context.WIFI_SERVICE).getDhcpInfo()
dns2 = string.match(tostring(wifi),”dns2 (.-) D”)

AndroLua学习(10)——文件操作

一、创建文件
有2种方法:
1、使用File类
import “java.io.File”–导入File类
File(文件路径).createNewFile()

2、使用io库
io.open(“/sdcard/aaaa”, ‘w’)

二、创建文件夹

1、使用File类
import “java.io.File”–导入File类
File(文件夹路径).mkdir()

创建多级文件夹
File(文件夹路径).mkdirs()

2、shell
os.execute(‘mkdir ‘..文件夹路径)

三、重命名/移动文件
1、File
import “java.io.File”–导入File类
File(旧).renameTo(File(新))

2、Shell
os.execute(“mv “..oldname..” “..newname)

3、os
os.rename (oldname, newname)

四、写入文件
1、写入
io.open(文件路径,”w”):write(“内容”):close()
2、更新
io.open(文件路径,”w+”):write(“更新的内容”):close()
3、追加
io.open(文件路径,”a+”):write(“追加的内容”):close()

五、删除文件/文件夹
1、使用File类
import “java.io.File”–导入File类
File(文件路径).delete()

2、使用os方法
os.remove (filename)

3、递归删除
LuaUtil.rmDir(路径)
os.execute(“rm -r “..路径)

六、获取文件列表
import(“java.io.File”)
luajava.astable(File(文件夹路径).listFiles())

七、获取文件信息
import “java.io.File”
File(路径).getName() 获取文件名
File(路径).length() 获取文件字节数
File(路径).getParentFile() 获取文件所在目录
File(路径).isDirectory() 判断路径是不是目录,也可以用来判断目录是否存在
File(路径).isFile() 判断路径是不是文件,也可以用来判断文件是否存在
File(路径).isHidden() 判断路径是不是系统隐藏文件

AndroLua学习(8)——界面之适配器

什么是适配器呢?顾名思义,就是把一些数据给弄得适当,适合以便于在View上显示。适配器就像显示器,把复杂的东西按人可以接受的方式来展现。
适配器控件主要包括(ListView,GridView,Spinner,ExpandableList等)
想要动态为此类控件添加项目就必须得要依靠适配器!
1、适配器使用
AarrayAdapter(简单适配器)

创建项目数组
数据={}

添加项目数组
for i=1,100 do
table.insert(数据,tostring(i))
end

创建适配器
array_adp=ArrayAdapter(activity,android.R.layout.simple_list_item_1,String(数据))

设置适配器
lv.setAdapter(array_adp)

2、LuaAdapter(Lua适配器)
创建自定义项目视图
item={
LinearLayout,
orientation=”vertical”,
layout_width=”fill”,
{
TextView,
id=”text”,
layout_margin=”15dp”,
layout_width=”fill”
},
}
创建项目数组
data={}
创建适配器
adp=LuaAdapter(activity,data,item)
添加数据
for n=1,100 do
table.insert(data,{
text={
Text=tostring(n),
},
})
end
设置适配器
lv.Adapter=adp

以上的适配器ListView、Spinner与GridView等控件通用

3、
那么ExpandableListView(折叠列表)怎么办呢?
别怕,安卓系统还提供了一个ArrayExpandableListAdapter来给我们使用,可以简单的适配ExpandableListView,下面给出实例

ns={
“Widget”,”Check view”,”Adapter view”,”Advanced Widget”,”Layout”,”Advanced Layout”,
}

wds={
{“Button”,”EditText”,”TextView”,
“ImageButton”,”ImageView”},
{“CheckBox”,”RadioButton”,”ToggleButton”,”Switch”},
{“ListView”,”ExpandableListView”,”Spinner”},
{“SeekBar”,”ProgressBar”,”RatingBar”,
“DatePicker”,”TimePicker”,”NumberPicker”},
{“LinearLayout”,”AbsoluteLayout”,”FrameLayout”},
{“RadioGroup”,”GridLayout”,
“ScrollView”,”HorizontalScrollView”},
}

mAdapter=ArrayExpandableListAdapter(activity)
for k,v in ipairs(ns) do
mAdapter.add(v,wds[k])
end
el.setAdapter(mAdapter)
这样就实现ExpandableListView项目的适配了

4、
当然AdapterView的事件响应也是与普通控件不同的。
ListView与GridView的单击与长按事件
项目被单击
id.onItemClick=function(l,v,p,i)
print(v.Text)
return true
end
项目被长按
id.onItemLongClick=function(l,v,p,i)
print(v.Text)
return true
end

Spinner的项目单击事件
id.onItemSelected=function(l,v,p,i)
print(v.Text)
end

ExpandableListView的父项目与子项目单击事件
id.onGroupClick=function(l,v,p,s)
print(v.Text..”:GroupClick”)
end

id.onChildClick=function(l,v,g,c)
print(v.Text..”:ChildClick”)
end

AndroLua学习(7)——界面之标题栏

一、标题栏ActionBar
部分常用API
show:显示
hide:隐藏
Elevation:设置阴影
BgroundDrawable:设置背景
DisplayHomeAsUpEnabled(boolean):设置是否显示返回图标

1、设置标题
activity.ActionBar.setTitle(‘大标题’)
activity.ActionBar.setSubTitle(“小标题”)

2、设置ActionBar背景颜色
import “android.graphics.drawable.ColorDrawable”
activity.ActionBar.setBackgroundDrawable(ColorDrawable(Color))

3、自定义ActionBar标题颜色
import “android.text.SpannableString”
import “android.text.style.ForegroundColorSpan”
import “android.text.Spannable”
sp = SpannableString(“标题”)
sp.setSpan(ForegroundColorSpan(0xff1DA6DD),0,#sp,Spannable.SPAN_EXCLUSIVE_INCLUSIVE)
activity.ActionBar.setTitle(sp)

4、自定义ActionBar布局
DisplayShowCustomEnabled(true)
CustomView(loadlayout(layout))

5、ActionBar返回按钮
activity.ActionBar.setDisplayHomeAsUpEnabled(true)
–自定义返回按钮图标
activity.ActionBar.setHomeAsUpIndicator(drawable)

6、菜单
function onCreateOptionsMenu(menu)
menu.add(“菜单1″)
menu.add(“菜单2″)
menu.add(“菜单3″)
end
function onOptionsItemSelected(item)
print(“你选择了:”..item.Title)
end

7、Tab导航使用
import “android.app.ActionBar$TabListener”
actionBar=activity.ActionBar
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
tab = actionBar.newTab().setText(“Tab1″).setTabListener(TabListener({
onTabSelected=function()
print”Tab1″
end}))
tab2=actionBar.newTab().setText(“Tab2″).setTabListener(TabListener({
onTabSelected=function()
print”Tab2″
end}))
actionBar.addTab(tab)
actionBar.addTab(tab2)

AndroLua学习(6)——API参考

说明:
[a]表示参数a可选,(…)表示不定参数。函数调用在只有一个参数且参数为字符串或表时可以省略括号。
AndroLua库函数在import模块,为便于使用都是全局变量。
s 表示string类型,i 表示整数类型,n 表示浮点数或整数类型,t 表示表类型,b 表示布尔类型,o 表示Java对象类型,f为Lua函数。
–表示注释。

1、each(o)
参数:o 实现Iterable接口的Java对象
返回:用于Lua迭代的闭包
作用:Java集合迭代器

2、enum(o)
参数:o 实现Enumeration接口的Java对象
返回:用于Lua迭代的闭包
作用:Java集合迭代器

3、import(s)
参数:s 要载入的包或类的名称
返回:载入的类或模块
作用:载入包或类或Lua模块
import “http” –载入http模块
import “android.widget.*” –载入android.widget包
import “android.widget.Button” –载入android.widget.Button类
import “android.view.View$OnClickListener” –载入android.view.View.OnClickListener内部类

4、loadlayout(t [,t2])
参数:t 要载入的布局表,t2 保存view的表
返回:布局最外层view
作用:载入布局表,生成view
layout={
LinearLayout,
layout_width=”fill”,
{
TextView,
text=”Androlua”,
id=”tv”
}
}
main={}
activity.setContentView(loadlayout(layout,main))
print(main.tv.getText())

5、loadbitmap(s)
参数:s 要载入图片的地址,支持相对地址,绝对地址与网址
返回:bitmap对象
作用:载入图片
注意:载入网络图片需要在线程中进行

6、task(s [,…], f)
参数:s 任务中运行的代码或函数,… 任务传入参数,f 回调函数
返回:无返回值
作用:在异步线程运行Lua代码,执行完毕在主线程调用回调函数
注意:参数类型包括 布尔,数值,字符串,Java对象,不允许Lua对象
function func(a,b)
require “import”
print(a,b)
return a+b
end
task(func,1,2,print)
如果func是数字则延时后执行回调函数。

7、thread(s[,…])
参数:s 线程中运行的lua代码或脚本的相对路径(不加扩展名)或函数,… 线程初始化参数
返回:返回线程对象
作用:开启一个线程运行Lua代码
注意:线程需要调用quit方法结束线程
func=[[
a,b=…
function add()
call(“print”,a+b)
end
]]
t=thread(func,1,2)
t.add()

8、timer(s,i1,i2[,…])
参数:s 定时器运行的代码或函数,i1 前延时,i2 定时器间隔,… 定时器初始化参数
返回:定时器对象
作用:创建定时器重复执行函数
function f(a)
function run()
print(a)
a=a+1
end
end

t=timer(f,0,1000,1)
t.Enabled=false–暂停定时器
t.Enabled=true–重新定时器
t.stop()–停止定时器

9、luajava.bindClass(s)
参数:s class的完整名称,支持基本类型
返回:Java class对象
作用:载入Java class
Button=luajava.bindClass(“android.widget.Button”)
int=luajava.bindClass(“int”)

10、luajava.createProxy(s,t)
参数:s 接口的完整名称,t 接口函数表
返回:Java接口对象
作用:创建Java接口
onclick=luajava.createProxy(“android.view.View$OnClickListener”,{onClick=function(v)print(v)end})

11、luajava.createArray(s,t)
参数:s 类的完整名称,支持基本类型,t 要转化为Java数组的表
返回:创建的Java数组对象
作用:创建Java数组
arr=luajava.createArray(“int”,{1,2,3,4})

12、luajava.newInstance(s [,…])
参数:s 类的完整名称,… 构建方法的参数
作用:创建Java类的实例
b=luajava.newInstance(“android.widget.Button”,activity)

13、luajava.new(o[,…])
参数:o Java类对象,… 参数
返回:类的实例或数组对象或接口对象
作用:创建一个类实例或数组对象或接口对象
注意:当只有一个参数且为表类型时,如果类对象为interface创建接口,为class创建数组,参数为其他情况创建实例
b=luajava.new(Button,activity)
onclick=luajava.new(OnClickListener,{onClick=function(v)print(v)end})
arr=luajava.new(int,{1,2,3})
(示例中假设已载入相关类)

14、luajava.coding(s [,s2 [, s3]])
参数:s 要转换编码的Lua字符串,s2 字符串的原始编码,s3 字符串的目标编码
返回:转码后的Lua字符串
作用:转换字符串编码
注意:默认进行GBK转UTF8

15、luajava.clear(o)
参数:o Java对象
返回:无
作用:销毁Java对象
注意:尽量避免使用此函数,除非确认不在使用此对象,且该对象比较大

16、luajava.astable(o)
参数:o Java对象
返回:Lua表
作用:转换Java的Array List或Map为Lua表

17、luajava.tostring(o)
参数:o Java对象
返回:Lua字符串
作用:相当于 o.toString()

AndroLua学习(5)——http模块

一、获取内容 get函数
Http.get(url,cookie,charset,header,callback)
url 网络请求的链接网址
cookie 使用的cookie,也就是服务器的身份识别信息
charset 内容编码
header 请求头
callback 请求完成后执行的函数

除了url和callback其他参数都不是必须的

回调函数接受四个参数值分别是
code 响应代码,2xx表示成功,4xx表示请求错误,5xx表示服务器错误,-1表示出错
content 内容,如果code是-1,则为出错信息
cookie 服务器返回的用户身份识别信息
header 服务器返回的头信息

二、向服务器发送数据 post函数
Http.post(url,data,cookie,charset,header,callback)
除了增加了一个data外,其他参数和get完全相同
data 向服务器发送的数据

三、上传和下载文件
Http.download(url,path,cookie,header,callback)
参数中没有编码参数,其他同get,
path 文件保存路径
需要特别注意一点,只支持同时有127个网络请求,否则会出错
download函数和get函数类似,用于下载文件,参数为请求的网址,保存文件的路径与cookie
http.download(“http://androlua.com”,”/sdcard/a.txt”)

upload用于上传文件,参数是请求的网址,请求内容字符串部分,格式为以key=value形式的表,请求文件部分,格式为key=文件路径的表,最后一个参数为cookie
http.upload(“http://androlua.com”,{title=”标题”,msg=”内容”},{file1=”/sdcard/1.txt”,file2=”/sdcard/2.txt”})”

四、
Http其实是对Http.HttpTask的封装,Http.HttpTask使用的更加通用和灵活的形式
参数格式如下
Http.HttpTask( url, String method, cookie, charset, header, callback)
所有参数都是必选,没有则传入nil

url 请求的网址
method 请求方法可以是get,post,put,delete等
cookie 身份验证信息
charset 内容编码
header 请求头
callback 回调函数

该函数返回的是一个HttpTask对象,
需要调用execute方法才可以执行,
t=Http.HttpTask(xxx)
t.execute{data}

注意调用的括号是花括号,内容可以是字符串或者byte数组,
使用这个形式可以自己封装异步上传函数

AndroLua学习(4)——布局与视图

一、布局负责管理视图如何显示
1、线性布局 LinearLayout
按照水平或者垂直方向布局组件
orientation:设置布局方向
gravity:控制布局对齐方式
layout_weight:控制各个控件在布局中的相对大小。

2、帧布局 FrameLayout
要求自行指定停靠与位置。从屏幕右上角(0,0)开始布局,多个组件层叠排列。第一个添加的组件在最底层,最后的一个在最上层。
3、表格布局 TableLayout
表格布局是一个ViewGroup以表格显示它的子视图(view)元素,即行和列标识一个视图的位置。
表格布局常用的属性如下:
collapseColumns:隐藏指定的列
shrinkColumns:收缩指定的列以适合屏幕,不会挤出屏幕
stretchColumns:尽量把指定的列填充空白部分
layout_column:控件放在指定的列
layout_span:该控件所跨越的列数

4、相对布局 RelativeLayout
相对其他组件布局
相对布局是按照组件之间的相对位置来布局,比如在某个组件的左边,右边,上面和下面等。

5、绝对布局(AbsoluteLayout)
采用坐标轴的方式定位组件,左上角是(0,0)点,往右x轴递增,往下Y轴递增,组件定位属性为layout_x 和layout_y来确定坐标。

二、视图则显示具体内容,如TextView可以向用户展示文字内容,Button可以响应用户点击事件。

创建一个线性布局
layout=LinearLayout(activity)
创建一个按钮视图
button=Button(activity)
将按钮添加到布局
layout.addView(button)
将刚才的内容设置为活动内容视图
activity.setContentView(layout)
注.activity是当前窗口的Context对象,如果你习惯也可以使用this
button=Button(this)

三、常见控件
Button(按钮控件)、TextView(文本控件)、EditText(编辑框控件)

常用API:
id.setText(“文本”)–设置控件文本
id.getText()–获取控件文本
id.setWidth(300)–设置控件宽度
id.setHeight(300)–设置控件高度

点击事件
id.onClick=function()
print”你触发了点击事件”
end

长按事件
id.onLongClick=function()
print”你触发了长按事件”
end

图片控件(ImageView与ImageButton)
设置图片
布局表中用src属性就可以,如:src=图片路径,

动态设置
id.setImageBitmap(loadbitmap(图片路径))
设置Drawable对象
import “android.graphics.drawable.BitmapDrawable”
id.setImageDrawable(BitmapDrawable(loadbitmap(图片路径)))

缩放,scaleType
字段
CENTER  –按原来size居中显示,长/宽超过View的长/宽,截取图片的居中部分显示 
CENTER_CROP –按比例扩大图片的size居中显示,使图片长(宽)等于或大于View的长(宽) 
CENTER_INSIDE –完整居中显示,按比例缩小使图片长/宽等于或小于View的长/宽 
FIT_CENTER –按比例扩大/缩小到View的宽度,居中显示 
FIT_END –按比例扩大/缩小到View的宽度,显示在View的下部分位置 
FIT_START –按比例扩大/缩小到View的宽度,显示在View的上部分位置 
FIT_XY –不按比例扩大/缩小到View的大小显示 
MATRIX –用矩阵来绘制,动态缩小放大图片来显示。 

点击与长按事件同上

四、使用布局表
使用布局表须导入android.view与android.widget包。

require "import"
import "android.widget.*"
import "android.view.*"

布局表格式

layout={
    控件类名称,
    id=控件名称,
    属性=值,
    {
        子控件类名称,
        id=控件名称,
        属性=值,
        }
    }

例如:

layout={
  LinearLayout,--视图类名称
  id="linear",--视图ID,可以在loadlayout后直接使用
  orientation="vertical",--属性与值
  {
    TextView,--子视图类名称
    text="hello AndroLua+",--属性与值
    layout_width="fill"--布局属性
  },
}

使用loadlayout函数解析布局表生成布局。
activity.setContentView(loadlayout(layout))
也可以简化为:
activity.setContentView(layout)
如果使用单独文件布局(比如有个layout.aly布局文件)也可以简写为:
activity.setContentView(“layout”)
此时不用导入布局文件。

布局表支持大全部安卓控件属性,
与安卓XML布局文件的不同点:
id表示在Lua中变量的名称,而不是安卓的可以findbyid的数字id。
ImageView的src属性是当前目录图片名称或绝对文件路径图片或网络上的图片,
layout_width与layout_height的值支持fill与wrap简写,
onClick值为lua函数或java onClick接口或他们的全局变量名称,
背景background支持背景图片,背景色与LuaDrawable自绘制背景,背景图片参数为是当前目录图片名称或绝对文件路径图片或网络上的图片,颜色同backgroundColor,自绘制背景参数为绘制函数或绘制函数的全局变量名称,
控件背景色使用backgroundColor设置,值为”十六进制颜色值”。
其他参考loadlayout与loadbitmap