分类目录归档:AndroLua

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

AndroLua学习(3) —— Activity

Activity 回调方法
1、mian(…)

function main(...)
  print("入口函数",...)
end

…表示可变参数,这里是newActivity传递过来的参数

2、onCreate() 窗口创建
3、onStart() Activity开始
4、onResume() 返回程序
5、onPause() Activity暂停
6、onStop() Activity停止
7、onDestroy() 程序退出
8、onResult(name,…) 返回活动,name:返回的活动名称,…:返回的参数

9、onCreateOptionsMenu(menu)
function onCreateOptionsMenu(menu)
menu.add(“菜单”)
end

menu:选项菜单。

10、onOptionsItemSelected(item)
function onOptionsItemSelected(item)
print(item.Title)
end
item:选中的菜单项

11、
onConfigurationChanged(config)
function onConfigurationChanged(config)
print(“屏幕方向关闭”)
end

config:配置信息

12、按键事件
function onKeyDown(keycode,event)
print(“按键按下”,keycode)
end

function onKeyUp(keycode,event)
print(“按键抬起”,keycode)
end

function onKeyLongPress(keycode,event)
print(“按键长按”,keycode)
end

function onTouchEvent(event)
print(“触摸事件”,event)
end

keycode:键值
event:事件

AndroLua学习(2)——导入

1、导入模块
a.全局导入
在使用java脚本文件的开头,应该写上
require “import”
采用全局导入的方式导入 import,目前内置的有bson,canvas,cjson,crypt,ftp,gl,http,import,md5,smtp,socket,sensor,xml,zip,zlib等模块。
导入import后再导入其他模块,可以采用
import “http”
b.局部导入
local http = require “http”
local http = import “http”
这样导入的是局部变量。

2、导入包
可以使用 包名.* 的形式导入包
import “android.widget.*”
完整类名形式导入类
import “android.widget.Button”
导入内部类
import “android.view.View_onClickListener”
导入后直接使用内部类View.onClickListener
包名和类名必须用引号包围。导入类为全局变量。
可以这样导入局部变量:
local Button = import “android.widget.Button”

AndroLua学习(1)——开始

1、初始化

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

第一句是导入我编写的import模块,该模块可以实现高度模拟Java的编程风格,使Java程序员无压力使用Lua脚本,后边两句对于Java程序员应该比较熟悉,导入两个安卓包,和Java不同的是包名需要加引号。
2、添加一个编辑框和一个按钮

layout={  
  LinearLayout;  
  orientation="vertical";  
  {  
    EditText;  
    id="edit";  
    layout_width="fill";  
  };  
  {  
    Button;  
    layout_width="fill";  
    text="按钮";  
    id="btn";  
  };  
};  

载入界面

activity.setContentView(loadlayout(layout))  

layout={}这个是一个Lua表,loadlayout函数可以把表解析为安卓视图,activity是当前活动的context对象。布局表的结构和安卓工程的XML大体相当,都是用嵌套关系表示视图的嵌套。

3、点击按钮没有反应,我们来添加按钮的onClick回调方法

btn.onClick=function(v)  
 Toast.makeText(activity,edit.Text, Toast.LENGTH_SHORT ).show()  
end

4、为什么使用表而不是xml布局。
因为表是Lua原生支持的数据结构,具有结构灵活,解析快的优点,以后讲动态布局时会详细说明。

5、为什么有些Java方法使用和Java不同。
Java的罗嗦是有目共睹的,所以在AndroLua对部分Java方法调用实现了简化,具体包括,
无参数getxxx方法可以简写为o.xxx,
单参数setxxx方法可以简写为o.xxx=x,
list与map对象可以使用下标(仅限字符串与数字)访问数据,a=map[“x”]相当于a=map.get(“x”)也可以进一步简化为a=map.x,
setxxxListener可以简化为o.xxx=function()end。
刚开始你可能不习惯,用多了你就发现这样很酷很方便。