首页 文章 精选 留言 我的

精选列表

搜索[金融专有云开发测试平台],共10000篇文章
优秀的个人博客,低调大师

iOS开发-多线程NSOperation和NSOperationQueue

上一篇文章稍微提及了一下NSThread的使用,NSThread能直观地控制线程对象,不过需要自己管理线程的生命周期,线程同步,用起来比较繁琐,而且比较容易出错。不过Apple给出了自己的解决方案NSOperation,它本身是抽象基类,因此必须使用它的子类,使用NSOperation子类的方式有NSInvocationOperation和NSBlockOperation两种方式,先补充一下NSThread的用法: NSThread获取当前线程: 1 [ NSThread currentThread] performSelectorInBackground可以更新UI,不建议使用: 1 2 3 4 5 - ( IBAction )update:( id )sender { [ self performSelectorInBackground: @selector (changeImage) withObject: nil ]; } 图片背景更新: 1 2 3 4 -( void )changeImage{ NSLog (@ "线程执行完之后更新图片" ); self .myImageView.image=[UIImage imageNamed:[ NSString stringWithFormat:@ "Thread2.jpg" ]]; } NSInvocationOperation和NSBlockOperation 这两种方式都很简单,其中NSInvocation的调用方式类似于NSThread,NSBlockOperation如果对Block有一点了解就可以,如果不明白的可以参考本人之前的Block文章Object-C-代码块Block回顾,那么接下来的使用方式就很简单: 先来看下NSInvocationOperation的实例化方式: 1 2 3 4 //初始化 NSInvocationOperation *myInvocationOperation= [[ NSInvocationOperation alloc] initWithTarget: self selector: @selector (operationTaskMethod) object: nil ]; //启动 [myInvocationOperation start]; 调用方法: 1 2 3 4 -( void )operationTaskMethod{ NSLog (@ "NSInvocationOperation初始化执行" ); } NSBlockOperation的方式: 1 2 3 4 NSBlockOperation *blockOperation=[ NSBlockOperation blockOperationWithBlock:^{ NSLog (@ "BlockOperation块执行" ); }]; [blockOperation start]; 两种方式很方便,这个时候可以使用NSOperationQueue作为一个队列将线程包含在一起,首先定义一个NSOperationQuene: 1 @property (strong, nonatomic ) NSOperationQueue *myOperationQuene; 这个时候需要调用: 1 2 3 4 5 6 7 8 9 10 11 NSInvocationOperation *myInvocationOperation= [[ NSInvocationOperation alloc] initWithTarget: self selector: @selector (operationTaskMethod) object: nil ]; NSBlockOperation *blockOperation=[ NSBlockOperation blockOperationWithBlock:^{ NSLog (@ "BlockOperation块执行" ); }]; self .myOperationQuene=[[ NSOperationQueue alloc]init]; [ self .myOperationQuene addOperation:myInvocationOperation]; [ self .myOperationQuene addOperation:blockOperation]; 上面最后的结果不确定,线程执行的顺序没法确定,如果想确定的按照顺序执行,需要添加一个依赖: 1 [blockOperation addDependency:myInvocationOperation]; 添加依赖之后的,每次输出的结果一定是这样的: 1 2 2015-02-11 07:56:13.457 ThreadDemo[657:15033] NSInvocationOperation 初始化执行 2015-02-11 07:56:13.457 ThreadDemo[657:15034] BlockOperation块执行 自定义NSOperation 每次一看到自定义,就感觉瞬间有了档次,然后参考一下前人的经验,不过网上的博客有的不好说,那感觉就是我想吃一个鸡腿,却拿到了一个鸡腿堡,需要的不需要的都要自己一起吸收。NSInvocationOperation和NSBlockOperation这两种方式不能满足业务需求,这个时候需要自定义的NSOperation,自定义的有两种分为非并发(NonConcurrent)和并发(Concurrent)两种形式,本文介绍非并发形式。 新建一个继承自NSOperation的MyCustomOperation,然后实现一下main方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 // // MyCustomOperation.h // ThreadDemo // // Created by keso on 15/2/11. // Copyright (c) 2015年 keso. All rights reserved. // #import <Foundation/Foundation.h> @interface MyCustomOperation : NSOperation @property (strong, nonatomic ) NSString *customdata; -( void )initData:( NSString *)data; @end NSOperation对象需要定期地调用isCancelled方法检测操作是否已经被取消,如果返回YES(表示已取消),则立即退出执行回收内存资源。所有NSOperation子类,一般用于代码比较容易终止的地方,在循环的每次迭代过程中,如果每个迭代相对较长可能需要调用多次和没有执行工作之前调用。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 // // MyCustomOperation.m // ThreadDemo // // Created by keso on 15/2/10. // Copyright (c) 2015年 keso. All rights reserved. // #import "MyCustomOperation.h" @implementation MyCustomOperation - ( void )initData:( NSString *)data{ if ( self ==[ super init]) _customdata= data; } - ( void )main { @try { BOOL isDone = NO ; NSLog (@ "循环之前的调用" ); while (![ self isCancelled] && !isDone) { // Do some work and set isDone to YES when finished NSLog (@ "已经运行成功了" ); isDone= YES ; } } @catch (...) { NSLog (@ "出现异常,请检查代码~" ); } } @end 如果需要调用定义的NSOPeration实例化之后Start即可: 1 2 MyCustomOperation *customOperation=[[MyCustomOperation alloc] init]; [customOperation start]; 本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4285102.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

