Android开发教程+笔记十--基础UI编程4
新版Android开发教程+笔记七--基础UI编程1
封面Android 基础UI编程1更改与显示文字标签TextView 标签的使用①导入TextV iew包import android.widget.TextView;②在mainActivity.java中声明一个TextViewprivate TextView mTextView01;③在main.xml中定义一个TextView<TextView android:text="TextView01"android:id="@+id/TextView01"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_x="61px"android:layout_y="69px"></TextView>④利用findView ById()方法获取main.xml中的TextViewmTextView01 = (TextView) findViewById(R.id.TextView01);⑤设置TextV iew标签内容String str_2 = "欢迎来到Android 的TextView 世界...";mTextView01.setText(str_2);⑥设置文本超级链接<TextViewandroid:id="@+id/TextView02"android:layout_width="wrap_content"android:layout_height="wrap_content"android:autoLink="all"android:text="请访问Android 开发者:/index.html"> </TextView>android.graphics.Color实践----Color颜色变幻android.graphics.Color包含颜色值Color.BLACK Color.BLUEColor.CY ANColor.DKGRAY Color.GRAYColor.GREEN Color.LTGRAY Color.MAGENTA Color.REDColor.TRANSPARENT Color.WHITE Color.YELLOW 黑色蓝色青绿色灰黑色灰色绿色浅灰色红紫色红色透明白色黄色编程实现颜色变幻①新建工程②修改mainActivity.java文件,添加12个TextV iew对象变量,一个LinearLayout对象变量、一个WC 整数变量、一个youtParams变量。
Android开发自学笔记(AndroidStudio)—4.1布局组件
Android开发⾃学笔记(AndroidStudio)—4.1布局组件⼀、引⾔Android的界⾯是有布局和组件协同完成的,布局好⽐是建筑⾥的框架,⽽组件则相当于建筑⾥的砖⽡。
组件按照布局的要求依次排列,就组成了⽤户所看见的界⾯。
在Android4.0之前,我们通常说Android开发五⼤布局和四⼤组件,这五⼤布局就是:1. LinearLayout 线性布局2. FrameLayout 单帧布局,也有中⽂翻译为帧布局、框架布局。
3. RelativeLayout 相对布局4. AbsoluteLayout 绝对布局5. TableLayout 表格布局⽽在Android4.0之后⼜新增了⼀种GridLayout⽹格布局。
⼆、LinearLayout线性布局线性布局是Android开发中最常见的⼀种布局⽅式,它是按照垂直或者⽔平⽅向来布局,通过“android:orientation”属性可以设置线性布局的⽅向。
属性值有垂直(vertical)和⽔平(horizontal)两种。
线性布局的排列在某⾏或者某列并不会⾃动换⾏或换列,就是说如果采⽤⽔平布局,控件宽度超过屏幕显⽰的话,后⾯的控件都将被隐藏,不会⾃动换⾏。
常⽤的属性有:1. android:orientation:可以设置布局的⽅向2. android:id - 为控件指定相应的ID3. android:text - 指定控件当中显⽰的⽂字,需要注意的是,这⾥尽量使⽤string.xml4. android:gravity - 指定控件的基本位置,⽐如说居中,居右等位置5. android:textSize - 指定控件当中字体的⼤⼩6. android:background - 指定控件所⽤的背景⾊,RGB命名法7. android:layout_width - 指定控件的宽度8. android:layout_height - 指定控件的⾼度9. android:layout_weight - 指定控件的占⽤⽐例10. android:padding - 指定控件的内边距,也就是说控件当中的内容11. android:sigleLine - 如果设置为真的话,则将控件的内容显⽰在⼀⾏当中layout_weight属性以控制各个控件在布局中的相对⼤⼩。
Android UI学习笔记
Android中的像素:(sp作为文字大小的单位,dp(dip)作为其他元素的单位)dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。
pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用;sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。
由此,根据google的建议,TextView的字号最好使用sp做单位,而且查看TextView的源码可知Android 默认使用sp作为字号单位。
在Android 中,1pt 大概等于2.22sp以上供参考,如果UI 能够以sp为单位提供设计是最好的,如果设计中没有sp的概念,则开发人员也可以通过适当的换算取近似值。
过去,程序员通常以像素为单位设计计算机用户界面。
例如,定义一个宽度为300像素的表单字段,列之间的间距为5个像素,图标大小为16×16像素等。
这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小。
在有些情况下,用户界面可能会小到难以看清内容。
与分辨率无关的度量单位可以解决这一问题。
Android支持下列所有单位。
px(像素):屏幕上的点。
in(英寸):长度单位。
mm(毫米):长度单位。
pt(磅):1/72英寸。
dp(与密度无关的像素):一种基于屏幕密度的抽象单位。
在每英寸160点的显示器上,1dp = 1px。
dip:与dp相同,多用于android/ophone示例中。
sp(与刻度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。
为了使用户界面能够在现在和将来的显示器类型上正常显示,建议大家始终使用sp作为文字大小的单位,将dip作为其他元素的单位。
第四课:Android UI编程(三)
21
上下文菜单ContextMenu
用手指按住某个带有上 下文菜单的部件(Context)不 放时,就可以调出上下 文菜单。 总的来说,上下文菜 单与选项菜单的构成类 似。它们的主要区别在 于如何填充菜单和如何 获知菜单项被选择。
对话框AlertDialog.Builder属性
• 通过内嵌类AlertDialog.Builder来创建 –create():创建对话框 –setTitle():设置标题 –setIcon():设置图标 –setMessage():设置提示信息 –setPositiveButton():设置确认yes按钮 –setNegativeButton():设置no按钮 –setNeutralButton:设置中间按钮 –setItems():设置一个列表 –setSingleChoiceItems():对话框单选列表 –setMultiChoiceItems():对话框多选列表 –setView():设置自定义的对话框UI
• 3、创建对话框,并给对话框设置view
–AlertDialog.Builder(ctx).setView(dialogView);
进度条对话框
• ProgressDialog –setProgressType –setIndeterminate –setCancelable,是否可以取消 –setButton
04 Android用户界面技术
• Widget是由多个简单Control组合起来复杂的 View 。
• Spinner(旋转按钮)、ListView、Gallery、 DatePicker
视图组(ViewGroup)
• 在Android中视图组是集合若干个控件在一起的元 素,ViewGroup有两种用法,一种是像普通的控件 一样使用(如网页视图、旋转按钮、文本切换器 、图像切换器、单选按钮组等),另一种是作为 布局容器使用(各种布局)。 • 在屏幕中控件的组织上,可以将各个视图(控件 )组成一个视图组(ViewGroup),视图组是一个 包含了其他视图的视图。 • android.view.ViewGroup扩展了 android.view.View,它本身也具有View的特性, 区别仅在于它可以包含其他的控件。
Java代码
public class MyKeyEvent extends Activity { private private private private static final String TAG = "MyKeyEvent"; ImageView mImage; TextView mAlphavalueText; int mAlphavalue;
Android视图和视图组的关系
• 其中包含一个视图组ViewGroup0,ViewGroup0包 含3个子视图,即View1、ViewGroup1、 ViewGroup2。ViewGroup1本身也是视图组,以水 平布局的方式包含了View2和View3;ViewGroup2 本身也是视图组,以垂直的方式包含了View4、 ViewGroup3和ViewGroup4;ViewGroup4本身也是 视图组,以水平布局的方式包含了View5和View6 。
Android+UI界面编程
Android UI界面编程简述ChateauAerlian布局菜单的生成对话框的生成UI事件处理在Android,有多种方法可以截取用户与应用程序之间的事件交互。
考虑到用户界面上的事件,可以通过用户操作的界面所对应的View对象来获取。
View类提供了相关的方法。
在构建界面布局时,会使用到View类,其中有一些公共的回调函数,对用户界面事件是有用的。
当对应的View 上有事件发生时,这些回调函数将被Android的Framework调用。
例如,一个View(属于一个Button)被触摸点击,onTouchEvent()方法将被调用。
为了去获取该事件,开发者必须扩展这个类,并且重载这个方法。
但是,扩展每一个View对象实例以便去获取事件,这样做是不实际的。
这就是为什么View类也包含一些嵌套的接口,该接口和回调函数一起使用,方便定义。
这些接口叫做事件监听,能通过他们来获取用户与界面的交互。
当经常地使用事件监听时,可能也会需要扩展一个View类,以便去构建一个用户自定义元素。
也许你希望去扩展一个Button类去做一些其他事情。
在该情况下,你将能够通过使用eventhandlers去定义缺省的事件行为。
事件监听一个事件监听是View类中的一个接口,其中包含一个单一的回调方法。
当View监听被注册并被用户操作所触发时,Android框架将调用这些方法。
OnClick()来自View.OnClickListener.,用户点击Item(Touch模式)、提起导航键、按下轨迹球、按下enter 键时触发。
OnLongClick()来自View.OnLongClickListener.,用户长按Item(Touch模式)、长按导航键、长按轨迹球、长按enter键。
OnFocueChange()来自View.OnFocusChangeListener.,用户使用轨迹球或者是导航键去移动光标。
OnKey()来自View.OnKeyListener,用户按下或者释放一个Key设备。
basic4android+开发教程
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: Files\Android\android-sdk\tools/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 AVD's configurationweird, the AVD's config.ini file is malformed. Try re-creating it."当你的windows 用户名含有非ASCII字符时就会出现这个问题. 因为Android SDK 寻找对应目录失败.解决方法是建立一个目录,并命名为: c:\android,然后增加一个ANDROID_SDK_HOME的环境变量,并设置其值为c:\android.- "invalid command-line parameter: Files\Android\android-sdk\tools/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 <EventName>_<Event> (event parameters).在设计器里,EventName属性默认为view的名字.如果我们要通过按钮的EventName的值来调用按钮的click 的事件的话,我们应该按照下面的格式写:Sub Button1_ClickSo here is the complete code:Code:Sub Process_GlobalsEnd SubSub GlobalsDim MyNumber As IntDim EditText1 As EditText '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) 'Choose a random number between 1 to 99End SubSub Button1_ClickIf EditText1.Text > MyNumber ThenToastMessageShow("My number is smaller.", False)Else If EditText1.Text < MyNumber ThenToastMessageShow("My number is larger.", False)ElseToastMessageShow("Well done.", True)End IfEditText1.SelectAllEnd Sub一些注意事项:- 每个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_Globals'These global variables will be declared once when the application starts.'These variables can be accessed from all modules.End SubSub Globals'These 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会作为一个服务一直运行着.。
新版Android开发教程+笔记九--基础UI编程3
封面Android UI编程基础3EditText与TextView共舞setOnKeyListener事件①新建工程②在main.xml布局中添加UI元素:一个EditText和一个TextView<?xml version="1.0"encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/hello"/><EditTextandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/myEditText"/><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:id="@+id/myTextView"/></LinearLayout>③在mainActivity.java主Activity中修改代码package zyf.EX_Ctrl_1;import android.app.Activity;import android.os.Bundle;import android.view.KeyEvent;import android.view.View;import android.widget.EditText;import android.widget.TextView;public class EX_Ctrl_1extends Activity{private TextView mTextView01;④结果private EditText mEditText01;/**Called when the activity is first created.*/@Overridepublic void onCreate(Bundle savedInstanceState){super .onCreate(savedInstanceState);setContentView(yout.main );/*取得TextView 、EditText */mTextView01=(TextView)findViewById(R.id.myTextView );mEditText01=(EditText)findViewById(R.id.myEditText );/*设置EditText 用OnKeyListener 事件来启动*/mEditText01.setOnKeyListener(new EditText.OnKeyListener(){@Overridepublic boolean onKey(View v ,int keyCode,KeyEvent event){//TODO Auto-generated method stubmTextView01.setText(mEditText01.getText().toString());return false ;}});}}处理EditText 键入事件设计具有背景图的按钮ImageButton 的焦点及事件处理①新建工程准备png 图片资源clickimage.png 、lostfocusimage.png 、onfocusimage.png③在string.xml 中添加字符串④修改main.xml 布局,添加布局元素<?xml version ="1.0"encoding ="utf-8"?><resources ><string name ="app_name">EX_Ctrl_2</string ><string name ="unknown">图片按钮状态:未知</string ><string name ="onfocus">图片按钮状态:Got Focus </string ><string name ="lostfocus">图片按钮状态:Lost Focus </string ><string name ="onclick">图片按钮状态:Got Click </string ><string name ="normalbutton">一般按钮</string ></resources ><?xml version ="1.0"encoding ="utf-8"?><LinearLayout xmlns:android ="/apk/res/android"android:orientation ="vertical"android:layout_width ="fill_parent"android:layout_height ="fill_parent"android:background ="#EE559611"><TextViewandroid:id ="@+id/show_TextView"android:layout_width ="fill_parent"android:layout_height ="wrap_content"android:text ="@string/unknown"/><ImageButtonandroid:id ="@+id/image_Button"android:layout_width="wrap_content"android:layout_height="wrap_content"/><Buttonandroid:id="@+id/normal_Button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/normalbutton"/></LinearLayout>⑤修改mainActivity.javapackage zyf.EX_Ctrl_2;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnFocusChangeListener;import android.widget.Button;import android.widget.ImageButton;import android.widget.TextView;public class EX_Ctrl_2extends Activity{/**Called when the activity is first created.*//*声明三个对象变量(图片按钮,按钮,与TextView)*/private ImageButton mImageButton1;private Button mButton1;private TextView mTextView1;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(yout.main);/*通过findViewById构造三个对象*/mImageButton1=(ImageButton)findViewById(R.id.image_Button);mButton1=(Button)findViewById(R.id.normal_Button);mTextView1=(TextView)findViewById(R.id.show_TextView);/*通过OnFocusChangeListener来响应ImageButton的onFous事件*/mImageButton1.setOnFocusChangeListener(new OnFocusChangeListener(){ public void onFocusChange(View arg0,boolean isFocused){//TODO Auto-generated method stub/*若ImageButton状态为onFocus改变ImageButton的图片并改变textView的文字*/if(isFocused==true){mTextView1.setText(R.string.onfocus);mImageButton1.setImageResource(R.drawable.onfocusimage);⑥结果}/*若ImageButton状态为offFocus改变ImageButton的图片并改变textView的文字*/else{mTextView1.setText(R.string.lostfocus);mImageButton1.setImageResource(R.drawable.lostfocusimage);}}});/*通过onClickListener来响应ImageButton的onClick事件*/mImageButton1.setOnClickListener(new OnClickListener(){public void onClick(View v){//TODO Auto-generated method stub/*若ImageButton状态为onClick改变ImageButton的图片并改变textView的文字*/mTextView1.setText(R.string.onclick);mImageButton1.setImageResource(R.drawable.clickimage);}});/*通过onClickListener来响应Button的onClick事件*/mButton1.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v){//TODO Auto-generated method stub/*若Button状态为onClick改变ImageButton的图片*并改变textView的文字*/mTextView1.setText(R.string.lostfocus);mImageButton1.setImageResource(R.drawable.lostfocusimage);}});}}使用XML 实现按钮改变焦点设置背景图Button 的android:background 属性�设置按钮背景图片:�onFocus()与onClick()事件处理�Item 的android:state_focused 和android:state_pressed 属性�实现①新建工程②准备png 背景图片defaultimage.png 、onfocusimage.png 、clickimage.png③在main.xml 布局中添加一个ImageButton 和一个Button(作对比)clickimage defaultimage.png onfocusimage.png <?xml version ="1.0"encoding ="utf-8"?><LinearLayout xmlns:android ="/apk/res/android"android:orientation ="vertical"android:layout_width ="fill_parent"android:layout_height ="fill_parent"android:background ="#FF25CCDD"><ImageButtonandroid:id ="@+id/image_Button"android:layout_width ="wrap_content"android:layout_height ="wrap_content"<Buttonandroid:text ="Button01"android:id ="@+id/Button01"android:layout_width ="wrap_content"android:layout_height ="wrap_content"></Button ></LinearLayout >④在drawable 文件夹中添加一个advancedbutton.xml 设置<selector>和<item>标签⑤设置ImageButton 的android:background 属性值⑥结果<?xml version ="1.0"encoding ="utf-8"?><selector xmlns:android ="/apk/res/android"><item android:state_focused ="true"android:state_pressed ="false"android:drawable ="@drawable/onfocusimage"/><item android:state_focused ="true"android:state_pressed ="true"android:drawable ="@drawable/clickimage"/><itemandroid:state_focused ="false"android:state_pressed ="true"android:drawable ="@drawable/clickimage"/><item android:drawable ="@drawable/defaultimage"/></selector ><ImageButtonandroid:id ="@+id/image_Button"android:layout_width ="wrap_content"android:layout_height ="wrap_content"android:background ="@drawable/advancedbutton"/>获得焦点时获得焦点并按下失去焦点时默认时利用XML 来改变按钮背景图片给圣诞老人的信息Toast--Android专属浮动小提示①新建工程②在string.xml中添加字符串<?xml version="1.0"encoding="utf-8"?><resources><string name="app_name">EX_Ctrl_3</string><string name="dear">亲爱的圣诞老人:</string><string name="sendmyWish">送出愿望</string><string name="yourWish">你的愿望:</string><string name="hasSend">已送达圣诞老人信箱!</string></resources>③在main.xml布局中添加UI元素:一个TextView、一个EditView和一个Button<?xml version="1.0"encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:layout_height="wrap_content"android:layout_width="fill_parent"android:id="@+id/TextView_dear"android:text="@string/dear"></TextView><EditTextandroid:layout_height="wrap_content"android:id="@+id/EditText_Wish"android:layout_width="fill_parent"></EditText><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/Button_Send"android:text="@string/sendmyWish"android:layout_marginLeft="50px"></Button></LinearLayout>④修改mainActivity.java文件package zyf.EX_Ctrl_3;import android.app.Activity;import android.os.Bundle;import android.text.Editable;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class EX_Ctrl_3extends Activity{/**Called when the activity is first created.*//*声明两个对象变量(按钮与编辑文字)*/private Button mButton;private EditText mEditText;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(yout.main);/*通过findViewById()取得对象*/mButton=(Button)findViewById(R.id.Button_Send);mEditText=(EditText)findViewById(R.id.EditText_Wish);/*设置onClickListener给Button对象聆听onClick事件*/mButton.setOnClickListener(new Button.OnClickListener(){@Overridepublic void onClick(View v){//TODO Auto-generated method stub/*声明字符串变量并取得用户输入的EditText字符串*/Editable Str;Str=mEditText.getText();/*使用CharSequence类getString()方法从XML中获取String*/CharSequence string2=getString(R.string.yourWish);CharSequence string3=getString(R.string.hasSend);/*使用系统标准的makeText()方式来产生Toast信息*/Toast.makeText(EX_Ctrl_3.this,string2+Str.toString()+string3,Toast.LENGTH _LONG).show();/*清空EditText*/mEditText.setText("");}});}}⑤结果Toast--显示View的提示Toast显示一个ImageView①新建工程②在drawable文件夹中添加一副png图片:argon.png③修改mainActivity.java文件package zyf.EX_Ctrl_3_B;import android.app.Activity;import android.os.Bundle;import android.widget.ImageView;import android.widget.Toast;public class EX_Ctrl_3_B extends Activity{ /**Called when the activity is first created.*/ @Overridepublic void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);/*设置主屏布局*/setContentView(yout.main);/*创建新Toast对象*/Toast showImageToast=new Toast(this);/*创建新ImageView对象*/ImageView imageView=new ImageView(this);/*从资源中获取图片*/imageView.setImageResource(R.drawable.argon);/*设置Toast上的View--(ImageView)*/showImageToast.setView(imageView);/*设置Toast显示时间*/showImageToast.setDuration(Toast.LENGTH_LONG);/*显示Toast*/showImageToast.show();}}④结果Toast显示一个Button①新建工程②修改mainActivity.java文件package zyf.EX_Ctrl_3_B;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.Toast;public class EX_Ctrl_3_B extends Activity{ /**Called when the activity is first created.*/ @Overridepublic void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);/*设置主屏布局*/setContentView(yout.main);/*创建新Toast对象*/Toast showImageToast=new Toast(this);///*新建Button对象*/Button button=new Button(this);button.setText("OK");/*设置Toast上的View--(Button)*/showImageToast.setView(button);/*设置Toast显示时间*/showImageToast.setDuration(Toast.LENGTH_LONG);/*显示Toast*/showImageToast.show();}}③结果Toast显示一个TextView①新建工程②修改mainActivity.java文件package zyf.EX_Ctrl_3_B;import android.app.Activity;import android.os.Bundle;import android.widget.TextView;import android.widget.Toast;public class EX_Ctrl_3_B extends Activity{ /**Called when the activity is first created.*/ @Overridepublic void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);/*设置主屏布局*/setContentView(yout.main);/*创建新Toast对象*/Toast showImageToast=new Toast(this);/*新建TextView对象*/TextView text=new TextView(this);/*设置TextView内容*/text.setText("显示在Toast中的TextView");/*设置Toast上的View--(TextView)*/showImageToast.setView(text);/*设置Toast显示时间*/showImageToast.setDuration(Toast.LENGTH_LONG);/*显示Toast*/showImageToast.show();}}③结果AlertDialog.Builder 提示对话框①新建工程②修改mainActivity.java 文件③结果package zyf.EX_Ctrl_3_B;import android.app.Activity;import android.app.AlertDialog;import android.os.Bundle;public class EX_Ctrl_3_B extends Activity {/**Called when the activity is first created.*/@Overridepublic void onCreate(Bundle savedInstanceState){super .onCreate(savedInstanceState);/*设置主屏布局*/setContentView(yout.main );/*新建一个AlertDialog.Builder 对象*/AlertDialog.Builder my_ADialog =new AlertDialog.Builder(this );/*设置标题*/my_ADialog.setTitle("Android 提示");/*设置显示消息*/my_ADialog.setMessage("AlertDialog.Builder 提示对话框消息!!");/*显示*/my_ADialog.show();}}同意条款CheckBox的isChecked属性①创建新工程②在string.xml中添加字符串<?xml version="1.0"encoding="utf-8"?><resources><string name="app_name">Ex_Ctrl_4</string><string name="advice">请勾选我同意</string><string name="accept">您已接受同意!!</string><string name="Notaccept">您未同意!!</string><string name="allOK">全部许可</string></resources>③修改main.xml布局,添加UI元素<?xml version="1.0"encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:layout_height="wrap_content"android:layout_width="fill_parent"android:id="@+id/TextView_Guide"android:textSize="25px"android:text="@string/advice"></TextView><TextViewandroid:layout_height="wrap_content"android:layout_width="fill_parent"android:id="@+id/TextView_youChoiceShow"android:textSize="25px"></TextView><CheckBoxandroid:layout_height="wrap_content"android:layout_marginTop="100px"android:layout_marginLeft="90px"android:id="@+id/CheckBox_Accept"android:layout_width="120px"></CheckBox> <Buttonandroid:layout_height="wrap_content"android:layout_marginLeft="90px"android:id="@+id/Button_OK"android:text="确定"android:layout_width="90px"></Button></LinearLayout>④修改mainActivity.java文件package zyf.Ex_Ctrl_4;import android.app.Activity;import android.graphics.Color;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.CheckBox;import android.widget.TextView;public class Ex_Ctrl_4extends Activity{/**Called when the activity is first created.*/private TextView showAdvice,yourChoiceshow;private CheckBox iAccept;private Button ok;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(yout.main);/*findViewById()从资源ID获取资源对象*/showAdvice=(TextView)findViewById(R.id.TextView_Guide);yourChoiceshow=(TextView)findViewById(R.id.TextView_youChoiceShow);iAccept=(CheckBox)findViewById(R.id.CheckBox_Accept);ok=(Button)findViewById(R.id.Button_OK);/*获取XML中字符串*/CharSequence titleString=getString(R.string.allOK);/*设置复选框标题*/iAccept.setHint(titleString);/*设置复选框标题字体颜色*/iAccept.setHintTextColor(Color.RED);/*将CheckBox设置成未选中*/iAccept.setChecked(false);/*将Button设置成不可选*/ok.setEnabled(false);iAccept.setOnClickListener(new CheckBox.OnClickListener(){@Overridepublic void onClick(View v){//TODO Auto-generated method stubif(iAccept.isChecked()){⑤结果ok .setEnabled(true );yourChoiceshow .setText(R.string.accept );}else {ok .setEnabled(false );yourChoiceshow .setText(R.string.Notaccept );}}});ok .setOnClickListener(new Button.OnClickListener(){@Overridepublic void onClick(View v){//TODO Auto-generated method stubif (iAccept .isChecked()){showAdvice .setText(R.string.accept );}}});}}购物列表多选项CheckBox的应用①新建工程②在string.xml中添加字符串<?xml version="1.0"encoding="utf-8"?><resources><string name="app_name">Ex_Ctrl_5</string><string name="shoopingList_TextView_text">网上购物商品清单</string><string name="yourChocieWoods_text">您选择购买的商品:</string><string name="woods_Text_MP4">纽曼MP4</string><string name="woods_Text_musicCD">Beyond乐队CD</string><string name="woods_Text_book">Android程序员指南</string></resources>③修改main.xml布局,添加UI元素<?xml version="1.0"encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:layout_height="wrap_content"android:layout_width="fill_parent"android:id="@+id/TextView_shoppingList"android:text="@string/shoopingList_TextView_text"android:textSize="25px"></TextView><CheckBoxandroid:layout_height="wrap_content"android:id="@+id/CheckBox_MP4"android:text="@string/woods_Text_MP4"android:layout_width="180px"></CheckBox><CheckBoxandroid:layout_height="wrap_content"android:text="@string/woods_Text_musicCD"android:id="@+id/CheckBox_musicCD"android:layout_width="180px"></CheckBox><CheckBoxandroid:layout_height="wrap_content"android:text="@string/woods_Text_book"android:id="@+id/CheckBox_book"android:layout_width="180px"></CheckBox><TextViewandroid:layout_height="wrap_content"android:layout_width="fill_parent"android:id="@+id/TextView_yourChoice"android:text="@string/yourChocieWoods_text"android:textSize="20px"></TextView><TextViewandroid:layout_height="wrap_content"android:id="@+id/TextView_yourWoodsList"android:layout_width="fill_parent"android:textSize="20px"></TextView></LinearLayout>④修改mainActivity.java,添加逻辑判断package zyf.Ex_Ctrl_5;import android.app.Activity;import android.os.Bundle;import android.widget.CheckBox;import poundButton;import android.widget.TextView;import poundButton.OnCheckedChangeListener;public class Ex_Ctrl_5extends Activity{/**Called when the activity is first created.*/private TextView showyourChoice_TextView;private CheckBox mp4_CheckBox,musicCD_CheckBox,book_CheckBox;private String showinfo;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(yout.main);/*findViewById()从XML中获取资源对象*/showyourChoice_TextView=(TextView) findViewById(R.id.TextView_yourWoodsList);mp4_CheckBox=(CheckBox)findViewById(R.id.CheckBox_MP4);musicCD_CheckBox=(CheckBox)findViewById(R.id.CheckBox_musicCD);book_CheckBox=(CheckBox)findViewById(R.id.CheckBox_book);/*为三个CheckBox设置选择状态改变事件监听器*/mp4_CheckBox.setOnCheckedChangeListener(CheckedChangeListener);musicCD_CheckBox.setOnCheckedChangeListener(CheckedChangeListener);book_CheckBox.setOnCheckedChangeListener(CheckedChangeListener);/*从XML中获取显示信息String*/showinfo=getString(R.string.yourChocieWoods_text);}/*内部接口实现*/private OnCheckedChangeListener CheckedChangeListener=new OnCheckedChangeListener(){@Overridepublic void onCheckedChanged(CompoundButton buttonView,boolean isChecked){//TODO Auto-generated method stub/*处理选中状态改变事件,动态显示选择结果*/if(mp4_CheckBox.isChecked()){showinfo=getString(R.string.woods_Text_MP4)+"\n";showString();}else if(musicCD_CheckBox.isChecked()){showinfo=getString(R.string.woods_Text_musicCD)+"\n";showString();}else if(book_CheckBox.isChecked()){showinfo=getString(R.string.woods_Text_book)+"\n";showString();}if(mp4_CheckBox.isChecked()&&musicCD_CheckBox.isChecked()){ showinfo=getString(R.string.woods_Text_MP4)+"\n"+getString(R.string.woods_Text_musicCD)+"\n";showString();}else if(mp4_CheckBox.isChecked()&&book_CheckBox.isChecked()){ showinfo=getString(R.string.woods_Text_MP4)+"\n"+getString(R.string.woods_Text_book)+"\n";showString();}else if(musicCD_CheckBox.isChecked()&&book_CheckBox.isChecked()){showinfo=getString(R.string.woods_Text_musicCD)+"\n"+getString(R.string.woods_Text_book)+"\n";showString();}if(mp4_CheckBox.isChecked()&&musicCD_CheckBox.isChecked()&&book_CheckBox.isChecked()){showinfo=getString(R.string.woods_Text_MP4)+"\n"⑤结果+getString(R.string.woods_Text_musicCD )+"\n"+getString(R.string.woods_Text_book )+"\n";showString();}if (mp4_CheckBox .isChecked()==false&&musicCD_CheckBox .isChecked()==false&&book_CheckBox .isChecked()==false ){showyourChoice_TextView .setText("");}}public void showString(){showyourChoice_TextView .setText(showinfo );}};}RadioButton单选RadioGroup组与onCheckedChanged事件①新建工程②string.xml中添加字符串<?xml version="1.0"encoding="utf-8"?><resources><string name="app_name">Ex_Ctrl_6</string><string name="iam_Boy">帅哥</string><string name="iamGirl">美女</string><string name="ask">请问你是??</string></resources>③修改mian.xml布局,添加UI元素<?xml version="1.0"encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/ask"android:id="@+id/TextView_Ask_And_Show"android:textSize="25px"/><RadioGroupandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:id="@+id/RadioGroup"><RadioButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/RadioButton_Boy"android:text="@string/iam_Boy"></RadioButton><RadioButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/iamGirl"android:id="@+id/RadioButton_Gril"></RadioButton></RadioGroup></LinearLayout>④修改mainActivity.java文件package zyf.Ex_Ctrl_6;import android.app.Activity;import android.os.Bundle;import android.widget.RadioButton;import android.widget.RadioGroup;import android.widget.TextView;public class Ex_Ctrl_6extends Activity{/**Called when the activity is first created.*/private TextView answer_TextView;private RadioButton boy_RadioButton,girl_RadioButton;private RadioGroup radioGroup;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(yout.main);/*findViewById()从XML中获取资源对象*/answer_TextView=(TextView)findViewById(R.id.TextView_Ask_And_Show);radioGroup=(RadioGroup)findViewById(R.id.RadioGroup);boy_RadioButton=(RadioButton)findViewById(R.id.RadioButton_Boy);girl_RadioButton=(RadioButton)findViewById(R.id.RadioButton_Gril);/*给单RadioGroup添加状态改变监听器*/radioGroup.setOnCheckedChangeListener(newRadioGroup.OnCheckedChangeListener(){@Overridepublic void onCheckedChanged(RadioGroup group,int checkedId){ //TODO Auto-generated method stubif(boy_RadioButton.isChecked()){answer_TextView.setText(R.string.iam_Boy);}else{answer_TextView.setText(R.string.iamGirl);}}});}}⑤结果RadioButton猜猜看猜猜我是??①新建项目②准备三张png图片③在string.xml中添加要使用的字符串④在main.xml中添加UI元素ic_menu_close_clear_cancel.png right.png wrong.png<?xml version="1.0"encoding="utf-8"?><resources><string name="app_name">Ex_Ctrl_6</string><string name="iam_Boy">帅哥</string><string name="iamGirl">美女</string><string name="ask">猜猜我是??</string><string name="answer_Q">回答</string><string name="clean">清空</string><string name="showAnswerTitle_YES">恭喜!</string><string name="showAnswerTitle_NO">很遗憾!</string><string name="about_dialog_ok">OK</string><string name="right">您答对了!!</string><string name="wrong">哈哈,错误!</string><string name="answerIS">正确答案是:</string></resources><?xml version="1.0"encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/ask"android:id="@+id/TextView_Ask_And_Show"android:textSize="25px"/><RadioGroupandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:id="@+id/RadioGroup"><RadioButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/RadioButton_Boy"android:text="@string/iam_Boy"></RadioButton><RadioButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/iamGirl"android:id="@+id/RadioButton_Gril"> </RadioButton></RadioGroup><LinearLayoutandroid:orientation="horizontal"android:layout_width="fill_parent"android:layout_height="wrap_content"><Buttonandroid:id="@+id/answer_The_Q_button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/answer_Q"></Button><Buttonandroid:id="@+id/clean_The_Q_button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/clean"></Button></LinearLayout></LinearLayout>⑤修改mainActivity.java文件package zyf.Ex_Ctrl_6;import java.util.Random;import android.app.Activity;import android.app.AlertDialog;import android.os.Bundle;import android.view.Menu;。
安卓UI控件详细笔记
(二)、android:inputType的可选项:
1. android:inputType="text" 默认的
在ellipsize指定marquee的情况下,设置重复滚动的次数,当设置为 marquee_forever时表示无限次。
android:focusable="true" android:focusableInTouchMode="true"
android:singleLine="true"
16、android:maxLength:限制显示的文本长度,超出部分不显示。 17、android:lines:设置文本的行数,设置两行就显示两行,即使第二行没有数据也显示。 18、android:singleLine 设置文本是否是单行显示(默认false, 超出部分会换行)。如果设置为true,则超出部 分不显示, 只显示省略号...
四、基本控件:——EditText【掌握】
API查询路径:Develop>API Guides>User Interface>Input Controls>TextFields>EditText
(一)、 EditText 类结构:
ng.Object ↳ android.view.View ↳ android.widget.TextView ↳ android.widget.EditText
android:text
android基础UI控件学习总结
android基础UI控件学习总结⼀、基本控件介绍1、Android中所有控件的顶层基类view的常⽤属性:android:id设置控件的标识符号android:layout_width设置⼦组件的布局宽度android:layout_height设置⼦组件的布局⾼度android:background设置控件的背景⾊android:onClick设置控件的单击事件绑定监听器android:visibility设置控件是否可见android:alpha设置控件透明度(0-1之间的数值)android:padding设置⼦组件的内边距android:layout_margin设置⼦组件的外边距2、⽂本控件TextView常⽤属性:android:text:⽂本的内容android:textSize:⽂字的⼤⼩android:textColor:⽂本的颜⾊3、按钮控件Button常⽤属性:android:onClick设置控件的单击事件绑定监听器4、⽂本编辑控件EditText常⽤属性:android:hint输⼊提⽰android:textColorHint提⽰的颜⾊android:textColorHighlight选中字体的背景颜⾊android:inputType设置输⼊类型5、组合案例:登⼊界⾯1)xml布局⽂件<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="50dp"android:background="#44f"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:text="**账号登录"android:textColor="#ffffff"/></RelativeLayout><EditTextandroid:id="@+id/userName"android:layout_width="match_parent"android:layout_height="wrap_content"android:ems="18"android:inputType="textPersonName"android:hint="请输⼊⽤户名"android:layout_marginTop="30dp"android:layout_marginLeft="16dp"android:layout_marginRight="16dp"/><EditTextandroid:id="@+id/password"android:layout_width="match_parent"android:layout_height="wrap_content"android:ems="18"android:inputType="textPassword"android:hint="请输⼊密码"android:layout_marginTop="30dp"android:layout_marginLeft="16dp"android:layout_marginRight="16dp"/><Buttonandroid:id="@+id/login"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="登⼊"android:layout_marginTop="30dp"android:layout_marginLeft="16dp"android:layout_marginRight="16dp"/><TextViewandroid:id="@+id/con"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="2dp"android:textSize="30sp"android:layout_marginLeft="20dp"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="v-1.0-a"android:layout_marginTop="400dp"android:layout_marginLeft="180dp"/></LinearLayout>View Code2)逻辑代码package com.me.androidstudy;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import androidx.annotation.Nullable;public class Activity_ui_1 extends Activity {EditText userName,password;Button login;TextView con;//绑定控件public void initView(){userName = findViewById(erName);password = findViewById(R.id.password);login = findViewById(R.id.login);con = findViewById(R.id.con);}@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_ui_1);initView();login.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String userName_str = userName.getText().toString();String password_str = password.getText().toString();String str = "⽤户名:"+ userName_str+"\n"+"密码:"+password_str+"\n";con.setText(str);}});}}View Code3)测试6、复选框控件CheckBoxAndroid中checkbox默认为复选框,也就是多选,实现单选的话,可以让checkbox添加监听,当已经有⼀个点击了,点击另外⼀个的时候,修改默认的状态,实现单选。
Android UI基础知识
Android UI基础知识一、Android UI组件的概述在Android应用程序开发过程中,主要就是对界面UI的设计与控制,android中的UI 元素包括:Activity、View、ViewGroup和布局。
Activity不是View但是包括View,View是常说的“组件”或者“控件”。
1、View在Andorid应用程序中,UI元素称为View,它们都继承了android.view.View类。
View 有众多的子类,包括ViewGroup、基础控件、高级控件和布局。
基础控件主要包括:Button、ImageButton、ToggleButton、TextView、RadioButton、CheckBox、ImageView、ProgressBar、SeekBar等。
2、ViewGroupandroid.view.ViewGroup类是android.view.View重要的子类,ViewGroup类通常叫做“容器”,它就是由个控件组成的复杂控件,因为它也是View类的子类,所以本身也是控件。
ViewGroup是高级控件的和布局的父类,高级控件是和布局与基础控件一样都是不指具体那个类,而是一类容器的总称。
高级控件都直接或者间接的继承了android.view.ViewGroup类,常用的高级控件主要包括:AutoCompleteTextView、Spinner、ListView、GridView、Gallery等。
3、布局管理布局是指导把各个UI元素在手机屏幕上进行布置。
常用的布局包括以下几个:1)FrameLayout(框架布局),通常也叫做帧布局。
2)LinerLayout(线性布局),让所有的UI无成为单一方向的布局。
3)AbsoluteLayout(绝对布局),让所有的UI元素准确的(x ,y)坐标值进行放置。
4)RelativeLayout(相对布局),将子元素的放置位置与其它元素的位置相关放置。
Android教程04-用户界面
浙江大学计算机学院
ContextMenu菜单
ContextMenu(右键菜单)
context menu是跟某个具体的view绑定在一起,在 activity中用registerForContextMenu来为某个view 注册context menu。context menu在显示前都会调 用onCreateContextMenu来生成menu。 onContextItemSelected用来处理选中的菜单项。
HVGA-L:480x320横屏 HVGA-P:320x480竖屏(默认) QVGA-L:320x240横屏 QVGA-P:240x320竖屏 WVGA-L:800x480横屏
浙江大学计算机学院
UI用户界面设计:Icon设计
应用程序需要各种各样的图标尺寸和定位 Launcher icons要有多样化的形状和样式,但 又要形成统一的视觉风格,其尺寸和定位也用 统一:
<menu xmlns:android="/apk/res/android"> <item android:id="@+id/save" android:title="@string/save" /> <item android:id="@+id/cancel" android:title="@string/cancel"/> </menu>
浙江大学计算机学院
Submenu
Submenu(子菜单)
一个浮动菜单列表,通过在选项菜单或上下文菜单 选择菜单项显露出来。不支持嵌套子菜单。
浙江大学计算机学院
android UI笔记
ListViewListView根据Adapter的不同分为:ArrayAdapterSimpleAdapterSimpleCursorAdapterCustomAdapter自定义AdapterArrayAdapterpublic class MainActivity extends Activity {private static final String[] songArray = { "稳稳的幸福.mp3", "稳稳的幸福0.mp3","稳稳的幸福1.mp3" };private ListView mListView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);mListView = (ListView) findViewById(R.id.mListView);ArrayAdapter<String> mAdapter = new ArrayAdapter<String>(this, yout.simple_list_item_1, songArray);mListView.setAdapter(mAdapter);mListView.setOnItemClickListener(new OnItemClickListener(){ @Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int index,long id) {Toast.makeText(MainActivity.this, songArray[index], Toast.LENGTH_SHORT).show();}});}}SimpleAdapterpublic class MainActivity extends Activity {private ArrayList companyList;private HashMap companyMap;private ListView mListView;public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);companyList = new ArrayList();companyMap = new HashMap();mListView = (ListView)findViewById(R.id.mListView);companyMap.put("image", R.drawable.ic_launcher);companyMap.put("company", "中国人力资源网");companyMap.put("product", "HR人力资源管理软件");companyList.add(companyMap);companyMap = new HashMap();companyMap.put("image", R.drawable.ic_launcher);companyMap.put("company", "深圳华为软件有限公司");companyMap.put("product", "华为CC软件和移动应用软件");companyList.add(companyMap);companyMap = new HashMap();companyMap.put("image", R.drawable.ic_launcher);companyMap.put("company", "中兴通讯南研所");companyMap.put("product", "Zsmart BOSS业务运营管理系统");companyList.add(companyMap);SimpleAdapter companyAdapter = new SimpleAdapter(this, companyList,yout.item,new String[] { "image", "company", "product"}, new int[] {R.id.iconImageView, panyTextView,R.id.productTextView });mListView.setAdapter(companyAdapter);//ListView列表选择事件mListView.setOnItemSelectedListener(newAdapterView.OnItemSelectedListener() {public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {Map infoMap = (Map) parent.getSelectedItem();Toast.makeText(MainActivity.this,"Java语言开发:" + infoMap.get("product"),Toast.LENGTH_SHORT).show();}public void onNothingSelected(AdapterView<?> parent) {}});//ListView列表单击事件mListView.setOnItemClickListener(newAdapterView.OnItemClickListener() {public void onItemClick(AdapterView<?> parent, View view,int position, long id) {Map infoMap = (Map) companyList.get(position);Toast.makeText(MainActivity.this,(String) infoMap.get("company") + "开发"+ (String) infoMap.get("product"),Toast.LENGTH_SHORT).show();}});}}SimpleCursorAdapter自定义Adapter1.定义item布局<?xml version="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><ImageViewandroid:id="@+id/iconImageView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="0"/><TextViewandroid:id="@+id/companyTextView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="5dip"android:layout_weight="1"android:singleLine="true"/><TextViewandroid:id="@+id/productTextView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="5dip"android:layout_weight="2"android:singleLine="true"/><Buttonandroid:id="@+id/delButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="5dip"android:layout_weight="0"android:text="Delete"/></LinearLayout>2.定义ListView,实例化3.定义数据List<Map>4. 定义Adaptera. CustomerAdapter extends BaseAdapterb. public CusomerAdapter(Context context,List list)c. getCount,getItem,getItemIdd. getView加载item布局 LayoutInflater将item布局构造为一个View从View中取各个view,为各个view赋值返回ViewProgressBar SeekBar RatingBar Tab Toast NotificationAlertDialog PopupWindow Menu DatePicker TimePicker Theme Style1.AlertDialog.Builder builder = new AlertDialog.Builder;2.builder.setIcon | setTitle | setMessage | setView | setItems |setSingleChicon….set…Button(String,DialogInterface.onClickListener()).create().show();托管式的DialogshowDialog(int)onCreateDialog(int){if(int = 0){new AlertDialog}}自定义Dialog:Layout(view)LayoutInfaltermyViewtoast。
《Android权威编程指南》学习笔记
第一章Android应用初体验1.android:layout_centerHorizontal= “true”水平居中对齐2.android:layout_centerVertical = “true” 垂直居中对齐3.android:layout_width和android:layout_height属性几乎每类组件都需要android:layout_width和android:layout_height属性。
它们通常被设置为以下两种属性值之一。
❑ match_parent:视图与其父视图大小相同。
❑ wrap_content:视图将根据其内容自动调整大小。
4.android:orientation属性是两个LinearLayout组件都具有的属性,决定了二者的子组件是水平放置的还是垂直放置的。
vertical:垂直放置horizontal:水平放置5.android:text属性TextView与Button组件具有android:text属性。
该属性指定组件显示的文字内容。
6.Android为整个布局文件以及各个字符串生成资源ID,但activity_quiz.xml布局文件中的组件除外,因为不是所有的组件都需要资源ID。
要为组件生成资源ID,请在定义组件时为其添加上android:id属性。
7.使用类包组织导入,就是让Eclipse依据代码来决定应该导入哪些Java或Android SDK类包。
如果之前导入的类包不再需要了,Eclipse也会自动删除它们。
通过以下组合键命令,进行类包组织导入:❑ Command+Shift+O(Mac系统);❑ Ctrl+Shift+O(Windows和Linux系统)。
8.通过调用来自Toast类的以下方法,可创建一个toast:该方法的Context参数通常是Activity的一个实例(Activity本身就是Context的子类)。
第二个参数是toast待显示字符串消息的资源ID。
android 开发核心知识点笔记
android 开发核心知识点笔记1. 引言1.1 概述:本文是关于Android开发核心知识点的笔记,旨在帮助读者系统地了解和掌握Android应用开发的基础知识。
针对大多数初学者在学习Android开发过程中所遇到的困惑和问题,作者从原理、组件、界面、数据存储、网络通信等方面进行了全面整理和总结。
1.2 文章结构:文章主要分为6个部分,每个部分都涵盖了Android开发的重要内容。
首先,在引言部分我们会提供一个概述,并介绍文章整体结构;接着,我们将从Android 开发基础知识开始讲解,包括组成部分、组件通信机制以及Activity声明周期;然后,我们会讨论用户界面开发,介绍布局文件和控件、屏幕适配和多语言支持以及用户输入和手势处理等相关知识;紧接着是数据存储与持久化方面的内容,包括Shared Preferences的使用、SQLite数据库操作以及文件操作与外部存储访问权限管理机制;随后,我们将探讨网络与通信操作,包括网络请求与网络状态监听、JSON和XML数据解析与封装发送请求数据包的原理与方式比较以及WebSocket的使用及原理;最后,在结论部分我们将对全文进行总结,重点总结主要知识点和经验心得。
1.3 目的:本文的目的是帮助读者建立起对Android开发核心知识点的全面认识,并且为初学者提供一个系统学习Android开发的指南。
通过学习本文内容,读者可以了解Android应用的组成部分、各种组件之间的通信机制、Activity生命周期管理、用户界面开发技巧、数据存储与持久化方式、网络通信操作等关键知识。
同时,我们将分享一些实际开发经验和技巧,让读者在实践中更加灵活自如地应用所学知识。
总而言之,这篇文章旨在帮助读者打下扎实的Android开发基础,为进一步深入学习和探索Android应用开发提供必要支持。
无论你是刚开始接触Android 开发还是已经有一定经验并且想要巩固和提升自己的技能,本文都将为你提供有价值的信息和参考资料。
AndroidUI界面开发详解
Spinner下拉列表控件
Spinner控件用于显示一个下拉列表,该控件在装载数据的时候需要创 建一个Adapter适配器对象。并在创建Adapter对象过程中指定要装 载的数据是数组或者是List对象的数据 实战案例之一 Spinner下拉列表控件
TabHost标签控件
如果在屏幕上要放置很多的控件,可能一个屏放不下,除了使用滚动 视图的方式外,还可以使用标签控件对屏幕进行分页显示,当单击标 签控件的不同标签时,会显示当前标签的内容,在android系统中一 个标签可以是一个View或者是Activity TabHost是标签控件的核心类,也是一个标签的集合,每一个标签是 TabHost.TabSpec对象。通过TabHost类的addTab的方法添加多个 TabHost.TabSpec对象。 实战案例之一 TabHost标签控件显示分页 实战案例之 二 TabHost标签控件显示底端菜单
使用PopupWindow
PopupWindow 可以创建类似对话框风格的窗口,使用 PopupWindow创建对话框风格的窗口只要实现两个步骤即可: 1、调用PopupWindow的构造器创建PopupWindow对象 2、调用PopupWindow的showAsDropDown(View view)方法将 PopupWindow作为view的组件的下拉组件显示出来,或者调用 PopupWindow的showAtLocation方法将PopupWindow在指定的 位置显示出来。 实战案例一: 使用PopupWindow实现对话框的提示
TimerPicker时间与日期控件
TimerPicker输入时间控件用来输入小时和分钟。 TimerPicker默认的 情况下是12小时进制,也可以设置24小时显示。 实战案例一: TimerPicker时间控件的使用
android学习----基础UI编程
WindowManager 接口
该接口用于与窗口管理器(Window Manager Service)交互。通过 Context.getSystemService(Context.WINDOW_SERVICE)可以获取到 WindowManager 的实例。
这个接口可以添加 view 到屏幕,也可以从屏幕删除 view。它面向的对象一端是屏幕,另一端就是 View 。 WindowManager 接口介绍 详见 :/s/blog_4b3c1f950100qd4d.html
关键点
requestWindowFeature 方法 它的功能是启用窗体的扩展特性。 Window 类 window 类:概括了 Android 窗口的基本属性和基本功能。 window 类 介绍:/s/blog_4b3c1f950100qd39.html youtParams 类 WindowManager 接口主要用于与 WindowManager(窗口管理服务)进行交互。 LayoutParams 是 WindowManager 接口里面的一个嵌套类,包含了一系列的布局属性。 WindowManager 接口 介绍:/s/blog_4b3c1f950100qd4d.html WindowManager(窗口管理服务)介绍:/s/blog_4b3c1f950100qe9m.html
2 标题、状态栏的隐藏
标题栏隐藏
在 Activity.setCurrentView();之前调用此方法 private void HideTitle() { // TODO Auto-generated method stub requestWindowFeature(Window.FEATURE_NO_TITLE); }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
left.png
right.png
phl 布局,添加 UI 元素 <?xml version="1.0" encoding="utf-8"?> <AbsoluteLayout
android:id="@+id/widget34" android:layout_width="fill_parent" android:layout_height ="fill_parent" xmlns:android="/apk/res/android" ><!--创建第一个ImageView (第二层图片)--> <ImageView android:id="@+id/myImageView1" android:layout_width="wrap_content" android:layout_height ="wrap_content" android:layout_x="0px" android:layout_y="36px" /> <!--创建第二个ImageView (第一层图片)--> <ImageView android:id="@+id/myImageView2" android:layout_width="wrap_content" android:layout_height ="wrap_content" android:layout_x="0px" android:layout_y="36px" /> <!--创建第一个Button --> <Button
① 新建项目,在 res 目录下新建一个 anim 文件夹,存放动画效果用,在其中新建一个 my_anim.xml 文 件 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="/apk/res/android">
R.drawable.right));
3
-----------------------------------Android 编程基础
mImageView02.setImageDrawable(getResources().getDrawable( R.drawable.photo));
/* 用OnClickListener 事件来启动 */ mButton01.setOnClickListener(new Button.OnClickListener() {
back_Imagebutton .setBackgroundResource(R.drawable. left); } } }); } }
⑤ 结果
6
-----------------------------------Android 编程基础
自定义下拉菜单
Spinner 与 setDropDownViewResource
④ 修改 mainActivity.java package zyf.Ex_Ctrl_7; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ImageView; public class Ex_Ctrl_7 extends Activity {
<translate android:fromXDelta="0" android:toXDelta="-100%p" android:duration="300">
</translate><!--位置转换动画效果 --> <alpha
android:fromAlpha="3.0" android:toAlpha="6.0" android:duration="300"> </alpha><!--透明度转换动画效果 --> </set>
//设置默认的背景图片 back_Imagebutton .setBackgroundResource(R.drawable. left); photo_Imagebutton .setBackgroundResource(R.drawable. photo); //给ImageButton设置事件监听器 photo_Imagebutton.setOnClickListener(new ImageButton.OnClickListener(){
/** Called when the activity is first created. */ /* 声明Button、ImageView 对象 */ private ImageView mImageView01; private ImageView mImageView02; private Button mButton01; private Button mButton02; @Override public void onCreate(Bundle savedInstanceState) {
android:layout_width="fill_parent"
android:layout_height ="wrap_content"
android:layout_x="0px"
android:layout_y="36px"
/> <ImageButton
设置成堆叠
android:id="@+id/myImageButton_Photo"
android:state_focused ="true"
android:layout_width="fill_parent"
android:layout_height ="wrap_content"
android:layout_x="0px"
android:layout_y="36px"
/>
</AbsoluteLayout>
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height ="fill_parent"
>
<ImageButton
android:id="@+id/myImageButton_Back"
android:state_focused ="true"
@Override public void onClick(View v) {
/* 当启动后, ImageView 立刻换背景图 */ mImageView01.setImageDrawable(getResources().getDrawable(
R.drawable.right)); } }); mButton02.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) {
mImageView01.setImageDrawable(getResources().getDrawable( R.drawable.left));
} }); } } ⑤ 结果
4
-----------------------------------Android 编程基础
ImageButton 的堆叠应用
2
-----------------------------------Android 编程基础
android:id="@+id/myButton1" android:layout_width="105px" android:layout_height ="66px" android:text="pic1" android:layout_x="9px" android:layout_y="356px" /> <!--创建第二个Button --> <Button android:id="@+id/myButton2" android:layout_width="105px" android:layout_height ="66px" android:text="pic2" android:layout_x="179px" android:layout_y="356px" /> </AbsoluteLayout>
① 新建项目 ② 准备三张 png 图片
left.png
right.png
photo.png
③ 修改 main.xml 布局,添加 UI 元素
<?xml version="1.0" encoding="utf-8"?>