当前位置:  编程技术>移动开发
本页文章导读:
    ▪Interface Builder的应用        Interface Builder的使用 最近在看电驴上down下来的ipad开发视频教程。为加深记忆,特在此做笔记。 前两集视频主要讲的是UIAlertView(相当于windows里面的MessageBox) 在interface builder里面添加了控件.........
    ▪ 失去用户的首选语言(转载)        得到用户的首选语言(转载) NSUserDefaults* defs = [NSUserDefaults standardUserDefautls]; //得到用户缺省值   NSArray* languages = [defs objectForKey:@"AppleLanguages"]; //在缺省值中找到AppleLanguages, 返回值是一个数组 .........
    ▪ App Widget的更新方法引见       App Widget的更新方法介绍 Widget是一种小巧但是功能强大的程序,使用户能够方便快捷的获取信息,在PC上被广泛的使用,现在随着OPhone的推出,widget也进入到了手机领域,为用户带来了方便.........

[1]Interface Builder的应用
    来源: 互联网  发布时间: 2014-02-18
Interface Builder的使用

最近在看电驴上down下来的ipad开发视频教程。为加深记忆,特在此做笔记。

前两集视频主要讲的是UIAlertView(相当于windows里面的MessageBox)

在interface builder里面添加了控件之后,要想使得控件响应事件必须做如下处理:

1:在XXXViewController.h里面添加事件响应函数声明如:

  -(IBAction)btnOnclick:(id)sender;

2:在相应的.m文件中实现这个函数

3:回到interface builder中鼠标右键从需要使用这个事件相应函数的控件拖拽到File's Owner上并在弹出的选项中选中步骤1中的函数名,使之关联起来。

注意:这个视频里面提到了一个特别的控件就是UIAlertView,因为这个控件没有在interface builder中提供出来编辑。所以如果这个要使这个控件的事件得到相应需要在XXXViewController.h文件里面声明类的时候使用协议(类似C++里面的抽象基类的多重继承)。样子如下:

#import <UIKit/UIKit.h>

@interface AlertViewTestViewController : UIViewController <UIAlertViewDelegate>{

}

@end

然后在实现文件里面实现对应的事件处理函数。对UIAlertView来说。要使用的协议是UIAlertViewDelegate,要实现的事件响应函数是 - (void)alertView:(UIAlertView* )alertView clickedButtonAtIndex:(NSInteger)buttonIndex。实际上,使用了协议之后,可以根据协议名字在帮助里面很快的找到这个协议需要实现哪些函数。

控件还有另外一个比较重要的东西就是数据绑定。在xcode里面要实现这么一个东西步骤基本和上面的类似

1:在XXXViewController.h文件里面声明之,下面声明了一个文本数据

@interface OutletAndActionViewController : UIViewController {
    
    IBOutlet UITextField *txtName;

}

@property(nonatomic, retain) UITextField *txtName;

@end

2:实现文件里面给出set和get函数。如果使用了属性,你懂的。。。

@synthesize txtName;

3:回到interface builder中鼠标右键从File's Owner中拖拽到需要绑定这个数据的控件上并在弹出的选项中选中,使之关联起来。拖拽方向和上面相反。

写到这里。我在想IBAction和IBOutlet到底是个啥?

在头文件中找到了他们的定义:

#ifndef IBOutlet 
#define IBOutlet 
#endif

#ifndef IBAction 
#define IBAction void 
#endif

。几乎啥都没干。。最后在cocoachina上找到了答案。

原帖:http://www.cocoachina.com/bbs/read.php?tid-18829.html

内容如下:

These two keywords do absolutely nothing as far as the compiler is concerned. IBOutlet gets entirely removed from the code before the compiler ever sees it. IBAction resolves to a void return type, which just means that action methods do not return a value. So, what’s going on here?
The answer is simple, really: IBOutlet and IBAction are not used by the compiler. They are used by Interface Builder. Interface Builder uses these keywords to parse out the outlets and actions available to it. Interface Builder can only see methods that are prefaced with IBAction and can only see variables or properties that are prefaced with IBOutlet. Also, the presence of these keywords tells other programmers, looking at your code in the future, that the variables and methods in question aren’t dealt with entirely in code. They’ll need to delve into the relevant nib file to see how things are hooked up and used.

敢情这两关键字完全是给interface builder看的。

1 楼 matao_ct 2011-11-01  
求视频链接...
本人初学,在IB的使用上遇到不少的麻烦..尤其是涉及到各种controller的情况

    
[2] 失去用户的首选语言(转载)
    来源: 互联网  发布时间: 2014-02-18