iOS开发-搜索栏UISearchBar和UISearchController

iOS中UISearchDisplayController用于搜索,搜索栏的重要性我们就不说了,狼厂就是靠搜索起家的,现在越来越像一匹没有节操的狼,UC浏览器搜索栏现在默认自家的神马搜索,现在不管是社交,O2O还是在线教育等都会有一个搜索栏的实现,不过彼此实现效果是不一样的。iOS中的搜索栏实现起来相对简单一点,网上也有很多参考资料,不过靠谱的不是很多,很多都是iOS 8.0之前的实现,iOS 8.0上的实现貌似很少看到,可以运行,不过会看到searchDisplayController' is deprecated: first deprecated in iOS 8.0警告,看了一些老外的代码,使用了一下UISearchController感觉还是非常不错的。 UISearchBar和UISearchDisplayController 是网上最常见的也算是最简单的,也有使用Searh Bar Search Display Controller的控件的,本文就简单的使用Search Bar和UITableView实现搜索Demo的,最上面的就是搜索栏,之前的就是TableView: 为了实现搜索需要声明委托UISearchBarDelegate,UISearchDisplayDelegate,其中搜索主要使用的就是UISearchDisplayDelegate,具体代码实现过程: 声明字段: 1 2 3 @property (strong, nonatomic ) NSMutableArray *dataList; @property (strong, nonatomic ) NSMutableArray *searchList; 初始化数据: 1 2 3 4 5 self .dataList=[ NSMutableArray arrayWithCapacity:100]; for ( NSInteger i=0; i<100; i++) { [ self .dataList addObject:[ NSString stringWithFormat:@ "%ld-FlyElephant" ,( long )i]]; } 设置区域: 1 2 3 4 //设置区域 -( NSInteger )numberOfSectionsInTableView:(UITableView *)tableView{ return 1; } 设置区域的行数(重点),这个就是使用委托之后需要需要判断是一下是否是需要使用Search之后的视图: 1 2 3 4 5 6 7 -( NSInteger )tableView:(UITableView *)tableView numberOfRowsInSection:( NSInteger )section{ if (tableView == self .searchDisplayController.searchResultsTableView) { return [ self .searchList count]; } else { return [ self .dataList count]; } } 同样的返回单元格也有两种情况,一种是初始化数据,一种是过滤之后的数据视图: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:( NSIndexPath *)indexPath{ static NSString *flag=@ "cellFlag" ; UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:flag]; if (cell== nil ) { cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:flag]; } if (tableView== self .searchDisplayController.searchResultsTableView) { [cell.textLabel setText: self .searchList[indexPath.row]]; } else { [cell.textLabel setText: self .dataList[indexPath.row]]; } return cell; } UISearchBarDelegate中的开始和结束的事件: 1 2 3 4 5 6 7 8 9 - ( BOOL )searchBarShouldBeginEditing:(UISearchBar *)searchBar{ NSLog (@ "搜索Begin" ); return YES ; } - ( BOOL )searchBarShouldEndEditing:(UISearchBar *)searchBar{ NSLog (@ "搜索End" ); return YES ; } 搜索时过滤数据: 1 2 3 4 5 6 7 8 9 10 11 12 - ( BOOL )searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:( NSString *)searchString{ // 谓词的包含语法,之前文章介绍过http://www.cnblogs.com/xiaofeixiang/ NSPredicate *preicate = [ NSPredicate predicateWithFormat:@ "SELF CONTAINS[c] %@" , searchString]; if ( self .searchList!= nil ) { [ self .searchList removeAllObjects]; } //过滤数据 self .searchList= [ NSMutableArray arrayWithArray:[_dataList filteredArrayUsingPredicate:preicate]]; //刷新表格 return YES ; } 最终效果如下: UISearchController实现搜索 UISeachBar通过UISearchDisplayDelegate实现上面的效果是没有问题的,网上也有很多类似的实现效果,不过是警告的,信息如下: 'searchDisplayController' is deprecated: first deprecated in iOS 8.0,这么明显一个警告总不能视而不见吧,在StackOverFlow中发现UISearchDisplayController is deprecatedinIOS8.0, and recommended to use UISearchController instead,也就是说iOS8.0不推荐UISearchDisplayController,也就是不推荐使用UISearchDisplayDelegate,但是可以通过UISearchController实现UISearchResultsUpdating这个委托实现上面的效果; 视图中中需要声明UISearchResultsUpdating: 1 2 3 4 @interface ViewController : UITableViewController<UITableViewDelegate,UITableViewDataSource,UISearchBarDelegate,UISearchResultsUpdating> @end 属性声明: 1 @property ( nonatomic , strong) UISearchController *searchController; 需要自己初始化一下UISearchController: 1 2 3 4 5 6 7 8 9 10 11 _searchController = [[UISearchController alloc] initWithSearchResultsController: nil ]; _searchController.searchResultsUpdater = self ; _searchController.dimsBackgroundDuringPresentation = NO ; _searchController.hidesNavigationBarDuringPresentation = NO ; _searchController.searchBar.frame = CGRectMake( self .searchController.searchBar.frame.origin.x, self .searchController.searchBar.frame.origin.y, self .searchController.searchBar.frame.size.width, 44.0); self .tableView.tableHeaderView = self .searchController.searchBar; 之前是通过判断搜索时候的TableView,不过现在直接使用self.searchController.active进行判断即可,也就是UISearchController的active属性: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 //设置区域的行数 -( NSInteger )tableView:(UITableView *)tableView numberOfRowsInSection:( NSInteger )section{ if ( self .searchController.active) { return [ self .searchList count]; } else { return [ self .dataList count]; } } //返回单元格内容 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:( NSIndexPath *)indexPath{ static NSString *flag=@ "cellFlag" ; UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:flag]; if (cell== nil ) { cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:flag]; } if ( self .searchController.active) { [cell.textLabel setText: self .searchList[indexPath.row]]; } else { [cell.textLabel setText: self .dataList[indexPath.row]]; } return cell; } 具体调用的时候使用的方法也发生了改变,这个时候使用updateSearchResultsForSearchController进行结果过滤: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 -( void )updateSearchResultsForSearchController:(UISearchController *)searchController { NSString *searchString = [ self .searchController.searchBar text]; NSPredicate *preicate = [ NSPredicate predicateWithFormat:@ "SELF CONTAINS[c] %@" , searchString]; if ( self .searchList!= nil ) { [ self .searchList removeAllObjects]; } //过滤数据 self .searchList= [ NSMutableArray arrayWithArray:[_dataList filteredArrayUsingPredicate:preicate]]; //刷新表格 [ self .tableView reloadData]; } 效果演示: 本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4273620.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

