第一篇:dxp控件总结
From 属性:
1.MaximizeBox:是否显示最小化按钮。2.MinimizeBox:是否显示最大化按钮。
3.FormBorderStyle:窗口样式,如FixedSingle:固定大小。4.StartPosition:初始显示的位置,CenterScreen:中心。
事件:
TreeList: 属性:
1.隐藏列头:设置OptionsView中的ShowColumns改为false 2.隐藏每行最左边的指示箭头:设置OptionsView中的ShowIndicator改为false 3.隐藏父节点的指示箭头:设置OptionsView中的ShowRoot改为false 4.selectImageList:给TreeList绑定imageCollection 5.OptionsView.ShowVertLines:是否显示网格线(竖直的)6.OptionsView.ShowHorzLines:是否显示网格线(水平的)
7.OptionsSelection.EnableAppearanceFocusedCell:选中单元格,是否改变该单元格外观(选中后该单元格有边线或不显示边线)
8.OptionsSelection.EnableAppearanceFocusedRow:选中行。是否改变该行的外观(选中后该行底色是否变化)
9.OptionsView.ShowCheckBoxes:是否在每一行前显示勾选框。
事件:
1.FocusedNodeChanged:焦点改变后触发
2.treeList_Enter:第一次点击是触发,初始化控件时候,焦点会在第一行,此时就触发。3.CustomNodeCellEdit:鼠标选中某个Cell时触发,可以实现动态的设定Cell绑定的控件类型 4.MouseDoubleClick:双击节点触发
5.FocusedColumnChanged:选中列改变时触发,即前后点击的列不一样时触发(即使前后选中列不在一行,只要选中列改变就会触发,与行无关。若前后选中列中某列的ReadOnly = ture则不会触发该事件)
6.MouseDoubleClick:鼠标双击节点时触发。7.MouseUp:鼠标点击节点弹起时触发。(e.Button可以得到曾按下的是哪个按钮)8.SelectImageClick:点击SelectImage触发 9.StateImageClick:点击StateImage触发 10.BeforeExpand:节点展开之前 11.BeforeFocusNode:焦点选中之前
DevExpress.XtraTreeList.StyleFormatConditions.StyleFormatCondition styleFormatCondition = new DevExpress.XtraTreeList.StyleFormatConditions.StyleFormatCondition();styleFormatCondition.Appearance.ForeColor = System.Drawing.Color.DarkGray;styleFormatCondition.Appearance.Options.UseForeColor = true;styleFormatCondition.ApplyToRow = true;styleFormatCondition.Condition = DevExpress.XtraGrid.FormatConditionEnum.Expression;styleFormatCondition.Expression = “[Style]”;this.treeList1.FormatConditions.Add(styleFormatCondition);
treeListColumn:TreeList中添加的列
属性:
1.表示这一列为只读:OptionsColumn中的ReadOnly = True 2.固定列的宽度不变:OptionsColumn中的FixedWidth = True 3.表示这一列不可编辑(无法实现复制):OptionsColumn中的AllowEdit = False 4.FieldName: 5.UnboundType:
6.SortOrder:列表中的项排序,SortOrder =Descending,递减排序。SortOrder = Ascending,递增排序。
treeList.AppendNode();//添加节点(TreeListNode)
TreeListNode:(TreeList中的节点)
属性: 1.ImageIndex:正常情况下节点前面显示的图片的索引
2.SelectImageIndex:选中节点时节点前边显示的图片的索引
3.StateImageIndex:节点开头显示的图片索引(在SelectImageIndex之后)4.Level:节点的级别(0:根节点、1:一级节点···)imageCollection 属性:
1.Images:在imageCollection中添加图片
ImageComboBoxEdit ComboBoxEdit 属性:
1.调整下拉菜单直观显示出来的行数(即不用滚动条就可以看的到的行数):DropDownRows 2.Properties.Items:绑定数据源
3.Properties.TextEditStyle:Standard(可输入,可选),HideTextEditor(只能通过下拉菜单选择,选中后不在界面上显示),DisableTextEditor(只能通过下拉菜单选择并且选中后在界面上显示)
4.ToolTip:
5.SelectedIndex:选择的Item的索引(get,set)
事件:
1:EditValueChanged:只要是值改变就会触发 2:SelectedIndexChanged:(值改变触发)SelectedIndex改变触发。3:SelectedValueChanged:(值改变触发)SelectedValue改变触发。
4:DrawItem:光标在下拉菜单上移动的时候触发,即光标在选择项上来回移动时触发
ComboBox(win)
属性:
1.DroppedDown:设置/获取下拉菜单是否展开。
2.SelectionStart:设置光标的位置(输入文本时用,设置为Text.Length可以保证光标在最后一个字符的后面,避免将前边的字符覆盖掉)。事件:
1.TextUpdate:输入的值时(text属性值改变时)触发。(在TextChanged事件之前)2.TextChanged:输入的值时(text属性值改变时)触发。(在TextUpdate事件之后)3.MouseDown:鼠标在控件上按下时触发。
LabelControl:
属性: 事件:
notePane:
属性:
1.MaxRow:设置notePane最大显示行数
TextEdit:单行文本输入
事件:
1.EditValueChanged:TextEdit值改变时候触发
2.Validating:焦点离开TextEdit时触发,验证有效性(有效性的标准通过自己在事件里面的代码来写,若设置了EditMask,进入该事件会先自动根据EditMask为标准来验证有效性,完成之后执行事件里面的代码)3.KeyPress:键盘按下某一个键触发。
属性:
1.TextEdit.Mask.EditMask:可以规定输入的格式,类似正则表达式
2.TextEdit.Mask.MaskType:指定可填写的文本类型(如:数字、字符串或者是根据正则表达式(RegEx)来约束···EditMask与MaskType配合使用,若MaskType= RegEx,EditMas = 某正则表达式,当MaskType是DateTime,Numeric时,EditMask为指定的相应类型)3.MaxLength:可填的最大字符长度,仅当MaskType = None时有效
4.TextEdit.Mask.BeepOnError:当用户输入不满足EdiMask要求时,是否发beep声。5.UseSystemPasswordChar: true –密码框(输入的内容在界面上是 ****)6.实现水印文字:Properties.NullValuePrompt = “输入密码”
Properties.NullValuePromptShowForEmptyValue = true;
memoEdit:多行文本输入
属性: 事件:
checkEdit:
属性:
1.Checked:是否选中
事件:
1.CheckedChanged:勾选状态改变时触发(选中变不选中,不选中变选中)
checkedListBoxControl:(实现多选框)
属性: 事件:
1.DrawItem:光标在选择菜单上移动的时候触发,即光标在选择项上来回移动时触发(与ComboBoxEdit的DrawItem事件相似)2.ItemCheck:勾选或取消勾选Item时触发。(e.Index:点击的Item的索引,e.State:改变的状态)3.方法: 1.UnCheckAll();//全部不选 2.CheckAll();//全选中
PopupContainerEdit:
属性:
1. Properties.PopupControl:(PopupContainerEdit和PopupContainerControl组合,实现下拉组合框)this.popupContainerEdit1.Properties.PopupControl = this.popupContainerControl1;
事件:
1.EditValueChanged 2.QueryResultValue PopupContainerControl:
属性: 事件:
splitContainerControl: barManager: popupMenu:
lookUpEdit:
属性:
1.Properties.DataSource:绑定数据(可以直接将list<>赋值给它)。
2.Properties.TextEditStyle:Standard(可输入),HideTextEditor(只能通过下拉菜单选择,选中后不在界面上显示),DisableTextEditor(只能通过下拉菜单选择并且选中后在界面上显示)3.事件:
panelControl:
属性:
1.BorderStyle(边框风格):NoBorder–无边框,事件:
wizardControl:
属性:
1.HeaderImage:右上角图片。2.CancelText:3.FinishText:4.NextText:5.PreviousText:
当在最后一页时中间按钮变为“结束”
事件:
1.CancelClick:点击“取消”触发。2.FinishClick:最后一页点击结束触发。3.SelectedPageChanging:切换页面时触发。(e.Direction:判断是向前翻页还是向后翻页,e.Page:新页)
4.SelectedPageChanged:切换页面后触发。(e.PrevPage:旧页)
wizardPage:(wizardControl中的每一页)
属性:
1. DescriptionText:2. Text:
事件:
1.PageValidating:验证事件。(e.Direction:判断是向前翻页还是向后翻页,e.Valid = false;翻不过去)2.simpleButton:
属性:
1.事件: buttonEdit:
属性: 事件:
dropDownButton: 属性:
1.DropDownControl:(dropDownButton控件实现下拉框)
增加2个控件barManager1。
dropDownButton 的DropDownControl属性选择popupMenu1。popupMenu1的Manager属性选择事件:
radioGroup:
属性: 事件:
spinEdit:
属性:
1.Appearance.TextOptions.HAlignment:输入的文本的位置,如:Near,近前边。,靠事件:
GridControl 事件: 1.MouseDoubleClick:双击某一行。
gridView
属性:
1.OptionsBehavior.Editable:是否可用
vGridControl 属性:
1.2.3.4.5.OptionsBehavior.Editable:是否可用
OptionsBehavior.ResizeHeaderPanel:是否可以拖拽改变每一行的高度 OptionsBehavior.ResizeRowHeaders:是否可以拖拽改变每一列的宽度。LayoutStyle:布局风格
OptionsView.AutoScaleBands:当LayoutStyle为SingleRecordViewBandsView,设置该属性为true,列宽自动填充 6.XtraTabControl 属性:
1.ClosePageButtonShowMode:如何显示每个tabPage上的关闭按钮。
如:InActiveTabPageHeader:当TabPage为当前选中时显示关闭按钮。2.HeaderLocation:标签位置(上下左右)3.ShowTabHeader:是否显示标签
4.HeaderOrientation:标签方向(Horizontal:水平,Vertical竖直)5.HeaderButtons:当tabpage过多,需要翻页时,设置翻页按钮如何组合。如
6.TabPageWidth:统设标签宽度。
事件:
1.CloseButtonClick:点击标签上的X按钮事件
XtraTabPage:
属性:
1.ShowCloseButton:是否显示关闭按钮。2.TabPageWidth:这一页的标签宽度。
第二篇:总结数位DP算法
数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满足一些条件数的个数。比如,[1,10000] 中统计不含有4的数。
所谓数位dp,字面意思就是在数位上进行dp咯。就是对数字每一位每一位递推
此类题目最基本的暴力方法:
1.for(int i=le;i<=ri;i++)
2.if(Check(i))ans++;
而数位DP就是从最低(高)位起,一位一位的放数字,然后记忆化一下,累加一下
有两种方法,一是递推,二是记忆化搜索
一,记忆化搜索:
思路来自: 数位dp总结之从入门到模板 假设题目要求是不含有62的数
状态定义:d[pos][pre] 表示当前枚举到pos位置,且pos+1位的数字是pre,此时满足题意的数字的个数(也即是pre==6时,pos该位置不能放2)还要个数组a[i]保存第i位的数字,如213,a[0]=3,注意是从右往左数
有个问题是枚举第pos位数时,此位置放数字的范围要判断一下,比如题目给出在[1,894] 枚举的时候要判断是否在894以内
比如,213,第一位放了2,那么第二位就只能放0~1,所以模板中用了个limit判断pos前的几位数字是否与n一样,true的话只能枚举0~a[pos],false就是0~9,不然比题目要求的213大了
还有个问题是前导0的问题,假如枚举5位数,你放的时候前2位都是00,那数字不变成3位了嘛,所以需要个lead保存前几位是否都是0,当然这是看题意的,有时候题目不要求,可以直接省去
好了,看模板:
1.typedef long long ll;2.int a[20];
3.ll dp[20][state];//不同题目状态不同
4.ll dfs(int pos,/*state变量*/,bool lead/*前导零*/,bool limit/*数位上界变量*/)//不是每个题都要判断前导零
5.{
6.//递归边界,既然是按位枚举,最低位是0,那么pos==-1说明这个数我枚举完了
7.if(pos==-1)return 1;/*这里一般返回1,表示你枚举的这个数是合法的,那么这里就需要你在枚举时必须每一位都要满足题目条件,也就是说当前枚举到pos位,一定要保证前面已经枚举的数位是合法的。不过具体题目不同或者写法不同的话不一定要返回1 */ 8.//第二个就是记忆化(在此前可能不同题目还能有一些剪枝)
9.if(!limit &&!lead && dp[pos][state]!=-1)return dp[pos][state];10./*常规写法都是在没有限制的条件记忆化,这里与下面记录状态是对应,具体为什么是有条件的记忆化后面会讲*/
11.int up=limit?a[pos]:9;//根据limit判断枚举的上界up;这个的例子前面用213讲过了
12.ll ans=0;13.//开始计数
14.for(int i=0;i<=up;i++)//枚举,然后把不同情况的个数加到ans就可以了
15.{
16.if()...17.else if()...18.ans+=dfs(pos-1,/*状态转移*/,lead && i==0,limit && i==a[pos])//最后两个变量传参都是这样写的
19./*这里还算比较灵活,不过做几个题就觉得这里也是套路了
20.大概就是说,我当前数位枚举的数是i,然后根据题目的约束条件分类讨论
21.去计算不同情况下的个数,还有要根据state变量来保证i的合法性,比如题目
22.要求数位上不能有62连续出现,那么就是state就是要保存前一位pre,然后分类,23.前一位如果是6那么这意味就不能是2,这里一定要保存枚举的这个数是合法*/
24.}
25.//计算完,记录状态
26.if(!limit &&!lead)dp[pos][state]=ans;
27./*这里对应上面的记忆化,在一定条件下时记录,保证一致性,当然如果约束条件不需要考虑lead,这里就是lead就完全不用考虑了*/
28.return ans;29.}
30.ll solve(ll x)31.{
32.int pos=0;
33.while(x)//把数位都分解出来
34.{
35.a[pos++]=x%10;//个人老是喜欢编号为[0,pos),看不惯的就按自己习惯来,反正注意数位边界就行
36.x/=10;37.}
38.return dfs(pos-1/*从最高位开始枚举*/,/*一系列状态 */,true,true);//刚开始最高位都是有限制并且有前导零的,显然比最高位还要高的一位视为0嘛
39.}
40.int main()41.{
42.ll le,ri;
43.while(~scanf(“%lld%lld”,&le,&ri))44.{
45.//初始化dp数组为-1,这里还有更加优美的优化,后面讲 46.printf(“%lldn”,solve(ri)-solve(le-1));47.} 48.}
注意:
那个if(!limit &&!lead &&dp[pos][state]!=-1)return dp[pos][state];limit 的数字必须要枚举,不能直接返回,每次都要算
虽然这会导致重复,但这可以解决状态冲突,而且重复计算的数字也很少 举例如下:
题目:不能出现连续的11(11、112、211都是不合法的)那么我们开始枚举:
要枚举3位数,已经枚举了两位01_,要枚举最后一位,此时状态为d[0][1] 即:在枚举个位,且前一位为1,那么显然得出d[0][1]=9 开始新的一轮枚举,枚举到11_,此时状态也是d[0][1] 因为已经有9这个值了,所以返回了,但很明显答案是0,是错的 当然可以多开一维防止状态冲突
可以看看数位DP模板题: HDU 2089 不要62 数位DP.二,递推方法
思路来自:初探数位dp
状态定义:d[i][j] 有i位数字,且第一位为j,在 0~j-1 + 000....999的符合题意的个数,如 d[4][3] 就是在 3000~3999 的符合题意的个数
还要个数组a[i]保存第i位的数字,如213,a[1]=3,注意是从右往左数(下面是从1开始数起了)
这样状态定义的能更加方便,可以预处理,因为当一个数字的第一位比题目要求的第一位小后,后面的几位能000..~999..如4269,如果第一位枚举 3 _ _ _,那么后三位可以任取
模板如下:
1.for(int i=1;i<=7;i++)//枚举位数
2.{
3.for(int j=0;j<10;j++)//枚举第i位可能出现的数
4.{
5.for(int k=0;k<10;k++)//枚举第i-1位可能出现的数
6.{
7.if(j!=4&&!(j==6&&k==2))//符合题意的条件
8.dp[i][j] += dp[i-1][k];9.} 10.} 11.}
以HDU 2089,解释怎么算出答案(不含4,62的数字)
1.#include
2.#include
4.#include
5.using namespace std;6.int d[10][10],digit[10];
7.//d[i][j] 表示有i位数字,且第一位是j的数字的 满足题意的数量
8.void init()9.{
10.d[0][0]=1;
11.for(int i=1;i<=7;i++)12.for(int j=0;j<=9;j++)13.for(int k=0;k<=9;k++)14.if(j!=4&&!(j==6&&k==2))15.d[i][j]+=d[i-1][k];16.}
17.int solve(int x)// [0,x)
18.{
19.int len=0;20.while(x){
21.digit[++len]=x%10;22.x/=10;23.}
24.digit[len+1]=0;25.int ans=0;
26.for(int i=len;i>=1;i--){
27.for(int j=0;j 28.if(j!=4&&!(j==2&&digit[i+1]==6))29.ans+=d[i][j];30.31.if(digit[i]==4||(digit[i+1]==6&&digit[i]==2))32.break;33.} 34.return ans;35.} 36.int main(int argc, char const *argv[])37.{ 38.int n,m;39.init(); 40.while(cin>>n>>m,n+m)41.cout< 42.return 0;43.} 假设一个数3229 得出 0000~0999 的个数 1000~1999 的个数 2000~2999 的个数 000~099 的个数 100~199 的个数 00~99 的个数 10~19 的个数 0~8 的个数 累加就是答案了 所以该区间是[0,n)是取不到的n的,注意计算的时候要加一个1 下面是一些题目: HDU 2089 不要62和4 HDU 3555 含49的数 HDU 3652 含13且可以被13整除 codeforces 55d A 一个数字可以被它所有非零数整除的个数 POJ 3252 Round Numbers HDU 4734 F(x)HDU 3709 Balanced Number HYSBZ 1799 self 同类分布 URAL 1057 Amount of Degrees * HDU 4507 吉哥系列故事——恨7不成妻 * 总结: 可能要用到的数位DP的题目类型: 1~10^18,求某区间(很大),有特定要求的数字的个数 如求mod,求和,可以整除各位数,不出现某些数...框架: int DFS(intpos,......)//DFS一位一位放数字,求出答案,函数的参数保存题目要求的状态 int solve(int n)//把n一位一位拆分,求出[1,n] 的符合要求的值 难点:定义好状态! 1.dp状态要找好,不要出现状态重叠现象,注意前导0有没有影响 2.题目有求和sum,可能会很大,但可以转化为保存sum对一个数求mod的值 3.有时候dp状态定义不好可能要求每次DFS都要memset一下,换换思路想想通用的状态定义,如sum从加法改为减法 iOS UITextField控件总结 //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)]; //设置边框样式,只有设置了才会显示边框样式 text.borderStyle = UITextBorderStyleRoundedRect;typedef enum { UITextBorderStyleNone,UITextBorderStyleLine,UITextBorderStyleBezel,UITextBorderStyleRoundedRect } UITextBorderStyle; //设置输入框的背景颜色,此时设置为白色 如果使用了自定义的背景图片边框会被忽略掉 text.backgroundColor = [UIColor whiteColor]; //设置背景 text.background = [UIImage imageNamed:@“dd.png”]; //设置背景 text.disabledBackground = [UIImage imageNamed:@“cc.png”]; //当输入框没有内容时,水印提示 提示内容为password text.placeholder = @“password”; //设置输入框内容的字体样式和大小 text.font = [UIFont fontWithName:@“Arial” size:20.0f]; //设置字体颜色 text.textColor = [UIColor redColor]; //输入框中是否有个叉号,在什么时候显示,用于一次性删除输入框中的内容 text.clearButtonMode = UITextFieldViewModeAlways; typedef enum { UITextFieldViewModeNever, 从不出现 UITextFieldViewModeWhileEditing, 编辑时出现 UITextFieldViewModeUnlessEditing, 除了编辑外都出现 UITextFieldViewModeAlways 一直出现 } UITextFieldViewMode; //输入框中一开始就有的文字 text.text = @“一开始就在输入框的文字”; //每输入一个字符就变成点 用语密码输入 text.secureTextEntry = YES; //是否纠错 text.autocorrectionType = UITextAutocorrectionTypeNo; typedef enum { UITextAutocorrectionTypeDefault, 默认 UITextAutocorrectionTypeNo, 不自动纠错 UITextAutocorrectionTypeYes, 自动纠错 } UITextAutocorrectionType; //再次编辑就清空 text.clearsOnBeginEditing = YES; //内容对齐方式 text.textAlignment = UITextAlignmentLeft; //内容的垂直对齐方式 UITextField继承自UIControl,此类中有一个属性contentVerticalAlignment text.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; //设置为YES时文本会自动缩小以适应文本窗口大小.默认是保持原来大小,而让长文本滚动 textFied.adjustsFontSizeToFitWidth = YES; //设置自动缩小显示的最小字体大小 text.minimumFontSize = 20; //设置键盘的样式 text.keyboardType = UIKeyboardTypeNumberPad; typedef enum { UIKeyboardTypeDefault,默认键盘,支持所有字符 UIKeyboardTypeASCIICapable, 支持ASCII的默认键盘 UIKeyboardTypeNumbersAndPunctuation, 标准电话键盘,支持+*#字符 UIKeyboardTypeURL,URL键盘,支持.com按钮 只支持URL字符 UIKeyboardTypeNumberPad,数字键盘 UIKeyboardTypePhonePad,电话键盘 UIKeyboardTypeNamePhonePad, 电话键盘,也支持输入人名 UIKeyboardTypeEmailAddress, 用于输入电子 邮件地址的键盘 UIKeyboardTypeDecimalPad,数字键盘 有数字和小数点 UIKeyboardTypeTwitter,优化的键盘,方便输入@、#字符 UIKeyboardTypeAlphabet = UIKeyboardTypeASCIICapable, } UIKeyboardType; //首字母是否大写 text.autocapitalizationType = UITextAutocapitalizationTypeNone; typedef enum { UITextAutocapitalizationTypeNone, 不自动大写 UITextAutocapitalizationTypeWords, 单词首字母大写 UITextAutocapitalizationTypeSentences, 句子的首字母大写 UITextAutocapitalizationTypeAllCharacters, 所有字母都大写 } UITextAutocapitalizationType; //return键变成什么键 text.returnKeyType =UIReturnKeyDone; typedef enum { UIReturnKeyDefault, 默认 灰色按钮,标有Return UIReturnKeyGo, 标有Go的蓝色按钮 UIReturnKeyGoogle,标有Google的蓝色按钮,用语搜索 UIReturnKeyJoin,标有Join的蓝色按钮 UIReturnKeyNext,标有Next的蓝色按钮 UIReturnKeyRoute,标有Route的蓝色按钮 UIReturnKeySearch,标有Search的蓝色按钮 UIReturnKeySend,标有Send的蓝色按钮 UIReturnKeyYahoo,标有Yahoo的蓝色按钮 UIReturnKeyYahoo,标有Yahoo的蓝色按钮 UIReturnKeyEmergencyCall, 紧急呼叫按钮 } UIReturnKeyType; //键盘外观 textView.keyboardAppearance=UIKeyboardAppearanceDefault; typedef enum { UIKeyboardAppearanceDefault,默认外观,浅灰色 UIKeyboardAppearanceAlert,深灰 石墨色 } UIReturnKeyType; //设置代理 用于实现协议 text.delegate = self; //把textfield加到视图中 [self.window addSubview:text];//最右侧加图片是以下代码 左侧类似 UIImageView *image=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@“right.png”]]; text.rightView=image; text.rightViewMode = UITextFieldViewModeAlways; typedef enum { UITextFieldViewModeNever,UITextFieldViewModeWhileEditing,UITextFieldViewModeUnlessEditing,UITextFieldViewModeAlways } UITextFieldViewMode; //按return键 键盘往下收 becomeFirstResponder 类要采用UITextFieldDelegate协议 text.delegate = self;声明text的代理是我,我会去实现把键盘往下收的方法 这个方法在UITextFieldDelegate里所以我们要采用UITextFieldDelegate这个协议 -(BOOL)textFieldShouldReturn:(UITextField *)textField { [text resignFirstResponder];//主要是[receiver resignFirstResponder]在哪调用就能把receiver对应的键盘往下收 return YES;} 重写绘制行为 除了UITextField对象的风格选项,你还可以定制化UITextField对象,为他添加许多不同的重写方法,来改变文本字段的显示行为。这些方法都会返回一个CGRect结构,制定了文本字段每个部件的边界范围。以下方法都可以重写。 – textRectForBounds: //重写来重置文字区域 – drawTextInRect: //改变绘文字属性.重写时调用super可以按默认图形属性绘制,若自己完全重写绘制函数,就不用调用super了.– placeholderRectForBounds: //重写来重置占位符区域 – drawPlaceholderInRect: //重写改变绘制占位符属性.重写时调用super可以按默认图形属性绘制,若自己完全重写绘制函数,就不用调用super了.– borderRectForBounds: //重写来重置边缘区域 – editingRectForBounds: //重写来重置编辑区域 – clearButtonRectForBounds: //重写来重置clearButton位置,改变size可能导致button的图片失真 – leftViewRectForBounds: – rightViewRectForBounds: 委托方法 -(BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ //返回一个BOOL值,指定是否循序文本字段开始编辑 return YES;} -(void)textFieldDidBeginEditing:(UITextField *)textField{ //开始编辑时触发,文本字段将成为first responder } -(BOOL)textFieldShouldEndEditing:(UITextField *)textField{ //返回BOOL值,指定是否允许文本字段结束编辑,当编辑结束,文本字段会让出first responder //要想在用户结束编辑时阻止文本字段消失,可以返回NO //这对一些文本字段必须始终保持活跃状态的程序很有用,比如即时消息 return NO;} -(BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ //当用户使用自动更正功能,把输入的文字修改为推荐的文字时,就会调用这个方法。 //这对于想要加入撤销选项的应用程序特别有用 //可以跟踪字段内所做的最后一次修改,也可以对所有编辑做日志记录,用作审计用途。 //要防止文字被改变可以返回NO //这个方法的参数中有一个NSRange对象,指明了被改变文字的位置,建议修改的文本也在其中 return YES;} -(BOOL)textFieldShouldClear:(UITextField *)textField{ //返回一个BOOL值指明是否允许根据用户请求清除内容 //可以设置在特定条件下才允许清除内容 return YES;} -(BOOL)textFieldShouldReturn:(UITextField *)textField{ //返回一个BOOL值,指明是否允许在按下回车键时结束编辑 //如果允许要调用resignFirstResponder 方法,这回导致结束编辑,而键盘会被收起[textField resignFirstResponder];//查一下resign这个单词的意思就明白这个方法了 return YES;} 通知 UITextField派生自UIControl,所以UIControl类中的通知系统在文本字段中也可以使用。除了UIControl类的标准事件,你还可以使用下列UITextField类特有的事件 UITextFieldTextDidBeginEditingNotification UITextFieldTextDidChangeNotification UITextFieldTextDidEndEditingNotification 当文本字段退出编辑模式时触发。通知的object属性存储了最终文本。因为文本字段要使用键盘输入文字,所以下面这些事件发生时,也会发送动作通知 UIKeyboardWillShowNotification //键盘显示之前发送 UIKeyboardDidShowNotification //键盘显示之后发送 UIKeyboardWillHideNotification //键盘隐藏之前发送 UIKeyboardDidHideNotification //键盘隐藏之后发送 1、Text :设置文本框的默认文本。 2、Placeholder : 可以在文本框中显示灰色的字,用于提示用户应该在这个文本框输入什么内容。当这个文本框中输入了数据时,用于提示的灰色的字将会自动消失。 3、Background : 4、Disabled : 若选中此项,用户将不能更改文本框内容。 5、接下来是三个按钮,用来设置对齐方式。 6、Border Style : 选择边界风格。 7、Clear Button : 这是一个下拉菜单,你可以选择清除按钮什么时候出现,所谓清除按钮就是出一个现在文本框右边的小 X,你可以有以下选择: 7.1 Never appears : 从不出现 7.2 Appears while editing : 编辑时出现 7.3 Appears unless editing : 7.4 Is always visible : 总是可见 8、Clear when editing begins : 若选中此项,则当开始编辑这个文本框时,文本框中之前的内容会被清除掉。比如,你现在这个文本框 A 中输入了 “What”,之后去编辑文本框 B,若再回来编辑文本框 A,则其中的 “What” 会被立即清除。 9、Text Color : 设置文本框中文本的颜色。 10、Font : 设置文本的字体与字号。 11、Min Font Size : 设置文本框可以显示的最小字体(不过我感觉没什么用) 12、Adjust To Fit : 指定当文本框尺寸减小时,文本框中的文本是否也要缩小。选择它,可以使得全部文本都可见,即使文本很长。但是这个选项要跟 Min Font Size 配合使用,文本再缩小,也不会小于设定的 Min Font Size。接下来的部分用于设置键盘如何显示。 13、Captitalization : 设置大写。下拉菜单中有四个选项: 13.1 None : 不设置大写 13.2 Words : 每个单词首字母大写,这里的单词指的是以空格分开的字符串 13.3 Sentances : 每个句子的第一个字母大写,这里的句子是以句号加空格分开的字符串 13.4 All Characters : 所以字母大写 14、Correction : 检查拼写,默认是 YES。 15、Keyboard : 选择键盘类型,比如全数字、字母和数字等。 16、Appearance: 17、Return Key : 选择返回键,可以选择 Search、Return、Done 等。 18、Auto-enable Return Key : 如选择此项,则只有至少在文本框输入一个字符后键盘的返回键才有效。 19、Secure : 当你的文本框用作密码输入框时,可以选择这个选项,此时,字符显示为星号。 1.Alignment Horizontal 水平对齐方式 2.Alignment Vertical 垂直对齐方式 3.用于返回一个BOOL值 输入框是否 Selected(选中)Enabled(可用)Highlighted(高亮) 限制只能输入特定的字符 (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ NSCharacterSet *cs; cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS]invertedSet]; NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs]componentsJoinedByString:@“"];//按cs分离出数组,数组按@”“分离出字符串 BOOL canChange = [string isEqualToString:filtered]; return canChange;} 上面那个NUMBERS是一个宏,可以在文件顶部定义: #define NUMBERS @”0123456789n”(这个代表可以输入数字和换行,请注意这个n,如果不写这个,Done按键将不会触发,如果用在SearchBar中,将会不触发Search事件,因为你自己限制不让输入n,好惨,我在项目中才发现的。)所以,如果你要限制输入英文和数字的话,就可以把这个定义为: #define kAlphaNum @”ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789″。当然,你还可以在以上方法return之前,做一提示的,比如提示用户只能输入数字之类的。如果你觉得有需要的话。 限制只能输入一定长度的字符 -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;{ //string就是此时输入的那个字符 textField就是此时正在输入的那个输入框 返回YES就是可以改变输入框的值 NO相反 if([string isEqualToString:@”n“])//按回车可以改变 { return YES; } NSString * toBeString = [textField.text stringByReplacingCharactersInRange:range withString:string];//得到输入框的内容 if(self.myTextField == textField)//判断是否时我们想要限定的那个输入框 { if([toBeString length] > 20){ //如果输入框内容大于20则弹出警告 textField.text = [toBeString substringToIndex:20]; UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:nil message:@”超过最大字数不能输入了“ delegate:nil cancelButtonTitle:@”Ok" otherButtonTitles:nil, nil] autorelease]; [alert show]; return NO; } } return YES;} 找工作,上长沙英才网 手机Android系统常用控件总结 Notepad++编写 可以负责粘贴到其中去 看得更清楚。(内容包括了Android中的大部分常用控件及其事件的监听)第一章 1.1 Android中src文件夹包含项目的所有包及其资源文件,res文件夹包含了项目中所有的资源。比如:程序图标(drawable),布局文件(layout),常量(value),音频文件(raw)R.java是在创建项目是自动生成的只读文件,不可更改此文件。R文件其作用:是定义项目中所有资源的索引文件。 1.2 AndroidManfest.xml 如下: package=“Android.Summary” //引用程序包名 android:versionCode=“1” android:versionName=“1.0”> 找工作,上长沙英才网 1.3 String.xml如下: Resources r = this.getContext().getResources();//通过Context的getResource()实例化一个Resources对象 String app_name =((String)r.getString(R.string.app_name));//然后通过getString()方法取得指定的索引的字符串。项目中所有常量都可以在String.xml文件中定义 String hello =((String)r.getString(R.string.hello)); 1.4 main.xml如下: 找工作,上长沙英才网 android:orientation=“vertical” //版面配置的方式。此为自上到下为垂直配置,“horizontal”为水平配置 android:layout_width=“fill_parent” //定义当前视图在屏幕上所占的宽度,“fill_parent”为填充整个屏幕宽度 /*android:layout_weight=“50”*/ //用于给一个布局中多个视图的重要度赋值 android:layout_height=“fill_parent” //定义当前视图在屏幕上所占的高度,...........................高度 > android:text=“@string/hello” //在视图上显示的内容,此处引用了@String中的hello字符串 /> 1.5 src下的java 如下: package Android.Summary; import android.app.Activity;import android.os.Bundle; public class SummaryActivity extends Activity { //继承自Activity /** Called when the activity is first created.*/ @Override 找工作,上长沙英才网 public void onCreate(Bundle savedInstanceState){ //重写onCreate()方法 super.onCreate(savedInstanceState);setContentView(R.layout.main);//设置要显示的布局 } } 第二章 2.1 Android应用程序由四个模块组成:Activity,Service,Intent,ContentProvider(注意:一个应用程序不一定包含全部的四个模块).在使用时必须在AandroidManfest中进行声明。 Activity可以理解为用户看到屏幕,主要用于处理应用程序的整体性工作。如: a.监听系统事件,触屏事件,为用户显示指定的View,启动其他Activity等。b.所有应用的Activity都继承于android.app.Activity,该类是Android提供的基层类。 c.一个Activity通常就是一个单独的屏幕。d.每一个活动都被实现为一个独立的类。e.大多数的应用程序都是由多个Activity组成。 Intent Aandroid中主要用Intent类实现从一个Activity跳转到另一个Activity。在Intent的描述结构中,有两个重要的部分:动作和对应的数据。 典型的动作有MAIN,VIEW,PICK,EDIT.而动作对应的数据则以URI的形式表示。例如:要查一个人的联系方式,需要创建一个动作类型View的Intent ,以及一个表示这个人的URI.Intent的使用: button1.setOnClickListener(new Button.OnClickListener(){ public void onClick(View v){ Intent intent = new Intent();//创建一个Intent对象 intent.setClass(Activity01.this,Activity02.class);//指明要启动的另一Activity02 startActivity(intent);//启动一个新的Activity 找工作,上长沙英才网 Activity01.this.finish();//关闭当前Activity01 } });这里需要注意在Android中对新启动的Activity进行声明。声明方式: IntentReceiver 如果希望Android应用能够对外部事件(如电话打入时,数据网络可用时,)做出响应,可用使用IntentReceiver.虽然IntentReceiver在如上事件发生 时会使用NotificationManager通知用户,但它并不能生产UI。IntentReceiver可以在AndroidManifest.xml中注册,也可在代码中使用Context.registerReceiver 进行注册。当IntentReceiver被触发时,系统会在需要的时候启动应用。各种应用还可以通过ContentReceiver()将他们自己的IntentReceiver广播出去。??????? Content Provider 作用:主要用于不同应用程序中的数据的传递。Content Provider 是一个特殊的存储数据的类型。Android自身提供现成的Content Provider:Contacts ,Browser,CallLog,Settings,MediaStore 应用可用通过唯一的ContentResolver界面来使用具体的Conten Provider,然后可以用ContentResolver提供的方法来使用你需要的Content Provider 其中,ContentResolver提供的方法有query(),insert(),update()等。URI----String形式的Content Provider的完整路径。 下面这个这个例子通过ContentProvider获取电话本中的数据,然后显示到TextView中去。 public class Activity01 extends Activity{ public void onCreate(Bundle savedInstanceState){ 找工作,上长沙英才网 TextView textView = new TextView(this);//得到TextView对象 String string = “";super.onCreate(savedInstanceState); ContentResolver resolver = getContentResolver();//得到ContentResolver对象 Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);//取得电话本中开始一项的光标,通过query方法查询出符合标准的电话本记录 //向下移动光标 while(cursor.moveToNext()){ //取得联系人名字 int name_index = cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME);String name = cursor.getString(name_index);//取得电话号码 int number_index = cursor.getColumnIndex(PhoneLookup.NUMBER);String number = cursor.getString(number_index); string +=(name+”:“+number+”n“);} cursor.close();textView.setText(string);//设置TextView显示的内容 setContentView(textView);//显示到屏幕上 其实TextView也是View的一种 } } 注意:在使用这些模块中用到了读取联系人的API,所以必须在AndroidManifest.xml中声明 声明方式为: 找工作,上长沙英才网 Service 后台服务,没有界面 启动service方法: a.Context.startService()b.Context.bindService()//与上一种方法不同处 如果这个Service没有处于启动状态,则将其启动 下面这个例子以Activity中的俩个控件来控制播放一首Mp3.(例中:需要在res文件夹中创建一个raw文件夹 然后放入一首MP3) public class Activity01 extends Activity{ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.main); //从main.xml布局中获得Button对象 Button button_start =(Button)findViewById(R.id.start);Button button_stop =(Button)findViewById(R.id.stop);//设置按钮(Button)监听 button_start.setOnClickListener(start);button_stop.setOnClickListener(stop);} //开始按钮 private OnClickListener start = new OnClickListener(){ public void onClick(View v){ //开启Service startService(new Intent(”com.yarin.Android.MUSIC“));} };//停止按钮 找工作,上长沙英才网 private OnClickListener stop = new OnClickListener(){ public void onClick(View v){ //停止Service stopService(new Intent(”com.yarin.Android.MUSIC“));} };} public class MusicService extends Service{ //MediaPlayer对象 private MediaPlayer player; public IBinder onBind(Intent arg0){ return null;} public void onStart(Intent intent, int startId){ super.onStart(intent, startId);//这里可以理解为装载音乐文件 player = MediaPlayer.create(this, R.raw.test);//开始播放 player.start();} public void onDestroy(){ super.onDestroy();//停止音乐-停止Service player.stop();} } AndroidManifest.xml文件中 找工作,上长沙英才网 2.2 Aandrod的生命周期 public class Activity02 extends Activity{ private static final String TAG = ”Activity02“; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.main2);Log.v(TAG, ”onCreate“);} public void onStart(){ super.onStart();Log.v(TAG, ”onStart“);} public void onResume(){ super.onResume();Log.v(TAG, ”onResume“);} public void onPause(){ super.onPause();Log.v(TAG, ”onPause“);} public void onStop(){ super.onStop();Log.v(TAG, ”onStop“); 找工作,上长沙英才网 } public void onDestroy(){ super.onDestroy();Log.v(TAG, ”onDestroy“);} public void onRestart(){ super.onRestart();Log.v(TAG, ”onReStart“);} } 这些方法都是系统自动调用的。 第三章 3.1 事件处理 * 控件事件通过设置其控件的监听器来监听并处理事件 * 按键按下事件:通过重写onKeyDown方法 * 按键弹起事件:通过重写onKeyUp方法 * 触笔点击事件:通过实现onTouchEvent方法 * 示例中使用了Toast控件: * Toast.makeText(this, string, Toast.LENGTH_SHORT).show(); public class Activity01 extends Activity{ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.main);//获得Button对象 Button button_ok =(Button)findViewById(R.id.ok); 找工作,上长沙英才网 button_ok.setOnClickListener(new Button.OnClickListener(){------------------------//设置Button控件监听器 public void onClick(View v){ //这里处理事件 DisplayToast(”点击了OK按钮“);} });} /* 按键按下所触发的事件*/ public boolean onKeyDown(int keyCode, KeyEvent event){ switch(keyCode){ case KeyEvent.KEYCODE_DPAD_CENTER: DisplayToast(”按下:中键“);break;case KeyEvent.KEYCODE_DPAD_UP: DisplayToast(”按下:上方向键“);break;case KeyEvent.KEYCODE_DPAD_DOWN: DisplayToast(”按下:下方向键“);break;case KeyEvent.KEYCODE_DPAD_LEFT: DisplayToast(”按下:左方向键“);break;case KeyEvent.KEYCODE_DPAD_RIGHT: DisplayToast(”按下:右方向键“);break;} return super.onKeyDown(keyCode, event);} 找工作,上长沙英才网 /* 按键弹起所触发的事件*/ public boolean onKeyUp(int keyCode, KeyEvent event){ switch(keyCode){ case KeyEvent.KEYCODE_DPAD_CENTER: DisplayToast(”弹起:中键“);break;case KeyEvent.KEYCODE_DPAD_UP: DisplayToast(”弹起:上方向键“);break;case KeyEvent.KEYCODE_DPAD_DOWN: DisplayToast(”弹起:下方向键“);break;case KeyEvent.KEYCODE_DPAD_LEFT: DisplayToast(”弹起:左方向键“);break;case KeyEvent.KEYCODE_DPAD_RIGHT: DisplayToast(”弹起:右方向键“);break;} return super.onKeyUp(keyCode, event);} //用于响应按键重复点击,官方API指出onKeyMultiple方法总是返回false,即它没有handle,因此必须重写才能实现-------------------此方法没用过具体情况怎么样不是很清楚? public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event){ return super.onKeyMultiple(keyCode, repeatCount, event);} /* 触笔事件*/ 找工作,上长沙英才网 public boolean onTouchEvent(MotionEvent event){ int iAction = event.getAction();//利用getAction得到所执行的动作 if(iAction == MotionEvent.ACTION_CANCEL || iAction == MotionEvent.ACTION_DOWN || iAction == MotionEvent.ACTION_MOVE){ return false;} //得到触笔点击的位置 int x =(int)event.getX();int y =(int)event.getY();//将获得的坐标转成String类型的方法 DisplayToast(”触笔点击坐标:(“+Integer.toString(x)+”,“+Integer.toString(y)+”)“); return super.onTouchEvent(event);} /* 显示Toast */ public void DisplayToast(String str){ Toast.makeText(this, str, Toast.LENGTH_SHORT).show();} } 我们分析了一些常用事件处理方式。每一个键都对应一个键值。当然也可根据需要来改变一些键的功能,需要我们自己构建KeyEvent对象------------------有待进一步学习 构造KeyEvent对象的几种方法: KeyEvent(int action,int code);KeyEvent(long DownTime,long EventTime,int action,int code,int repeat);KeyEvent(long DownTime,long EventTime,int action,int code,int repeat,int metState); 找工作,上长沙英才网 KeyEvent(long DownTime,long EventTime,int action,int code,int repeat,int metState,int device,int scancode);KeyEvent(long DownTime,long EventTime,int action,int code,int repeat,int metState,int device,int scancode,int flags);KeyEvent(KeyEvent origEvent,long EventTime,int newRepart);例: public class Activity01 extends Activity{ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.main);} public boolean onKeyDown(int keyCode, KeyEvent event){ //这里构建KeyEvent对象,其功能为返回键的功能 //因此我们按任意键都会执行返回键功能 KeyEvent key = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK); //这里传入的参数就是我们自己构建的KeyEvent对象key return super.onKeyDown(key.getKeyCode(), key);} } 3.2 常用控件 Button xml设计 代码设计Button button = new Button(this); 找工作,上长沙英才网 button.setText(”我是Button“);button.setWidth(123);//设置宽度 button.setHeight(123);//设置高度 button.setTextColor(Color.BLUE);//设置文字颜色 button.setTextSize(123);//设置字体大小 button.setBackgroundColor(Color.BLUE);//设置控件背景色 监听器 button.setOnClickListener(new Button.OnClickListener(){//设置按钮的事件监听 public void onClick(View v){ //处理按钮事件产生一个Toast.利用button.getText()得到按钮显示的内容 Toast toast = Toast.makeText(Activity01.this, ”你点击了““+button.getText()+””按钮!“, Toast.LENGTH_LONG);//设置toast显示的位置 toast.setGravity(Gravity.TOP, 0, 150);//显示该Toast toast.show();} });-TextView 一个用来显示文本的控件 xml设计 找工作,上长沙英才网 android:text=”你好“/> android:paddingLeft=”50px“ android:paddingTop=”5px“ android:paddingBottom=”5px“ android:textSize=”30sp“ android:singleLine=”true“ android:layout_below=”@id/imageView_handler“//在什么下 android:gravity =”left“ //用于设置View中内容相对于View组件的对齐方式,android:layout_gravity//用于设置View组件相对于Container的对齐方式。 android:paddingLeft=”30px“ // 按钮上设置的内容离按钮左边边界30个像素 android:layout_marginLeft=”30px“ //整个按钮离左边设置的内容30个像素 android:layout_weight=”1“//控件权重 即占的比例 默认值为0 android:gravity=”center_horizontal“//水平居中 android:padding=”3dip“ 代码设计TextView textView = new TextView(this);//声明对象 textView.setTextColor(Color.RED);//设置字体颜色 textView.setTextSize(20);//设置字体大小 textView.setBackgroundColor(Color.BLUE);//控件背景色 textView.setText(”你好“)//显示的文字 textView.setHeight textView.setWidth textView.setVisibility(GONE/VISIBLE);//设置为不可见/可见 textView.setGravity(Gravity.CENTER);//设置文字权重 找工作,上长沙英才网 监听器TextView textView = new TextView(this);//得到对象 textview.setOnClickListener(new TextView.OnClickListener(){------------TextView监听器 public void onClick(View v){ } });---ImageButton 带图标的按钮 xml设计 代码中设计 imageButton.setImageDrawable(getResources().getDrawable(R.drawable.image2));//在代码中设计使用的图片(得到对象后) 监听器 imageButton.setOnClickListener(new Button.OnClickListener(){--------------ImageButton监听器 @Override public void onClick(View v){ //创建对话框 Dialog dialog = new AlertDialog.Builder(ImageButton_Dialog.this) 找工作,上长沙英才网 .setTitle(”ImageButton2“).setMessage(”跳转到系统图片“).setPositiveButton(”确定“, new DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which){ // TODO Auto-generated method stub imageButton2.setImageDrawable(getResources().getDrawable(android.R.drawable.sym_action_call));} }).create();dialog.show();} });---EditText xml设计 代码设计EditText editText = new EditText(this);//得到EditText对象 editText.setTextSize(20);//设置字体大小 找工作,上长沙英才网 editText.setHint(”请输入账号“);//设置当m_EditText中为空时提示的内容 监听器 editText.setOnKeyListener(new EditText.OnKeyListener(){----------EditText监听器 @Override public boolean onKey(View arg0, int arg1, KeyEvent arg2){ // 得到文字,将其显示到TextView中 m_TextView.setText(”文本框中内容是:“ + m_EditText.getText().toString());return false;} });--------------------CheckBox 多项选择 需要对没有按钮设置监听器 xml设计 checkBox1.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener(){//对每个选项设置事件监听-------------------CheckBox监听器 @Override 找工作,上长沙英才网 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked){ if(m_CheckBox1.isChecked()){ DisplayToast(”你选择了:“+m_CheckBox1.getText());} } });----------------------Spinner 下拉列表 下面一个例子将可选内容通过ArrayAdapter和下拉列表连接起来。设置监听器 通过setVisibility方法设置当前显示项 main.xml 找工作,上长沙英才网 /> public class Activity01 extends Activity{ private static final String[] string = { ”O型“, ”A型“, ”B型“, ”AB型“, ”其他“ }; private TextView m_TextView;private Spinner m_Spinner;private ArrayAdapter @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.main); m_TextView =(TextView)findViewById(R.id.TextView1);m_Spinner =(Spinner)findViewById(R.id.Spinner1); //将可选内容与ArrayAdapter连接 adapter = new ArrayAdapter //设置下拉列表的风格 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); //将adapter添加到m_Spinner中 m_Spinner.setAdapter(adapter); //添加Spinner事件监听 找工作,上长沙英才网 m_Spinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){--------------------------Spinner监听器 @Override public void onItemSelected(AdapterView> arg0, View arg1, int arg2, long arg3){ m_TextView.setText(”你的血型是:“ + string[arg2]);//设置显示当前选择的项 arg0.setVisibility(View.VISIBLE);} @Override public void onNothingSelected(AdapterView> arg0){ // TODO Auto-generated method stub });} } }---------RadioGroup , RadioButton 单选选择控件 一个单选选择由两部分组成,分别是前面的选择按钮和后面的内容。按钮通过RadioButton来实现,答案通过RadioGroup来实现 如果确定是选择哪一项那就要设置监听器setOnCheckedChangeListener.下面有一例子:本例中使用到了String.xml文件来定义常量。string.xml 找工作,上长沙英才网 main.xml 找工作,上长沙英才网 android:layout_width=”wrap_content“ android:layout_height=”wrap_content“ android:text=”@string/RadioButton1“ /> public class Activity01 extends Activity{ TextView m_TextView;RadioGroup m_RadioGroup;RadioButton m_Radio1, m_Radio2, m_Radio3, m_Radio4; @Override 找工作,上长沙英才网 public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.main); m_RadioGroup =(RadioGroup)findViewById(R.id.RadioGroup01);//获得RadioGroup对象 m_Radio1 =(RadioButton)findViewById(R.id.RadioButton1);//获得4个RadioButton对象 m_Radio2 =(RadioButton)findViewById(R.id.RadioButton2);m_Radio3 =(RadioButton)findViewById(R.id.RadioButton3);m_Radio4 =(RadioButton)findViewById(R.id.RadioButton4); /* 设置事件监听 */ m_RadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener(){---------------------------RadioGroup监听器 @Override public void onCheckedChanged(RadioGroup group, int checkedId){ if(checkedId == m_Radio2.getId()){ DisplayToast(”正确答案:“ + m_Radio2.getText()+ ”,恭喜你,回答正确!“);}else{ DisplayToast(”请注意,回答错误!“);} } });} public void DisplayToast(String str)//显示Toast{ Toast toast = Toast.makeText(this, str, Toast.LENGTH_LONG);//设置toast显示的位置 找工作,上长沙英才网 toast.setGravity(Gravity.TOP, 0, 220);//显示该Toast toast.show();} }--------------AutoCompletTextView 和MultiAutoCompleteTextView 作用:自动提示 下面例中用到了ArrayAdapter autoCompletTextView.xml //如何实现如果输入的字符不在其范围内的也能得到提示 是继承TextWatcher? 找工作,上长沙英才网 public class Control_Auto extends Activity { //implements TextWatcher{} public TextView textView_auto; private static final String[] string ={”ni hao“,”ni hao “,”ni hao ma“,”ni zheng de hao ma“,”nshis“}; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.autocompletetextview); //将可选内容与适配器ArrayAdapter连接 ArrayAdapter MultiAutoCompleteTextView multiAutoCompletTextView =(MultiAutoCompleteTextView)findViewById(R.id.multiAutoCompleteTextView);AutoCompleteTextView autoCompleteTextView =(AutoCompleteTextView)findViewById(R.id.autoCompleteTextView); autoCompleteTextView.setAdapter(adapter);//将adapter添加到AutoCompletTextView中去 multiAutoCompletTextView.setAdapter(adapter);//将adapter添加到MultAutoCompleteTextView中去 multiAutoCompletTextView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());} } 找工作,上长沙英才网 /* //autoCompleteTextView.addTextChangedListener(this);---此为设置监听? * 例子中没有涉及到的属性(可在布局文件中设置): AutoCompleteTextView是EditText的子类,所以你可以对它的对象进行诸如外观/字体/颜色等属性值的设置。 completionThreshold:它的值决定了你在AutoCompleteTextView至少输入几个字符,它才会具有自动提示的功能。另,默认最多提示20条。 dropDownAnchor:它的值是一个View的ID,指定后,AutoCompleteTextView会在这个View下弹出自动提示。 dropDownSelector:应该是设置自动提示的背景色之类的。 dropDownWidth:设置自动提示列表的宽度。 你可以通过setAdapter()来给AutoCompleteTextView添加一个包含候选值列表的适配器(adapter)。--------此处没实现过? 然而,由于用户可以输入一些不在候选值列表的数据,AutoCompleteTextView不支 持selection listener。不过,你可以注册一个TextWacther用于当用户输入文本发生变化时发出通知。 -------------------------DatePicker,TimePicker 日期和时间 下例中首先需要在布局文件中定义DatePicker和TimePicker,然后通过Canlendar类获得系统时间,接着通过init方法将日期传给DatePicker, 并设置OnDateChangedListener来监听日期改变,当时间被改变时需要设置setOnTimeChangedListener监听来设置时间。datepicker_timepicker.xml 找工作,上长沙英才网 > 找工作,上长沙英才网 public class Date_Time extends Activity{//如何实现日期随系统不断变化?要联网才能实现?如何变换DatePicker和TimePicker样式(如颜色,图片等)? Calendar calendar;TextView textView_date_time;Button button_date_time1;Button button_date_time2;DatePicker datePicker;TimePicker timePicker;public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.datepicker_timepicker);calendar = Calendar.getInstance();//得到日历对象 textView_date_time =(TextView)findViewById(R.id.textView_date_time1);button_date_time1 =(Button)findViewById(R.id.button_date_time1);button_date_time2 =(Button)findViewById(R.id.button_date_time2);datePicker =(DatePicker)findViewById(R.id.datePicker);timePicker =(TimePicker)findViewById(R.id.timerPicker); button_date_time1.setWidth(50);button_date_time1.setHeight(60);button_date_time1.setTextColor(Color.BLUE); timePicker.setIs24HourView(true);//设置为24小时制 //将日历初始化为当前系统日期,并设置监听器 datePicker.init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),-------------DatePicker监听器 找工作,上长沙英才网 calendar.get(Calendar.DAY_OF_MONTH), new DatePicker.OnDateChangedListener(){//OnDateChangedListener监听日期的变化 @Override public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth){ //设置日期 calendar.set(1987,10,15);} }); timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener(){------------TimePicker监听器 @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute){ //设置时间 //calendar.set(1987,10,29,23,23,23);//年 月 日 小时 分钟 秒 textView_date_time.setText(”当前时间:“+hourOfDay+” : “+minute);} }); button_date_time1.setOnClickListener(new Button.OnClickListener(){//日期的监听---------------------------Button控件中设置DatePicker监听器 找工作,上长沙英才网 @Override public void onClick(View v){ new DatePickerDialog(Date_Time.this,new DatePickerDialog.OnDateSetListener(){ @Override public void onDateSet(DatePicker view, int year, int monthOfYear,int dayOfMonth){ //设置日历 textView_date_time.setText(”农历“+year+” 年“+monthOfYear+” 月“+dayOfMonth+” 日“);} },calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH)).show();} }); button_date_time2.setOnClickListener(new Button.OnClickListener(){//时间的监听器----------------------------Button控件中设置TimePicker监听器 @Override public void onClick(View v){new TimePickerDialog(Date_Time.this, new TimePickerDialog.OnTimeSetListener(){ @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute){ //设置时间 找工作,上长沙英才网 textView_date_time.setText(”北京时间:“+hourOfDay+” : “+minute);} },calendar.get(Calendar.HOUR_OF_DAY),calendar.get(Calendar.MINUTE),true).show();}});} } ---------------Menu 操作应用程序的菜单选项 第一个例子:通过XML文件来实现 menu_com.xml public class Menu_Xml extends Activity{ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.此为所以显示的界面id);} public boolean onCreateOptionsMenu(Menu menu){//创建menu MenuInflater inflater = getMenuInflater();//设置menu界面 inflater.inflate(R.layout.menu_com, menu); 找工作,上长沙英才网 return true;} public boolean onOptionsItemSelected(MenuItem item){//处理菜单事件 switch(item.getItemId()){ case R.id.about: Menu_Xml.this.finish();case R.id.skip: Intent intent = new Intent();intent.setClass(Menu_Xml.this, Menu_add.class);//跳转到Menu_add中去 startActivity(intent);Menu_Xml.this.finish();} return true;} } =============== 第二个例子:在代码中生成Menu 此例中包含俩个方法 注意区分注释掉的为另一种增加Menu的方法 public class Menu_add extends Activity{ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.toast);} public boolean onCreateOptionsMenu(Menu menu){//创立menu /*为Menu添加内容参数:Menu.add()方法第一个参数表示给这个新增的菜单项分配一个分组号; * 第二个参数表示给这个新增的菜单项分配一个唯一标识id;第三个参数为菜单项的序号; 找工作,上长沙英才网 * 第四个参数为菜单项的标题。 我们可以通过调用Menu.setItemShown()或者Menu.setGroupShown()方法来显示或隐藏一些菜单项。 这里要注意的一个地方是:菜单项的显示顺序是按代码中添加的顺序来的,也就是说Menu.add()方法 只能在菜单的最后面新增一个菜单项。另外,第一个参数的分组标识,不会改变菜单项的显示顺序。 方法一: //menu.add(0,0,0,R.string.menu1);方法一 //menu.add(0,1,1,R.string.menu2);方法二: SubMenu subMenu = menu.addSubMenu(1, 1, 2, ”选项“);//此方法和menu方法类似 subMenu.add(13,13,13, ”到Content_Menu“);subMenu.add(13,24,24,”到Menu_Xml“); return true;} public boolean onOptionsItemSelected(MenuItem item){//处理Menu事件 switch(item.getItemId()){//getItemId()得到菜单项的ID,即上面的第二个参数 case 13: Intent intent1 = new Intent();intent1.setClass(Menu_add.this, Context_Menu.class);startActivity(intent1);Menu_add.this.finish();case 23: Intent intent = new Intent();intent.setClass(Menu_add.this, Menu_Xml.class);//跳转到其他界面中去 找工作,上长沙英才网 startActivity(intent);Menu_add.this.finish();break;} return true;} } ============== 第三个例子:Context Menu的创建: 概述:Android 的上下文菜单类似于PC 上的右键菜单。当为一个视图注册了上下文菜单之后,长按(2 秒左右)这个视图对象就会弹出一个浮动菜单,即上下文菜单。任何视图都可以 注册上下文菜单,不过,最常见的是用于列表视图ListView的item。 注意:Android 的上下文菜单不支持图标或快捷键。 创建一个上下文菜单的步骤: 1.覆盖Activity 的onCreateContenxtMenu()方法,调用Menu 的add 方法添加菜单项(MenuItem)。 2.覆盖Activity 的onContextItemSelected()方法,响应上下文菜单菜单项的单击事件。 3.调用registerForContextMenu()方法,为视图注册上下文菜单。menu_com2.xml 找工作,上长沙英才网 public class Context_Menu extends Activity{ public TextView textView_context_Menu;public Button buttont_context_Menu; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.menu_com2);textView_context_Menu =(TextView)findViewById(R.id.textView_context_Menu);buttont_context_Menu =(Button)findViewById(R.id.button_context_Menu); registerForContextMenu(textView_context_Menu);registerForContextMenu(buttont_context_Menu);//这里的registerForContextMenu()也可以用下面的语句替代 //getContentView().setOnCreateContextMenuListener(this);} 找工作,上长沙英才网 //创建Context Menu public void onCreateContextMenu(ContextMenu menu,View v,ContextMenuInfo menuInfo){ if(v==textView_context_Menu){ menu.setHeaderTitle(”这个是什么?“);menu.add(0,0,0,”苹果“);menu.add(0,1,1,”猕猴桃“);}else if(v==buttont_context_Menu){ menu.setHeaderTitle(”我知道是什么了!“);menu.add(2,2,2,”不是苹果“);menu.add(2,3,3,”就是猕猴桃“);} super.onCreateContextMenu(menu, v, menuInfo);} //菜单单击响应 @Override public boolean onContextItemSelected(MenuItem item){ //获取当前被选择的菜单项的信息 switch(item.getItemId()){ case 1: Toast toast=Toast.makeText(Context_Menu.this, ”你点击了“+textView_context_Menu.getText(), Toast.LENGTH_LONG);toast.setGravity(Gravity.TOP, 100, 300);toast.show();break;case 3: Toast toast1=Toast.makeText(Context_Menu.this, ”你点击了“+buttont_context_Menu.getText(), Toast.LENGTH_LONG);toast1.setGravity(Gravity.TOP, 100, 300);toast1.show();break; 找工作,上长沙英才网 } return true;} } ============== 第四个例子:动态Menu 此为动态Menu的实现,采用的是代码布局(非XML布局)。此种Memu用在什么情况下,具体该怎么做? public class Trends_Menu extends Activity{ LinearLayout linearLayout;TextView textView;public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);linearLayout = new LinearLayout(this);linearLayout.setBackgroundColor(android.graphics.Color.BLUE);//设置背景色 linearLayout.setOrientation(linearLayout.VERTICAL);//设置布局方向 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);textView= new TextView(this);//创建TextView对象 textView.setBackgroundColor(Color.YELLOW);//设置背景颜色 textView.setText(”Trends_Men“);textView.setTextSize(50);//textView.setHeight(50);//textView.setWidth(100);textView.setTextColor(Color.RED);//设置字体颜色 找工作,上长沙英才网 linearLayout.addView(textView,params);//将textView添加到linearLayout中去 setContentView(linearLayout);//设置ui布局 } public boolean onPrepareOptionsMenu(Menu menu){ String string = textView.getText().toString();if(string.equals(”Trends_Menu“)){ menu.clear();//清掉菜单 MenuItem item = menu.add(0,1,1,”to Menu“);item.setIcon(android.R.drawable.alert_dark_frame);//android自带的图标 } if(string.equals(”Menu“)){ menu.clear();MenuItem item = menu.add(1,2,2,”to Trends_Menu“);item.setIcon(android.R.drawable.alert_light_frame);} menu.add(0,2,2,”Now is“+string);return super.onPrepareOptionsMenu(menu);} } -------------ListView 一个用来显示列表的控件 xml设计 代码设计 第一个例子: public class ListView3 extends ListActivity{ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); 找工作,上长沙英才网 String[] string={”华中科技“,”天龙大厦“,”科技园“,”天天乐园“};//string 是用来要存放的数据 //android.R.layout.simple_expandable_list_item_1为XML的配置文件, 用来设置列表中每一行的窗口 setListAdapter(new ArrayAdapter * 在配置文件中要注意的是android:list 是系统自定义的不是随便可以取的,否则会出现找不到ListView ==================== 第二个例子: textView_chrild.xml 找工作,上长沙英才网 android:layout_height=”fill_parent“ android:paddingLeft=”50px“ android:paddingTop=”5px“ android:paddingBottom=”5px“ android:text=”no date“ android:textSize=”30sp“ /> 找工作,上长沙英才网 找工作,上长沙英才网 map1.put(”list1“, ”map1“);map2.put(”list1“, ”map2“);list1.add(map1);list1.add(map2);//定义一个List,该List对象为第一个一级条目 提供数据 List //定义一个List,该List对象用来存储所有二级条目对象 List SimpleExpandableListAdapter simple = new SimpleExpandableListAdapter(找工作,上长沙英才网 this,//context list1,//一级条目数据 R.layout.expandable_group,//用来设置一级条目样式的布局文件 new String[]{”list1“}, //指定一级条目数据的Key new int[]{R.id.textView_group},//指定一级条目数据显示的控件id list0, //二级条目数据 R.layout.expandable_chrild,//用来设置二级条目样式的布局文件 new String[]{”list“}, //指定二级条目数据的Key new int[]{R.id.textView_chrild});//指定二级条目数据显示的控件id setListAdapter(simple);//将SimpleExpandableListAdapter对象设置给当前的Activity } } ============================= 第三个例子:自定义ListView public class ImageTextView extends LinearLayout{ public TextView textView;public ImageView imageView; public ImageTextView(Context context, String string,Drawable drawable){----* 注意这里并没用在xml定义控件 super(context);// TODO Auto-generated constructor stub this.setOrientation(VERTICAL);//设置为水平布局 imageView = new ImageView(context);imageView.setImageDrawable(drawable);imageView.setPadding(2, 5, 5, 0);//设置位置 addView(imageView,new LinearLayout.LayoutParams(40,30)); 找工作,上长沙英才网 textView = new TextView(context);textView.setText(”title“);textView.setTextSize(20);addView(textView,new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,30)); textView = new TextView(context);textView.setText(”title“);textView.setTextSize(20);addView(textView,new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,30));} * 这是一个线性布局的View,其中包含一个TextView 和一个ImageView.* 且为垂直布局 }-----------------------public class ListCombinAdapter extends BaseAdapter{------------继承BaseAdapter 且必须重写五个函数 private Context wcontext;private List public ListCombinAdapter(Context context){ this.wcontext=context;list = new ArrayList 找工作,上长沙英才网 } @Override public Object getItem(int position){ return list.get(position);//得到对象在List数组中的位置 } @Override public long getItemId(int position){ return(long)position;} public long getPosition(Object item){ return list.indexOf(item);//得到对象在list中的索引 } @Override public View getView(int position, View convertView, ViewGroup parent){//得到一个显示在屏幕上的View ImageTextView imageTextView;if(convertView == null){//判断原来的View是否存在 如果不存在利用ImageTextView创建一个View imageTextView = new ImageTextView(wcontext,(String)list.get(position).textView.getText(),list.get(position).imageView.getDrawable());}else{ imageTextView =(ImageTextView)convertView;//强制转型 imageTextView.textView = list.get(position).textView;imageTextView.imageView = list.get(position).imageView;} return imageTextView;} public void addItem(String text,Drawable drawable){ list.add(new ImageTextView(wcontext,text,drawable));//将创建好的ImageTextView对象加入到list中去 找工作,上长沙英才网 } }----------------------public class ListView4Activity extends ListActivity {//定制自己的adapter @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);//setContentView(R.layout.main);//不需要此项 ListCombinAdapter listCombinAdapter = new ListCombinAdapter(this);listCombinAdapter.addItem(”不知道此处的字符串起什么作用“,getResources().getDrawable(R.drawable.image2));listCombinAdapter.addItem(”不知道此处的字符串起什么作用“, getResources().getDrawable(R.drawable.image3));setListAdapter(listCombinAdapter);} } ===================== 第四个例子: simpleadapter2.xml 找工作,上长沙英才网 android:orientation=”horizontal“> 找工作,上长沙英才网 android:gravity=”right“ android:textSize=”10pt“ /> public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);ArrayList DP优化 学习小结 2010-08-27 15:55 这两天简单学习了一些动态规划的优化技巧,感觉自己的数学实在太弱了,虽然大概知道怎么用,但很多证明自己理解的还不是很透。 关于用单调队列优化的动态规划以前整理过一些,可以看这里:【单调队列 学习小结】 四边形不等式优化 主要是对于dp(i,j)的决策点 s(i,j),通过单调性证明 s(i,jpo[p2].y)/(po[p1].xsum[arr[head]]);po[i].x = a * sum[i]; po[i].y = dp[i] + a * sum[i] * sum[i]po[p2].y)/(po[p1].xf[p2]f[p2]f[arr[head]]f[arr[head]]sum[p2]p2); } inlinelonglong SS(int p1, int p2){ return num[p1 +1]sum[p1] + p1 * num[p1 +1]sum[p2] + p2 * num[p2 +1]); } inlinebool rate(int p1, int p2, int p3){ if(GG(p1, p2)* SS(p2, p3)>= GG(p2, p3)* SS(p1, p2))returnfalse;elsereturntrue; } int main(int argc, char** argv){ while(scanf(“%d%d”, &n, &m)!= EOF){ for(int i =1;i <= n;i++)num[i] = next_int(); sort(num +1, num + n +1); sum[0] =0; for(int i =1;i <= n;i++)sum[i] = sum[i-1] + num[i];dp[0] =0; int head =0, rear =0; arr[++rear] =0; for(int i = m;i <= n;i++){ for(int k = head +1;k <= rear;k++){ if(cal(i, arr[k])<= cal(i, arr[head]))head +=1;elsebreak; } dp[i] = cal(i, arr[head]); if(im +1; while(head +2<= rear){ if(rate(arr[rear-2], arr[rear-1], arr[rear])==false){arr[rear-1] = arr[rear]; rear-=1; } elsebreak; } } cout << dp[n] << endl; } return(EXIT_SUCCESS); }第三篇:iOS UITextField控件总结
第四篇:手机Android系统常用控件总结
>> list0 = new ArrayList
>>();list0.add(list21);list0.add(list31);
第五篇:DP优化 学习小结