得到用户的首选语言(转载)

NSUserDefaults* defs = [NSUserDefaults standardUserDefautls];
//得到用户缺省值
 
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
//在缺省值中找到AppleLanguages, 返回值是一个数组
 
NSString* preferredLang = [languages objectAtIndex:0];
//在得到的数组中的第一个项就是用户的首选语言了


    
[3] App Widget的更新方法引见
    来源: 互联网  发布时间: 2014-02-18
App Widget的更新方法介绍
Widget是一种小巧但是功能强大的程序,使用户能够方便快捷的获取信息,在PC上被广泛的使用,现在随着OPhone的推出,widget也进入到了手机领域,为用户带来了方便的同时也为开发者实现更多很酷想法的可能。在OPhone中有两种widget开发方式,一种是以HTML+CSS+JavaScript的开发方式,另一种是沿用Android平台的开发方式,本文介绍的是后面一种,在OPhone平台上开发App widget。

widget一般开发方式介绍
下面以编写一个时钟的小程序来介绍如何编写widget。

(1)创建一个类,让其继承类AppWidgetProvider,在AppWidgetProvider类中有许多的方法,例如onDelete(Context, int[]),onEnable(Context)等等,一般情况下我们纸需要重写onUpdate(Context, AppWidgetManager, int[])这个方法就可以了,这个方法是当触发器更新widget时候执行的操作。

(2)在项目的AndroidMenifest.xml文件中添加一个receiver标签,让其指向前面创建的AppWidgetProvider子类,内容如下:
01.<receiver android:name="widget" 
02.    android:label="@string/app_name" 
03.    android:icon="@drawable/icon"> 
04.      <intent-filter> 
05.         <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />   
06.     </intent-filter> 
07.         <meta-data android:name="android.appwidget.provider"   
08.               android:resource="@xml/widget_setting" />   
09.    </receiver> 


intent-filter中过滤了APPWIDGET_UPDATE事件,这个事件是由系统触发的更新事件,每个widget必须包含这个事件;meta-data标签描述的是widget的配置文件指向,该文件描述了widget的一些基本信息。

(3)编写widget的provider文件信息,本例中该文件名叫做widget_setting.xml,开发者可以随便取名,只要在AndroidMenifest.xml中写正确就行。


01.<?xml version="1.0" encoding="utf-8"?> 
02.<appwidget-provider 
03. xmlns:android="http://schemas.android.com/apk/res/android"   
04. android:minWidth="100dp"   
05. android:minHeight="100dp" 
06. android:initialLayout="@layout/main"   
07. android:updatePeriodMillis="1000" > 
08.</appwidget-provider> 


minWidth和minHeight是widget的最小宽度和高度,这个值是一个参考值,系统会根据实际情况进行改变,initialLayout属性指明了widget的视图布局文件,updatePeriodMillis属性是widget每隔多久更新一次的时间,单位为毫秒。

(4)接下来就是界面布局,在这个示例中只需要一个TextView控件就可以,代码如下:


01.<?xml version="1.0" encoding="utf-8"?> 
02.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
03.    android:orientation="vertical" 
04.    android:layout_width="fill_parent" 
05.    android:layout_height="fill_parent" 
06.    > 
07.<TextView   
08.    android:layout_width="fill_parent"   
09.    android:layout_height="wrap_content"   
10.    android:text="@string/hello" android:id="@+id/text"/> 
11.</LinearLayout> 


准备工作完毕,接下来完善继承自AppWidgetProvider的自定义类,重写onUpdate(Context, AppWidgetManager,int[])函数,代码如下:


01.package com.dt.time;  
02.   
03.import java.util.Date;  
04.   
05.import android.appwidget.AppWidgetManager;  
06.import android.appwidget.AppWidgetProvider;  
07.import android.content.Context;  
08.import android.widget.RemoteViews;  
09.   
10.public class widget extends AppWidgetProvider {  
11.   
12.   @Override 
13.   public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {  
14.      // TODO Auto-generated method stub  
15.      super.onUpdate(context, appWidgetManager, appWidgetIds);  
16.        
17.      //1. 获取当前时间  
18.      Date now = new Date();  
19.      String strNow = now.toLocaleString();  
20.      //2. 获取RemoteViews对象  
21.      RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main);  
22.      //3. 显示时间到widget  
23.      views.setTextViewText(R.id.text, strNow);  
24.      //4. 更新widget  
25.      appWidgetManager.updateAppWidget(appWidgetIds, views);  
26.   }  
27.} 
package com.dt.time; import java.util.Date; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.widget.RemoteViews; public class widget extends AppWidgetProvider { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { // TODO Auto-generated method stub super.onUpdate(context, appWidgetManager, appWidgetIds); //1. 获取当前时间 Date now = new Date(); String strNow = now.toLocaleString(); //2. 获取RemoteViews对象 RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main); //3. 显示时间到widget views.setTextViewText(R.id.text, strNow); //4. 更新widget appWidgetManager.updateAppWidget(appWidgetIds, views); } }
之后运行写好的widget查看下成果,widget的启动与普通程序不同,它不会在程序列表中显示,而是要长按桌面在弹出的列表中选择Widgets项目,之后选择本示例time,下图就是widget运行时的截图:



widget的扩展更新方法
在上例中widget更新是通过定时方式实现的,在普通情况下这种更新方式已经足够了,但是对于某些应用使用定时方式更新显得就不够用了。比如短信提示,当有新的短信到来时我们希望能够实时的更新widget,如果还是用定时更新显然是不行的,那么能不能让widget接受除appwidget_update之外的系统消息呢?答案是可以的。

仔细查看下文档后可以发现,widget只是一个receiver,既然是receiver那么也就可以接受所有的系统消息了,接下来使用短信提醒示例来演示widget接受系统其他消息的方式,本例中将只前一示例进行修改。

(1)修改AndroidMenifest.xml文件,向其中添加android.provider.Telephony.SMS_RECEIVED监听事件,代码如下:
01.<receiver android:name=".widget" > 
02.   <intent-filter> 
03.       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
04.       <action android:name="android.provider.Telephony.SMS_RECEIVED" />   
05.   </intent-filter> 
06.   <meta-data android:name="android.appwidget.provider" 
07.                    android:resource="@xml/widget_provider" /> 
08.</receiver> 
<receiver android:name=".widget" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_provider" /> </receiver>
添加了这个短信监听事件后,我们就已经向widget添加了监听短信的功能了,实际操作非常简单。

接下来需要添加一个阅读短信的权限,在AndroidMenifest.xml中任意位置添加<uses-permission android:name="android.permission.RECEIVE_SMS" />

(2)然后还需要修改下widget_setting.xml文件,将其中的updatePeriodMillis属性设为0,也就是不定时更新,这样可以展示这个widget是实时更新的。

(3)之后修改AppWidgetProvider的子类,使其将短信内容显示到widget上。在本示例中我们将不再修改onUpdate(Context, AppWidgetManager,int[])函数,而是重写onReceive(Context context, Intent intent)函数,这个函数其实能够实现包括onUpdate在内的所有函数功能,代码如下:

01.package com.dt.time;  
02.   
03.import android.appwidget.AppWidgetManager;  
04.import android.appwidget.AppWidgetProvider;  
05.import android.content.ComponentName;  
06.import android.content.Context;  
07.import android.content.Intent;  
08.import android.widget.RemoteViews;  
09.   
10.public class widget extends AppWidgetProvider {  
11.     
12.   @Override 
13.   public void onReceive(Context context, Intent intent) {  
14.      // TODO Auto-generated method stub  
15.      super.onReceive(context, intent);  
16.        
17.      //1. 获取RemoteViews对象  
18.      RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main);  
19.      //2. 显示新消息提醒  
20.      views.setTextViewText(R.id.text, "New message!");  
21.      //3. 更新widget  
22.      AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);  
23.      appWidgetManager.updateAppWidget(new ComponentName(context, widget.class), views);  
24.   }  
25.} 
package com.dt.time; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.widget.RemoteViews; public class widget extends AppWidgetProvider { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub super.onReceive(context, intent); //1. 获取RemoteViews对象 RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main); //2. 显示新消息提醒 views.setTextViewText(R.id.text, "New message!"); //3. 更新widget AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); appWidgetManager.updateAppWidget(new ComponentName(context, widget.class), views); } }
代码与上一示例差别不多,唯一有区别的地方便是appWidgetManager的实例化,在上一示例中由于onUpdate()方法中有一个参数是appWidgetManager因此我们不需要单独实例化该对象,但是在onReceive()方法中并没有这个参数,因此我们需要实例化一个appWidgetManager,通过AppWidgetManager.getInstance(Context)方法就可以获得一个appWidgetManager实例。当然由于onReceive()函数还缺少appWidgetIds这个参数,因此我们也不能直接使用updateAppWidget(int[] appWidgetIds, RemoteViews views)这个函数,而要改用updateAppWidget(ComponentName provider, RemoteViews views)这个函数,其中provider参数是一个ComponentName类型的值,简单的说就是组件名,通过实例化一个组件便可;第二个参数是是一个视图对象,就是想要展示的widget视图。


通过这样简单的改动,当有新的短信息发到手机上时就能第一时间展示在widget中,做到了实时更新。


widget的进阶更新方法
上面的示例已经让widget可以实时的更新内容,但是如果要显示电池电量的话,上面的方法还是不行的,为什么呢?原来android中并没有为获取电池信息设计单独的api,必须注册为一个service才能获取。按照上面的思路那也简单,只要我们写个service,然后在系统中广播更新消息就可以了;但是根据文档中的说明,要获取电池信息的service必须是通过Context.registerReceiver()这个函数来注册一个监听电池变化的事件才能获取,这样一来对我们设计就带来了麻烦。

解决的方法倒也很简单,就是单独写个service在里面注册一个监听事件,当电池电量发生变化的时候就更新widget,看起来与我们上面的例子很相似,就是多了一个service,但是这里还有一个不同的是,我们更新widget的方法不再是在onUpdate()或者是onReceive中进行,而是在service中直接对widget修改,似乎跟文档上说的出入很大,但是看看上面显示短信的例子我们会发现,在那个示例中似乎widget的更新与appWidgetProvider已经没有什么关系了,我们即没有从参数获得appWidgetManager实例,也没从参数中获得appWidgetIds,一切都是我们自己新建了一个,因而不再widget更新的方法完全是可行的。下面来介绍下代码:

(1)本示例中沿用第二个示例的代码,添加一个名叫service.java类

view plaincopy to clipboardprint?
01.package com.dt.time;  
02.   
03.import android.app.Service;  
04.import android.appwidget.AppWidgetManager;  
05.import android.content.BroadcastReceiver;  
06.import android.content.ComponentName;  
07.import android.content.Context;  
08.import android.content.Intent;  
09.import android.content.IntentFilter;  
10.import android.graphics.Color;  
11.import android.os.IBinder;  
12.import android.widget.RemoteViews;  
13.   
14.public class mService extends Service {  
15.   
16.        
17.   @Override 
18.   public void onStart(Intent intent, int startId) {  
19.   // TODO Auto-generated method stub  
20.   super.onStart(intent, startId);  
21.   registerReceiver(this.mBR, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));  
22.        
23.   }  
24.     
25.   //声明一个广播接受对象,用接受电池信息  
26.   private BroadcastReceiver mBR = new BroadcastReceiver() {  
27.        
28.   @Override 
29.   public void onReceive(Context context, Intent intent) {  
30.   // TODO Auto-generated method stub  
31.           
32.   if(Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction()))  
33.   {  
34.            //这里添加相关处理动作     
35.      bLevel = intent.getIntExtra("level", 0);    //获取当前电量  
36.              
37.      String value = String.valueOf(bLevel) + "%";   //显示电量的文字          
38.              
39.      AppWidgetManager awm = AppWidgetManager.getInstance(context);  
40.      RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.main);  
41.              
42.      views.setTextViewText(R.id.text, value);  
43.              
44.      awm.updateAppWidget(new ComponentName(context, widget.class), views);  
45.         }  
46.      }  
47.   };  
48.} 
package com.dt.time; import android.app.Service; import android.appwidget.AppWidgetManager; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Color; import android.os.IBinder; import android.widget.RemoteViews; public class mService extends Service { @Override public void onStart(Intent intent, int startId) { // TODO Auto-generated method stub super.onStart(intent, startId); registerReceiver(this.mBR, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); } //声明一个广播接受对象,用接受电池信息 private BroadcastReceiver mBR = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub if(Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) { //这里添加相关处理动作 bLevel = intent.getIntExtra("level", 0); //获取当前电量 String value = String.valueOf(bLevel) + "%"; //显示电量的文字 AppWidgetManager awm = AppWidgetManager.getInstance(context); RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.main); views.setTextViewText(R.id.text, value); awm.updateAppWidget(new ComponentName(context, widget.class), views); } } }; }
(2)修改AndroidMenifest.xml文件,向其中添加一个<service android:name=".service"/>,这样就注册了一个系统服务,当widget启动的时候这个服务也会跟着启动,而当widget删除的时候是否也会自动删除呢?经过试验大多数情况下OPhone会自动删除这个service,如果你为了安全也可以手动删除。

之后就可以运行看看效果了,这里展示的截图是我作的一个显示电池电量的widget,目前除了能够显示电量外还添加了其他信息的显示。



    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
oracle iis7站长之家
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,