eclipse上Android NDK开发环境搭建

首先要有已集成好Android adt插件的eclipse,如果没有,到http://developer.android.com/sdk/index.html下载已集成ADT的eclipse。 下载Android NDK包http://developer.android.com/tools/sdk/ndk/index.html并解压。 打开eclipse,点击菜单栏 Windows ---> Preferences---> Android ---> NDK 找到上一步解压的NDK,点击OK 保存。 新建一个Android项目ndktest,并在工程下新建jni文件夹。 在编写native函数,例在com.example.ndktest下创建类 myjni。 运行cmd,定位到ndktest根目录下,运行命令javah -classpath bin\classes -d jni com.example.ndktest.myjni 会在jni文件下生成一个h头文件。 如果点开有报错,可以忽略它,可能因为找不到jni.h这个头文件,先不管。 在jni文件夹下编写com_example_ndktest_myjni.c文件实现方法getSum。 在jni文件夹下编写android.mk文件 在package Explorer 里,右键工程 ----> Properties 选择Program ---> OKOK 保存。 libmyjni.so 动态库已生成libs\armeabi文件夹下。 后面附上HTK中工具HCopy的Android 动态库工程的源码,下载导入工程后,确保已经安装好NDK,并修改第9步,第二图中的NDK_Builder的location到你的NDK包下的cmd即可。 上述例子工程源码:http://down.51cto.com/data/1499353 HCopy动态库工程源码:http://down.51cto.com/data/1499346 本文转自 ponpon_ 51CTO博客,原文链接:http://blog.51cto.com/liuxp0827/1438625,如需转载请自行联系原作者

