basic4android+开发教程.docx_第1页
basic4android+开发教程.docx_第2页
basic4android+开发教程.docx_第3页
basic4android+开发教程.docx_第4页
basic4android+开发教程.docx_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

basic4android 开发教程翻译(一)建立模拟器和第一个Hello worlrd程序 如果你还没有安装Basic4android和Java SDK,请先参照后面的链接里面的安装和配置方法:/forum/basic.droid-sdk.html在这个教程里面,我们将建立一个新的AVD (Android Virtual Device)并生成模拟器实例. 然后我们将建立一个简单的程序,这个程序将显示一个简单的信息框,并写一个信息到日志里.你也可以通过IDE 连接到一个真正的设备上:使用ADB连接你的设备使用B4A-Bridge连接你的设备常见的问题解决列在在本教程的后面. 如果你碰见的问题没在列表或者无法解决的话, 请与 联系建立新的 AVD- 运行 Basic4android.- 选择 Tools 菜单 - Run AVD Manager.稍等几秒种.- 不同版本和配置的SDK Manager 可能显示不太一样. 你需要选择 Tools - Manage AVDs.- AVD Manager 就会显示如下:- 选择 New 并填写类似下图的相应的字段(建议选择 HVGA) :- 点击 Create AVD.- 你可以建立多个 AVD.每个可以具有不同的分辨率,也可以对应不同的API 版本(首先你需要安装额外的平台).- 现在点Start来启动模拟器- 你会看见好几个窗口弹出和消失,这个是正常情况.- 模拟器开始启动:等待. 第一次需要好几分钟才能等到模拟器准备好.当看见下面屏幕时说明模拟器准备好了:你也可能会看到下面的屏幕,这是锁屏界面:把开锁图标拽到右面来解锁设备.没有必要每次分发程序时都重启模拟器. 模拟器一直在保持运行状态.如果你对Android不太熟悉,你可以先使用模拟器. 按中间的小方块按钮进入应用程序页面.疑难解答: 如果碰见类似下面的错误信息:invalid command-line parameter: FilesAndroidandroid-sdktools/emulator-arm.exe.Hint: use foo to launch a virtual device named foo.那你就需要重新安装Android SDK到一个没有空格的目录,例如 c:android.编写第一个Basic4android 程序- 由于这是一个新程序,我们需要先需要通过选择File - Save来设置保存位置.强烈建议将每一个工程保存到自己的目录下.- 新建一个目录: Hello world, 打开目录并把程序保存为Hello world.- 在Sub Activity_Create里面输入下面代码:Code:Sub Activity_Create(FirstTime As Boolean) Log(Hello world!)Msgbox(Hello world! ,First program)End Sub- 按 F5 编译并发布你的程序到模拟器上.将会出现包对话框(空白的):每一个Android 应用使用一个唯一的包名来标识这是一个使用逗点分割的合成字符串.这个字符串至少应该包括两部分.你不能安装使用同一个包名的两个不同应用程序到一个设备.你可以使用tools菜单随时来改变包名.- 输入包名.- 下一步,会让你输入应用的标签.这个就是用户看到的应用名称.你的程序现在就被编译好并安装到模拟器上:模拟器比真实设备慢得多.由于安装非常快,在很多情况下直接在真实设备上工作更方便.你可以随时重新发布你的程序. 并不需要关闭模拟器上正在运行的程序.使用LogCat跟踪日志Android 设备保留一个内部缓冲来存储日志信息. 使用这些信息可以很方便的调试程序.你可以切换到LogCat 面板并按connect来查看日志:当我们运行两次这个程序后,就可以看见上面的屏幕快照里面有两个Hello world!信息.取消Filter勾选就会显示所有的信息 (不仅仅是你程序的信息).Hello world 常见问题- emulator: ERROR: no search paths found in this AVDs configurationweird, the AVDs config.ini file is malformed. Try re-creating it.当你的windows 用户名含有非ASCII字符时就会出现这个问题. 因为Android SDK 寻找对应目录失败.解决方法是建立一个目录,并命名为: c:android,然后增加一个ANDROID_SDK_HOME的环境变量,并设置其值为c:android.- invalid command-line parameter: FilesAndroidandroid-sdktools/emulator-arm.exe.Hint: use foo to launch a virtual device named foo.这个错误是因为Android SDK被安装到带有空格的目录.通过复制SDK到C:Android并更新配置路径来解决这个问题.- javac: target release 1.5 conflicts with default source release 1.7 -当前 Basic4android 需要Java 6来运行.并不支持 Java 7. 但是在同一个计算机可以同时安装这两个版本.basic4android 开发教程翻译(二)可视化设计与猜数字程序 要学习本教程,请先参考下面的教程:安装 Basic4android 和 Android SDKHello world - 安装Android 模拟器 在这个教程里面我们要使用设计器来建立layout. 这个layout包括一个文本框和一个按钮.用户需要猜一个随机的数字. 用户在文本框里面输入数字并通过点按钮提交猜的数字.然后系统会通过toast信息来给用户提示其输入的数字比系统选择的数字大还是小.- 建立一个新工程并保存它.-选择菜单来打开设计器.设计器有两部分组成.一部分是控制面板, 控制面板是IDE 的一部分,它包含所有的属性和选项:另外一部分是运行在模拟器上的可视元件:正如其名,可视化面板可以显示layout,并允许你移动和改变views的大小.在可视化面板上改变layout 的话,会同时改变控制面板上的保存的值.由于所有的数据都保存在控制面板上,因此我们不用担心模拟器崩溃或者被关掉.当你下一次连接上时,layout 会自动重新显示.首先要连上设备.请点Tools - Connect.这一步需要几秒钟时间. 请注意IDE 会一直保持这个连接直到IDE 被关闭,关闭设计器并不断开这个连接.使用 Add View menu 菜单来增加一个 Button, 一个 EditText 和一个 Label.并按下图来设置相应的属性和位置:改变 Activity的 Drawable 属性为 GradientDrawable来取得过渡色效果.小贴士 : 当你在小的显示器工作时,你会发现点了 Top Most(在控制面板右上角)勾选后会感觉非常方便 .这样控制面板就会显示在最上方而不会被模拟器挡住.保存这个layout,并命名为 Layout1.layout是一个非常重要的概念 ,因为其在你的代码和设计之间建立了完全的分界.layout被保存成一个文件,扩展名为.bal.每个工程可以有好几个这样的文件,除非你显式的载入一个layout文件,否则不会在你工程中造成任何影响.一旦你保存了一个layout, 它会自动的被加入File manager. 你可以在 IDE右面的Files面板里面看见它.我们将要使用button的 click 事件.每个 view 都有一个EventName的值. 在设计器里面是属性, 当在程序中添加view 时,会作为一个参数传递到Initialize过程中.为了使用一个事件,你应该使用下面的格式写一个子程序(其实很简单):Sub _ (event parameters).在设计器里,EventName属性默认为view的名字.如果我们要通过按钮的EventName的值来调用按钮的click 的事件的话,我们应该按照下面的格式写:Sub Button1_ClickSo here is the complete code:Code:Sub Process_GlobalsEnd SubSub GlobalsDim MyNumber As IntDim EditText1 AsEditText will hold a reference to the view added by the designerEnd SubSub Activity_Create(FirstTime As Boolean)Activity.LoadLayout(Layout1)Load the layout file.MyNumber = Rnd(1, 100)Choosearandomnumber between1to 99End SubSub Button1_Click If EditText1.Text MyNumber Then ToastMessageShow(My number is smaller., False) Else If EditText1.Text MyNumber Then ToastMessageShow(My number is larger., False) Else ToastMessageShow(Well done., True) End If EditText1.SelectAllEndSub一些注意事项:- 每个activity 模块都有一个Activity 对象,你可以使用这个对象来访问activity.- Activity.LoadLayout 可以用来载入layout文件.- 还有其他views也可以载入 layout 文件. 例如Panel 和 TabHost. 对于TabHost,每个页面都可以通过载入layout文件来建立.- 为了访问在设计器里面添加的views, 我们需要在Sub Globals里面定义它们.- ToastMessageShow 用来显示一段短的信息, 并且会在一小段时间后消失.在这里使用toast message其实不是非常合适,因为有时当软键盘打开时会使其无法提示.写事件子程序的小贴士:在IDE里, 先写Sub,然后按空格键. 你会看到小的提示 press tab to insert event declaration.再按 tab键, 选择对象类别并选择事件.现在你做的就是写需要的事件名和按回车.支持多种屏幕分辨率和方向每个layout文件可以包含一系列layout变体.每个layout变体保存views的不同的位置和大小的值.例如, 你改变任何view的文本的话,所有的变体的会自动改变. 然而当你改变view 的位置的话,只会影响当前变体的值.请注意,如果需要的话,按比例缩放会自动进行.这意味着当我们运行在一个高分辨率设备的时候,layout会自动缩放的.然而你可以为不同的缩放选择建立不同的变体.当你载入一个layout文件时,最匹配设备的那个变体将会被载入.一般你需要两个变体:- 320 x 480, scale = 1 (160 dpi). 这个是竖向的默认的比例.- 480 x 320, scale = 1 (160 dpi). 横向的默认比例.好, 重新打开设计器.载入 Layout1 文件.选择 New Variant 并选择 480 x 320 (第二个选项).选择模拟器,并通过按Ctrl + F11改变模拟器的方向.请注意,设备的layout详情会在变体列表下面出现.请如下图改变layout:你可以改变当前所选的变体,然后看看它是如何影响可视的layout.保存这个layout并运行这个程序.现在改变模拟器的方向,看看layout是如何对应改变的.每次当方向改变的时候,Android 就会销毁老的activity并建立新的activity. 每次 Activity.LoadLayout将会被再次调用. 因此非常不幸,每次要猜的数会被重新选择. 当然这个会很简单的改正. 但这不是本教程要做的.工程文件在附件下载.这个教程的最后小贴士:- IDE的Files菜单下面包括一个Export as zip选项. 用来生成一个包括所有需要文件的zip文件.文件下载地址: /android/fil.ssMyNumber.zipbasic4android 开发教程翻译(三)IDE 小贴士 basic4android 的 IDE 功能强大,它帮助你专注于写代码和建立你的应用.下面列出一些不容易发现的特色:- Ctrl + Space = 自动完成按 Ctrl + Space 激活自动完成功能,它会把得到的关键字,变量,模块,方法,子程,属性,字段等以列表显示出来 .并且在很多时候会列出这些项目的描述.在写了一些字母后按 Ctrl + Space通常会自动出现以这些字母开头的项目.- 工具提示信息 - 当写方法的参数时,工具提示会显示方法的定义和描述.工具提示有时可能会挡住你需要的重要代码,你可以按 ESC 隐藏它.你也可以按CTRL 键将其变为半透明,然后再按CTRL恢复回去.LogCat - LogCat面板里面显示设备内置的日志. 这些日志用来做调试非常方便. 你可以使用Log关键字来记录这些信息.为了开始显示这些日志,你需要按Connect 按钮.可以过滤这些日志,以便你只看到Basic4android和你的应用生成的日志.注意: 如果你连接的好几个设备,你可以通过按 Connect按钮来替换到不同的设备.设计器生成成员工具 - 这个工具让你生成设计器里面的views 的定义和事件的代码.请注意: 你只需要定义那些要在代码里面使用的views.如果你选了已经存在的项目不会有什么影响的(不会生成重复的代码).可以通过设计器窗口选择Tools - Generate Members来显示这个窗口.后台编译- 按 Alt + 3可以编译和安装你的程序,同时保证IDE 可以正常反应你的操作.屏幕下的状态条会显示处理过程的进度和什么时候安装完成.当过程失败时,会有一个短的声音提醒你. 在这种情况下,你就必须使用正常编译(F5),以便查看错误信息(取决于什么类型的错误).操作多个连接的设备- 在很多情况下,你可能同时连接好几个设备. 对于任何操作,都会显示一个连接设备的列表,你可以在列表里面选择你的目标设备.如果你是用后台编译的话,就会使用再次最后的一个设备. 这个通常比每次在前台选择目标设备方便的多.设计器 - 复制 - 通过选中view 并通过选择Tools - Duplicate View,你可以复制任何一个view.如果这个view有子views的话,同时会把子views也复制 上.导出成zip - 导出成zip 选项可以建立一个包含所有工程需要文件的 zip 文件. 当你需要备份和与别人共享工程时,这个功能就非常有用.这个功能位于Files菜单下.清理工程/ 清理无用文件 - 清理工程删除所有的生成的文件. 这些文件是在编译过程中生成的.清理无用文件是删除位于Files目录下没有被工程使用的文件(它不会删除任何工程layou t 引用的文件).在删除前会有一个无用文件的列表(这让你可以取消这个操作).运行 AVD Manager - AVD manager 允许你建立和启动模拟器. 这个菜单打来manager.请注意,当启动一个模拟器后,不需要保持AVD manager一直打开,你可以关闭它.两个附加提示:1.事件子程原型 -有一个特殊的自动完成特性可以帮助你写事件子程原型.开始写Sub并跟一个空格:就会出现下图.按Tab 键:就会显示一个当前所有的类型的列表(它们至少有一个事件). 选择需要的类型并按回车.再选择特定的事件.类似下面的代码就会被生成:EventName字符串将被选中, 改变它为对象的EventName值,然后按回车. 就这么简单.2. 设计器top most属性 - 设计器有一个top most勾选框,选中后可以保持设计器成为最前面的窗体.这在屏幕比较小时,设计器和模拟器要同时工作时 比较方便.调试数据 - 默认情况下,Basic4android编译器会加入一些调试数据到你的代码.当发生错误时,这些数据就非常有用. 它可以使程序显示出错的原始代码行.这些数据要使用一些空间并可能影响运行性能,但是一般影响都不会太大.你可以通过 Project菜单 - 取消Include Debug Information的选中来去掉这些数据.basic4android 开发教程翻译(四)调试应用程序 这个教程说明在Basic4android v1.50 后加入的新的调试功能及其他相关的工具.在Project菜单下有一个叫Attach Debugger的新选项.如果这个选项是选上的话,那么编译的的代码就会包含调试代码. 调试代码允许IDE 与程序建立连接并检查它的运行.当程序运行时,首先会等10秒钟与IDE 建立连接. 通常IDE 会很快连接上的. 然而当你手工从电话上运行这个程序时,就会看到这个等待.编译的APK文件会以 _DEBUG.apk后缀保存.由于这个文件包含调试信息,因此一般不应该分发这个apk文件,其在实际运 行中会造成巨大的拖延.这个菜单下的另外的一个选项是Include Debug Information.这个选项当Attach Debugger option被选上的话不会有任何效果.当Attach Debugger没有被选上的话(这意味着调试代码没有被加入)这个选项决定原始的 B4A 代码是否被加到编译的APK文件中. 增加B4A代码有特殊的用处.当出错时,错误信息会包含原始的B4A 代码行,而不仅仅是Java行.(译者注: b4a 首先把basci 语法转换成Java 代码,然后编译的) 当我们把Attach Debugger选上然后运行程序时,IDE 将屏幕的下方打开一个调试模块:调试模块包含三部分: subs stack, global variables and local variables.当程序暂停时这些部分显示相应的数据.你也可以把鼠标放到一个变量名上来查看它的值.在 subs stack 部分上面有四个按钮,分别对应继续执行,执行到下一行,暂停执行和停止程序.后面还有一个图标告诉我们调试 器是否连接上.双击这个图标可以不用关闭程序就断开调试器.同时还有一个Debug菜单,里面包括了Step Over (执行下一行并在内部的子程序调用时不中断) 和 Step Out (运行完当前子程后中断) 项.当调试模块出现时,代码编辑器会保持只读.断点 - 你可以把代码里面的一行作为断点.通过点击代码左面灰色区域来设置一个断点.当程序运行到断点时会暂停,这时你就可以查看当前的运行状态了.日志 - 右边面板上的Logs页面是非常有用的. 它显示元件生存循环中的相关信息, 它也可以显示使用Log 关键字输出的信息. 你可以通过按Connect按钮来连接设备的日志.请注意,有一个Filter 的勾选框.当选上时,你只看到与你程序相关的信息.当没有被选上的时候,你会看到运行系统上的所有信息.当你碰到一个错误却在日志里面没有看见任何相关信息时 ,可以试着去掉filter 选中来查找一下错误信息.由于这个日志是设备来维护的,因此当你连接上一个设备时,你也会看到以前的信息.关于调试器的注意事项:- 在下面子程中的断点会被忽略: Globals, Process_Globals and Activity_Pause.- 服务 - 调用StartService 后面出现的断点会被忽略. 在 Service_Create 和 Service_Start里设置的断点会暂停程序一段时间(大约 12 秒).这是防止OS 杀掉这个服务.- 当程序暂停时,触发的事件将被执行.在事件中的断点会被忽略(仅仅发生在程序已经被暂停).- 从设备传送到IDE 的数据有大小限制. 太长的字符串会被截断.basic4android 开发教程翻译(五)Android进程及activitys 生存周期 简而言之 :每个 Basic4android 程序在它自己的进程中运行.一个进程拥有一个主线程,这个主线程也叫做UI 线程,它会一直运行到进程结束.一个进程也可以有好几个线程,这些线程用来做一些后台工作.当用户启动一个应用时,一个进程就开始了工作, 假设其并没有已经在后台运行.进程的结束是不确定的. 有时可能发生在用户或者系统关闭掉所有的activities后.假设你有一个activity,当用户按了返回键,这个activity被关闭了. 以后当电话的内存不够时这个进程就会退出了(最后肯定会出现这种情况的).如果用户再次运行这个程序时,而这个进程并没有被杀掉的话,这个进程就会被再次使用.一个Basic4android应用是由一个或者多个activities组成. Android 支持其他几个main元件.这些以后将在以后版本的Basic4android中加入.Activities有点类似wondows 的窗体.主要的差别是当一个activity不在前台时,为了节省内存, 这个activity可能会被杀掉. 通常在activity消失前,你需要保存它的状态. 要么保存到一个持久的存储上,要么保存到它的进程的内存里.以便以后当需要这个activity时,重新建立它.另一个需要小心的地方是当设备的主要配置发生变化时. 最常见情况是方向的变化(用户旋转了设备). 当这些变化发生时,当前的activities会被销毁和重建. 现在当我们建立activity时,我们可以根据新的配置来建立 (例如, 我们现在知道新的屏幕尺寸).我们如何处理这些呢? 当你建立一个新的activity时,你可以使用下面的代码模版:Code:Sub Process_GlobalsThese global variables will be declared once when the application starts.These variables can be accessed from all modules.End SubSub GlobalsThese global variables will be redeclared each time the activity is created.These variables can only be accessed from this module.End SubSub Activity_Create(FirstTime As Boolean)End SubSub Activity_ResumeEnd SubSub Activity_Pause (UserClosed As Boolean)End Sub 变量可以是全局的和局部的. 局部变量是定义在子程里面而不是定义在Process_Globals 和Globals里.局部变量被限制在本子程内. 子程一旦结束,这些变量就不再存在.全局变量可以被所有的子程访问.有两种类型的全局变量.进程变量和activity变量.进程变量 - 这些变量与进程的生存期一致.你应该把把这些变量定义到sub Process_Globals里面.当进程开始时,这个子程被调用一次(不仅仅是第一个activitie,对所有的activities都一 样).这些变量应该仅仅是公开变量. 这意味着它们也可以被其它模块访问.然而,不是所有类型的对象都可以被定义为进程变量.例如,所有的views不能被定义成进程变量.主要原因是我们不想保留一个可能随着activity销毁而被销毁的引用对象.换句话说,一旦activity被销毁了, activity上所有的views 也会同时被销毁.如果我们保留着一个view的引用,垃圾收集器就不能释放这些资源,就会造成内存泄漏.编译器强制执行这个要求.Activity变量 - 这些变量包含在activity中.你应该在Sub Globals中定义这些变量.这些变量是 私有的并且只能在当前activity模块中访问.所有的对象类型都可以被定义为activity变量.每次activity建立时, Sub Globals就会被调用(在Activity_Create之前).这些变量的生存期与这个activity一致.Sub Activity_Create (FirstTime As Boolean)当activity建立后,就会调用这个子程.当用户启动应用时,activity就会被建立, 当设备的配置发生变化时(用户转动设备),这个activity就会被销毁.另外,当这个activity 在后台时,为了释放内存,OS 也可能会决定销毁它.这个子程应该用来载入或者建立layout (当然也可以做其他用处).FirstTime 参数用来告诉我们是不是第一次建立这个activity. Firsttime相对于当前进程.你可以使用FirstTime来完成有关进程变量的各种初始化工作.例如,如果你需要读一个含有一个列表的文件,当FirstTime是True 的时候,你可以读取这个文件并将文件中的列表保存为进程变量.现在我们就可以知道这个列表在整个进程的生存期会存在,而不需要每次activity建立后都重新读取这个 列表.总而言之, 你可以检查FirstTime是否为True,然后初始化进程变量.Sub Activity_Resume 和 Sub Activity_Pause (UserClosed As Boolean)每次当activity从前台转换到后台时就会调用 Activity_Pause子程.当activity 在前台时,但是配置发生变化时 (这会导致activity暂停并被销毁), 也会调用Activity_Pause子程.Activity_Pause 是保存重要信息的最后的一个地方.一般有两种机制来让你保存activity状态.仅与当前应用有关的信息可以被保存到一个或多个进程变量中.其他信息应该保存到持久存储上(文件或者是数据库).例如,如果用户改变了一些设置,你应该在这里把这些改变保存到持久存储上. 否则这些变化可能会丢失.当Activity_Create完成后会立刻调用Activity_Resume.另外就是当继续一个暂 停的activity也会调用它 (被切换到后台的activity又被切换到前台).注意:当你打开一个不同的activity时 (通过调用 StartActivity),当前的进程首先被暂停,然后另外的activity将被建立(如果需要的话 ),然后当前进程会继续执行(总是这样).通过以上讨论, 每次当activity从前台切换到后台时Activity_Pause就会被调用. 这可能是以下原因造成的:1. 启动了一个不同的activity.2. Home键被按了.3. 配置改变事件被触发(例如方向发生变化).4. Backj键被按了.在1和2的情况下, activity将会被暂停,并被保存到内存中以便以后再次使用.在3的情况下, activity将会被暂停,销毁.然后再建立(并继续).在4的情况下, activity将会被暂停然后销毁. 按Back键类似与关闭activity. 在这种情况下,你没必要保存任何实例特定的信息(例如PacMan游戏中的pacman的位置 ).这中情况下,UserClosed 参数为true.其他情况下都是false. 请注意当你调用Activity.Finish时,它也是true. 这个方法暂停和销毁当前activity,和Back键类似.你可以使用UserClosed 参数来决定需要保存那些数据和重置任何相关的进程变量为初始化值(如果位置是进程变量的话,移动pacma n的位置到中间).处理UI状态的一个新模块请参考这里: /forum/basic.ngs-state.htmlbasic4android 开发教程翻译(六)使用B4A-Bridge连接你的设备 到目前为止,我们在开发中有两种方法来测试应用.一种是通过Android 模拟器来测试.另外就是当你的设备支持ADB调试的话,可以直接连到真实设备上测试.Android模拟器相比真实设备慢得多(尤其是安装应用).因此大多情况下使用真实设备更方便.我个人也仅仅是在用可视化设计器时才使用模拟器.然而不是所有的设备都支持ADB调试.这就是为什么要使用B4A-Bridge工具的原因.B4A-Bridge由两个元件组成. 一个元件运行在实际设备上,另外一个是IDE 的一部分,后者可以连接到前者,并与实际设备通讯.连接是通过网络实现的 (如果没有网络的话,B4A-Bridge 不能工作).一旦建立连接, B4A-Bridge支持所有的IDE 特性, 包括:安装应用,查看LogCat和可视化设计.Android 不允许一个应用悄悄的安装另外一个应用,因此当你使用B4A-Bridge运行你的应用时,会显示安装确认界面.开始使用B4A-Bridge1. 首先你需要把B4A-Bridge安装到你的设备上.你可以在这里下载B4A-Bridge: /android/files/b4a_bridge.apk.B4A-Bridge同样也可以在Android市场里面找到. 查找: B4A Bridge.请注意你需要允许系统可以从未知源安装应用. 这个可以通过系统设置里面更改.2. 在你的设备上运行B4A-Bridge. 它会显示一个如下图的界面:状态就是: Waiting for connections(等待连接).3. 在IDE菜单里选择Tools - B4A Bridge - Connect.你需要输入真实设备屏幕上显示的IP地址.IDE 屏幕下方状态条会显示当前的状态:就这么简单.当B4A-Bridge被连接后,它首先检查设计器应用是否需要更新,如果需要更新的话,它会首先安装设计器应用.除非你按了Stop键,B4A-Bridge会作为一个服务一直运行着.你可以随时通过打开提醒屏来查看它的运行情况:在提醒上点击会打开主屏幕.上面已经说过,当你运行一个应用时,你需要确认这个安装. 通常会显示下面的屏幕:在上面的对话框里,你应该选择Open来运行这个应用.如果你试着安装一个签着不同key 的已有应用时, 安装会失败(没有任何有意义的信息). 你应该先卸载存在的应用. 回到主屏选择 - Settings - Applications - Manage applications - 选中该应用 - Uninstall.为了节省电池能量,一旦你完成开发就应该按Stop按钮结束B4A-Bridge.B4A-Bridge就是用Basic4android编写的.源程序可以在这里下载: /forum/basic.html#post45854basic4android 开发教程翻译(七)Basic4android中的对象和类型 类型Basic4android的类型系统是直接从Java的类型系统中派生的.有两种类型的变量: 基本类型 and 非基本类型.基本类型包括数字类型: Byte, Short, Int, Long, Float 和 Double.基本类型也包括: Boolean 和 Char.类型及范围列表: /forum/basic.html#post45511但函数调用或者赋值时,基本类型总是直接把值传递过去.例如:Code:Sub S1Dim A As IntA = 12S2(A) Log(A) Prints 12End SubSub S2(B As Int) B = 45End Sub其他所有的类型,包括基本类型数组和字符串都被归入到非基本类型.当你将一个非基本类型传递给函数或者给它赋另外一个不同的值时,会将其的引用复制一份传递过去 .这意味着数据的本身没有被复制.这与直接把引用传递过去有点小小不同,因为你不能改变原始变量的引用.所有的类型都可以被看作是对象.像lists 和 maps这样的容器工作原理与对象相似,因此可以保存任何值.下面是一个常见的错误例子, 在这里,开发者试图向列表里面加入几个数组:Code:Dim arr(3) As IntDim List1 As ListList1.InitializeFori = 1 To 5arr(0) = i * 2arr(1) = i * 2arr(2) = i * 2List1.Add(arr) Add the whole array as a single itemNextarr = List1.Get(0) get the first item from the listLog(arr(0) What will be printed here?本来希望能够打印出来2. 但是结果确是10.我们建立了一个数组,并在列表里面加了这个数组的5个引用.这个数组最后的值在最后的一个循环里面被改为10,因此出错了要改正这个错误,我们需要在每一个循环里面产生一个新的数组.这一在每次循环里面调用Dim:Code:Dim arr(3) As Int This?call?is?redundant?in?this?case.在这个例子里面,这一句是多余的Dim List1 As ListList1.InitializeFor i = 1 To 5 Dimarr(3) As Intarr(0) = i * 2 arr(1) = i * 2arr(2) = i * 2List1.Add(arr) Add the whole array as a single itemNextarr = List1.Get(0) get the first item from the listLog(arr(0) Will print 2小贴士: 你可以使用 agraham的 CollectionsExtra 库来复制数组.转换 Basic4android 当需要时会自动转换类型的. 它也可以自动的将数字转换为字符串,反之亦然.在很多情况下,你需要显式的转换一个对象成另外一个特定的类型.这可以通过将一个对象赋值给一个需要类型的变量.例如, Sender 关键字返回触发这个事件的对象.下面的代码改变按钮的颜色. 注意有好几个按钮共享同一个事件子程.Code:Sub Globals Dim Btn1, Btn2, Btn3 As ButtonEnd SubSub Activity_Create(FirstTime As Boolean) Btn1.Initialize(Btn) Btn2.Initialize(Btn) Btn3.Initialize(Btn) Activity.AddView(Btn1, 10dip, 10dip, 200dip, 50dip) Activity.AddView(Btn2, 10dip, 70dip, 200dip, 50dip) Activity.AddView(Btn3, 10dip, 130dip, 200dip, 50dip)End SubSub Btn_Click Dim b As Button b = Sender Cast the Object to Button b.Color?=?Colors.RGB(Rnd(0, 255), Rnd(0, 255), Rnd(0, 255)End Sub上面的代码也可以写的更优雅点:Code:Sub GlobalsEnd SubSub Activity_Create(FirstTime As Boolean) For i = 0 To 9 create 10 buttons Dim Btn As Button Btn.Initialize(Btn) Activity.AddView(Btn, 10dip, 10dip + 60dip * i, 200dip, 50dip) NextEnd Sub Sub Btn_Click Dim b As Button b = Sender b.Color = Colors.RGB(Rnd(0, 255), Rnd(0, 255), Rnd(0, 255)End Sub范围在Sub Globals or Sub Process_Globals 里面定义的变量可以在所有的子程里面访问.其他的变量是局部的,只能在定义其的子程里面访问.请参见 Activity lifecycle tutorial 来了解Globals和Process_Globals变量的区别.提示所有的views类型可以看成是Views. 这样就可以方便的改变views的公共属性.例如,下面的代码使 activity的所有直系子view 不可用:Code:For i = 0 To Activity.NumberOfViews - 1 Dim v As View v = Activity.GetView(i) v.Enabled = FalseNext如果们仅仅想使按钮不可用:Code: For i = 0 To Activity.NumberOfViews - 1 Dim v As View v = Activity.GetView(i) If v Is Button Then check whether it is a Button v.Enabled = False End IfNextType 关键字让你可以建立自己的对象类型. 自定义类型的操作方式与其他非基本类型的操作方式一样.basic4android 开发教程翻译(八)使用ListViewListView 控件是一个非常强大的控件. 它可以以非常雅致的方式来显示长的或者短的列表.建立一个ListView 非常简单:Code:Sub GlobalsDim ListView1 As ListViewEnd SubSub Activity_Create(FirstTime As Boolean) ListView1.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论