优秀的个人博客,低调大师

ios开发使用UIWebView显示多种文档

使用UIWebView显示多种文档 除了HTML的内容,UIWebView还可以显示多种类型的文档 包括以下的类型 ·Excel (.xls) ·Keynote (.key.zip) ·Numbers (.numbers.zip) ·Pages (.pages.zip) ·PDF (.pdf) ·Powerpoint (.ppt) ·Word (.doc) ·Rich Text Format (.rtf) ·Rich Text Format Directory (.rtfd.zip) ·Keynote '09 (.key) ·Numbers '09 (.numbers) ·Pages '09 (.pages) 其中的rtfd必须是文档包的格式并且时zip压缩,同时调用时还应该保留文件后缀名rtfd.zip 使用时参照 -(void)loadDocument:(NSString*)documentName inView:(UIWebView*)webView { NSString *path = [[NSBundle mainBundle] pathForResource:documentName ofType:nil]; NSURL *url = [NSURL fileURLWithPath:path]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [webView loadRequest:request]; } // Calling -loadDocument:inView: [self loadDocument:@"mydocument.rtfd.zip" inView:self.myWebview]; 本文转自 arthurchen 51CTO博客,原文链接:http://blog.51cto.com/arthurchen/801318,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android开发应用实例:ListView的应用

该程序完成如下功能:1在ListView中显示多个学生的名字。2点击ListView中的条目,查询并显示该学生的年龄、性别、照片等信息。 效果图: student.java packagecom.lingdududu.listview; publicclassStudent{ publicStringsname; publicStringssex; publicintsage; Student(Stringname,Stringsex,intage){ sname=name; ssex=sex; sage=age; } voidStuedent(Stringname){ sname=name; } publicStringgetName(){ returnsname; } publicStringgetSex(){ returnssex; } publicintgetAge(){ returnsage; } publicStringtoString(){ returnsname; } //这个方法返回学生的姓名,性别,年龄 publicStringgetStuIfo(){ return("姓名:"+sname+"\n性别:"+ssex+"\n年龄:"+sage); } } ListViewActivity.java packagecom.lingdududu.listview; importjava.util.ArrayList; importandroid.app.Activity; importandroid.app.AlertDialog; importandroid.content.DialogInterface; importandroid.os.Bundle; importandroid.view.View; importandroid.widget.AdapterView; importandroid.widget.AdapterView.OnItemClickListener; importandroid.widget.ArrayAdapter; importandroid.widget.ListView; /* *@authorlingdududu *该程序的主要功能是点击ListView的学生姓名,就能弹出对话框 *在对话框里面显示学生的详细信息:图片,姓名,性别,年龄 */ publicclassListViewActivityextendsActivity{ privateListViewlv; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); //学生图片的ID数组 finalint[]stu_pic={ R.drawable.pic1, R.drawable.pic2, R.drawable.pic3, R.drawable.pic4, R.drawable.pic5, R.drawable.pic6}; finalAlertDialog.Builderbuilder=newAlertDialog.Builder(this); lv=(ListView)findViewById(R.id.list); /*生成动态数组,加入数据*/ finalArrayList<Student>students=newArrayList<Student>(); students.add(newStudent("小张","女",21)); students.add(newStudent("小明","男",22)); students.add(newStudent("小王","男",23)); students.add(newStudent("小丽","女",21)); students.add(newStudent("小红","女",22)); students.add(newStudent("小周","男",23)); ArrayAdapter<Student>adapter=newArrayAdapter<Student> (this,//布局文件 android.R.layout.simple_list_item_1,//android.R.layout.simple_list_item_1,系统定义的布局文件 students);//数据来源 //为ListView设置适配器 lv.setAdapter(adapter); lv.setOnItemClickListener(newOnItemClickListener(){ //arg0发生点击动作的AdapterView //arg1在AdapterView中被点击的视图(它是由adapter提供的一个视图) //arg2视图在adapter中的位置 //arg3被点击元素的行id publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intarg2, longarg3){ //将学生的详细信息在对话框里面显示 builder.setMessage(students.get(arg2).getStuIfo()) //显示学生的图片 .setIcon(stu_pic[arg2]) .setTitle("你好,这是我的详细信息!") .setPositiveButton("确定",newDialogInterface.OnClickListener(){ publicvoidonClick(DialogInterfacedialog,intwhich){ } }); //创建对话框 AlertDialogad=builder.create(); //显示对话框 ad.show(); } }); } } main.xml <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> 附件:http://down.51cto.com/data/2359281 本文转自 lingdududu 51CTO博客,原文链接: http://blog.51cto.com/liangruijun/716529

优秀的个人博客,低调大师

【移动开发】Android中各种xml汇总

Android中xml使用十分广泛,这里简单汇总一下,使其更加系统化! 1.arrays.xml 定义数组 1 2 3 4 5 6 7 <resources> <string-array name= "newstitle" > <item>国际</item> <item>国内</item> <item>军事</item> </string-array> </resources> 2.colors.xml 定义颜色 1 2 3 4 5 6 7 8 9 10 11 <resources> <color name= "blue_sky" >#A0C8FF</color> <color name= "vert_manu" >#CCFF00</color> <color name= "black" ># 000000 </color> <color name= "white" >#FFFFFF</color> <color name= "red" >#FF0000</color> <color name= "link_color" >#FF0066CC</color> <color name= "simiple_button_color" >#FFF</color> <color name= "blue" >#0000FF</color> <color name= "grey" >#FFCBD2D8</color> </resources> 3.dimens.xml 定义尺寸 1 2 3 4 5 <resources> <dimen name= "bottom_tab_font_size" >12dp</dimen> <dimen name= "bottom_tab_padding_up" >5dp</dimen> <dimen name= "bottom_tab_padding_drawable" >8dp</dimen> </resources> 4.drawables.xml 定义画布 1 2 3 4 5 6 7 <resources> <item type= "drawable" name= "shader1" >#7f7f7f7f</item> <item type= "drawable" name= "highlight" >#cf7f7f7f</item> <item type= "drawable" name= "barbg" >#ef0a4267</item> <item type= "drawable" name= "trans" ># 00000000 </item> <item type= "drawable" name= "chatdivider" >#ffd6dadc</item> </resources> 5.strings.xml 定义字符串 1 2 3 4 5 <resources> <string name= "app_name" >Beem</string> <string name= "OkButton" >Ok</string> <string name= "ClearButton" >Clear</string> </resources> 6.styles.xml 定义样式 1 2 3 4 5 6 7 8 9 <resources> <style name= "Label" > <item name= "android:textSize" >18sp</item> <item name= "android:textStyle" >bold</item> <item name= "android:typeface" >sans</item> <item name= "android:focusable" > false </item> <item name= "android:padding" >12dip</item> </style> </resources> 7.selector选择(按下效果) phoinix_popumenu_style.xml 1 2 3 4 5 <selector xmlns:android= "http://schemas.android.com/apk/res/android" > <item android:state_focused= "true" android:state_pressed= "true" android:drawable= "@drawable/phoinix_pushmail_btn_selected" /> <item android:state_focused= "false" android:state_pressed= "true" android:drawable= "@drawable/phoinix_pushmail_btn_selected" /> <item android:state_focused= "true" android:drawable= "@drawable/phoinix_small_selected" /> </selector> 8.menu 菜单 1 2 3 4 5 6 7 8 9 10 11 12 13 <menu xmlns:android= "http://schemas.android.com/apk/res/android" > <group> <item android:id= "@+id/chat_menu_contacts_list" android:visible= "true" android:title= "@string/chat_menu_contacts_list" android:icon= "@drawable/ic_menu_friendslist" /> <item android:id= "@+id/chat_menu_change_chat" android:visible= "true" android:title= "@string/chat_menu_change_chat" android:icon= "@drawable/ic_menu_chat_dashboard" /> </group> <item android:id= "@+id/chat_menu_close_chat" android:visible= "true" android:title= "@string/chat_menu_close_chat" android:icon= "@drawable/ic_menu_end_conversation" /> </menu> 8.anim 旋转动画 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 < set xmlns:android= "http://schemas.android.com/apk/res/android" > <rotate android:interpolator= "@android:anim/accelerate_decelerate_interpolator" android:fromDegrees= "0" android:toDegrees= "+360" android:duration= "3000" /> <!-- rotate 旋转动画效果 属性:interpolator 指定一个动画的插入器,用来控制动画的速度变化 fromDegrees 属性为动画起始时物件的角度 toDegrees 属性为动画结束时物件旋转的角度,+代表顺时针 duration 属性为动画持续时间,以毫秒为单位 --> </ set > 以上这些就是android中常用的xml,至于其他的自行查阅喽~ 本文转自zhf651555765 51CTO博客,原文链接:http://blog.51cto.com/smallwoniu/1248892,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android开发学习笔记:圆角的Button

在res目录下的drawable-mdpi建立xml文件shape.xml,如下图所示: shape.xml <?xmlversion="1.0"encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <!--填充的颜色--> <solidandroid:color="#FFFFFF"/> <!--设置按钮的四个角为弧形--> <!--android:radius弧形的半径--> <cornersandroid:radius="5dip"/> <!--padding:Button里面的文字与Button边界的间隔--> <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> </shape> main.xml 在android:background="@drawable/shape"就使用了shape.xml资源 <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/roundButton" android:text="圆角按钮" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/shape" /> </LinearLayout> strings.xml <?xmlversion="1.0"encoding="utf-8"?> <resources> <stringname="hello">HelloWorld,RoundButtonDemoActivity!</string> <stringname="app_name">RoundButtonDemo</string> </resources> RoundButtonDemoActivity.java packagecom.android.RoundButtonDemo.activity; importandroid.app.Activity; importandroid.os.Bundle; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.widget.Toast; publicclassRoundButtonDemoActivityextendsActivity{ ButtonroundButton; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); roundButton=(Button)findViewById(R.id.roundButton); //使用匿名类注册Button事件 roundButton.setOnClickListener(newOnClickListener() { publicvoidonClick(Viewv) { Toast.makeText(RoundButtonDemoActivity.this,"你点击了圆角按钮",Toast.LENGTH_LONG).show(); } }); } } 效果图: 本文转自 lingdududu 51CTO博客,原文链接:http://blog.51cto.com/liangruijun/630051

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册