当前位置: 编程技术>移动开发
本页文章导读:
▪<viewStub /> <requestFocus /> <merge /> and <include />的运用 <viewStub />, <requestFocus />, <merge /> and <include />的使用
编写设计模式(DESIGNPATTERNS)的前辈们在具体的实践中总结出大量的经验,比如:如何才能高效的处理问题?如何才能.........
▪ 标签栏与提选器的使用 标签栏与选取器的使用
我们要实现下面的效果,就是通过下方的标签栏切换视图来显示不同的选取器首先创建工程,选择Window-Based Application模板,取项目名称为Picker。生成后选中Classes文件.........
▪ 一些惯用设置,标记一下 一些常用设置,标记一下
设置全屏:
必须在setContentView()之前调用
否则会报错:android.util.AndroidRuntimeException: requestFeature() must be called before adding content
// Full screen
// 隐藏Title(其中是项目.........
[1]<viewStub /> <requestFocus /> <merge /> and <include />的运用
来源: 互联网 发布时间: 2014-02-18
<viewStub />, <requestFocus />, <merge /> and <include />的使用
编写设计模式(DESIGNPATTERNS)的前辈们在具体的实践中总结出大量的经验,比如:如何才能高效的处理问题?如何才能更科学的安排架构或者合理的复用现有资源?等等…其中有提到对现有资源的复用,这是整个设计模式精髓理论之一,因为资源复用被应用于设计模式大部分的模块中。
简单或复杂的问题都需要时常考虑如何优化资源的分配。比如一个功能很简单的应用程序,它会调用一些我们常用的对话框或者输入面板,这需要采用统一的方式来针对不同的应用程序制定统一标准。
当我们面对Android UI优化时,有必要继续考虑资源复用。手机开发给我们的直观感觉是运行其上的软件应该尽可能的达到资源高效利用的极致,而不能像开发PC机那样,似乎有用之不尽的资源。
定义Android Layout(XML)时,有四个比较特别的标签是非常重要的,其中有三个是与资源复用有关,分别是 <viewStub />, <requestFocus />, <merge /> and <include />。可是以往我们所接触的案例或者官方文档的例子都没有着重去介绍这些标签的重要性。
<viewStub />: 此标签可以使UI在特殊情况下,直观效果类似于设置View的不可见性,但是其更大的(R)意义在于被这个标签所包裹的Views在默认状态下不会占用任何内存空间。viewStub通过include从外部导入Views元素。
用法:通过android:layout来指定所包含的内容。默认情况下,ViewStub所包含的标签都属于visibility=GONE。viewStub通过方法inflate()来召唤系统加载其内部的Views。<ViewStub android:id="@+id/stub"
android:inflatedId="@+id/subTree"
android:layout="@layout/mySubTree"
android:layout_width="120dip"
android:layout_height="40dip" />
<merge />: 将在下一篇做详细介绍。
<include />:可以通过这个标签直接加载外部的xml到当前结构中,是复用UI资源的常用标签。
用法:将需要复用xml文件路径赋予include标签的Layout属性。<include android:id="@+id/cell1" layout="@layout/ar01" />
<include android:layout_width="fill_parent" layout="@layout/ar02" />
<requestFocus />: 标签用于指定屏幕内的焦点View。
用法: 将标签置于Views标签内部<EditText id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0"
android:paddingBottom="4">
<requestFocus />
</EditText>
编写设计模式(DESIGNPATTERNS)的前辈们在具体的实践中总结出大量的经验,比如:如何才能高效的处理问题?如何才能更科学的安排架构或者合理的复用现有资源?等等…其中有提到对现有资源的复用,这是整个设计模式精髓理论之一,因为资源复用被应用于设计模式大部分的模块中。
简单或复杂的问题都需要时常考虑如何优化资源的分配。比如一个功能很简单的应用程序,它会调用一些我们常用的对话框或者输入面板,这需要采用统一的方式来针对不同的应用程序制定统一标准。
当我们面对Android UI优化时,有必要继续考虑资源复用。手机开发给我们的直观感觉是运行其上的软件应该尽可能的达到资源高效利用的极致,而不能像开发PC机那样,似乎有用之不尽的资源。
定义Android Layout(XML)时,有四个比较特别的标签是非常重要的,其中有三个是与资源复用有关,分别是 <viewStub />, <requestFocus />, <merge /> and <include />。可是以往我们所接触的案例或者官方文档的例子都没有着重去介绍这些标签的重要性。
<viewStub />: 此标签可以使UI在特殊情况下,直观效果类似于设置View的不可见性,但是其更大的(R)意义在于被这个标签所包裹的Views在默认状态下不会占用任何内存空间。viewStub通过include从外部导入Views元素。
用法:通过android:layout来指定所包含的内容。默认情况下,ViewStub所包含的标签都属于visibility=GONE。viewStub通过方法inflate()来召唤系统加载其内部的Views。<ViewStub android:id="@+id/stub"
android:inflatedId="@+id/subTree"
android:layout="@layout/mySubTree"
android:layout_width="120dip"
android:layout_height="40dip" />
<merge />: 将在下一篇做详细介绍。
<include />:可以通过这个标签直接加载外部的xml到当前结构中,是复用UI资源的常用标签。
用法:将需要复用xml文件路径赋予include标签的Layout属性。<include android:id="@+id/cell1" layout="@layout/ar01" />
<include android:layout_width="fill_parent" layout="@layout/ar02" />
<requestFocus />: 标签用于指定屏幕内的焦点View。
用法: 将标签置于Views标签内部<EditText id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0"
android:paddingBottom="4">
<requestFocus />
</EditText>
[2] 标签栏与提选器的使用
来源: 互联网 发布时间: 2014-02-18
标签栏与选取器的使用
我们要实现下面的效果,就是通过下方的标签栏切换视图来显示不同的选取器
首先创建工程,选择Window-Based Application模板,取项目名称为Picker。生成后选中Classes文件夹,从File中选择new File,再选择UIViewController subclass图标,顺便点选下面的第三项-with xib for user interface,分别取名为DatePicker,SingleComponentPicker,DoubleComponentPicker,生成之后将.xib文件拖入Resources文件夹中。
先添加根视图控制器,单击PickerAppDelegate.h类
单击PickerAppDelegate.m
双击MainWindow.xib,从库中拖出一个Tab Bar Controller到nib主窗口,这样会出现一个新的窗口
起初下面只有两个标签,图上的3个标签是又添加上去了1个,选中新出现的窗口,按下花+1打开他的属性,点+,就能添加标签。
为了使每一个标签都能与对应的nib相关联,我们选中第一个。保留title为空,将nib name指定为DatePickerView,按花+4,将类改为DatePicker,再点中标签可以改变标签的名称。以此类推,完成剩下标签的相关连。
再nib主窗口中按住Ctrl将Picker App Delegate拖到Tab Bar Controller图标中。
单击DatePicker.h,完成代码
单击DatePicker.m,完成代码
这样第一个视图就完成了。
进行第二个,单个组件选取器,在SingleComponentPicker.h中声明输出口和操作
在相应的.xib中创建相应视图,一个Picker View和一个按钮,并完成如下关联
在相应.m文件中进行编码
第二个视图也就完成了,下面创建第三个,在DoubleComponentPicker.h中声明输出口和操作
控件的形式和关联和第二个视图中一样,可以参考。在相应的.m文件中进行编码
这样就结束了
我们要实现下面的效果,就是通过下方的标签栏切换视图来显示不同的选取器
首先创建工程,选择Window-Based Application模板,取项目名称为Picker。生成后选中Classes文件夹,从File中选择new File,再选择UIViewController subclass图标,顺便点选下面的第三项-with xib for user interface,分别取名为DatePicker,SingleComponentPicker,DoubleComponentPicker,生成之后将.xib文件拖入Resources文件夹中。
先添加根视图控制器,单击PickerAppDelegate.h类
#import <UIKit/UIKit.h> @interface PickersAppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window; UITabBarController *rootController; } @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet UITabBarController *rootController; @end
单击PickerAppDelegate.m
@synthesize window; @synthesize rootController; #pragma mark - #pragma mark Application lifecycle - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [window addSubview:rootController.view]; [window makeKeyAndVisible]; return YES; } - (void)dealloc { [rootController release]; [window release]; [super dealloc]; }
双击MainWindow.xib,从库中拖出一个Tab Bar Controller到nib主窗口,这样会出现一个新的窗口
起初下面只有两个标签,图上的3个标签是又添加上去了1个,选中新出现的窗口,按下花+1打开他的属性,点+,就能添加标签。
为了使每一个标签都能与对应的nib相关联,我们选中第一个。保留title为空,将nib name指定为DatePickerView,按花+4,将类改为DatePicker,再点中标签可以改变标签的名称。以此类推,完成剩下标签的相关连。
再nib主窗口中按住Ctrl将Picker App Delegate拖到Tab Bar Controller图标中。
单击DatePicker.h,完成代码
#import <UIKit/UIKit.h> @interface DatePicker : UIViewController { IBOutlet UIDatePicker *datePicker; } @property (nonatomic,retain) UIDatePicker *datePicker; -(IBAction)buttonPressed; @end
单击DatePicker.m,完成代码
@synthesize datePicker; -(IBAction)buttonPressed{ NSData *selected = [datePicker date]; NSString *message = [[NSString alloc] initWithFormat:@"The date and time is:%@",selected]; UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Data and Time Selected" message:message delegate:nil cancelButtonTitle:@"Yes,I did" otherButtonTitles:nil]; [alert show]; [alert release]; [message release]; } - (void)viewDidLoad { NSDate *now = [[NSDate alloc] init]; [datePicker setDate:now animated:YES]; [now release]; [super viewDidLoad]; } - (void)dealloc { [datePicker release]; [super dealloc]; }
这样第一个视图就完成了。
进行第二个,单个组件选取器,在SingleComponentPicker.h中声明输出口和操作
#import <UIKit/UIKit.h> @interface SinglecomponentPickerViewController : UIViewController <UIPickerViewDelegate,UIPickerViewDataSource>{ IBOutlet UIPickerView *singlePicker; NSArray *pickerData; } @property (nonatomic,retain) UIPickerView *singlePicker; @property (nonatomic,retain) NSArray *pickerData; -(IBAction)buttonPressed; @end
在相应的.xib中创建相应视图,一个Picker View和一个按钮,并完成如下关联
在相应.m文件中进行编码
@synthesize singlePicker; @synthesize pickerData; -(IBAction)buttonPressed{ NSInteger row = [singlePicker selectedRowInComponent:0]; NSString *selected = [pickerData objectAtIndex:row]; NSString *title = [[NSString alloc] initWithFormat:@"You selected %@!",selected]; UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:@"Thank you for choosing!" delegate:nil cancelButtonTitle:@"you'are welcome." otherButtonTitles:nil]; [alert show]; [alert release]; [title release]; } - (void)viewDidLoad { NSArray *array = [[NSArray alloc] initWithObjects:@"Inter Milan",@"AC Milan",@"Arsenal",@"Liverpool",@"Chelsea",@"Newcastle",@"Manchester United",@"Real Madrid",nil]; self.pickerData = array; [array release]; } - (void)dealloc { [singlePicker release]; [pickerData release]; [super dealloc]; } #pragma mark - #pragma mark Picker Data Source Methods - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ return 1; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{ return [pickerData count]; } #pragma mark Picker Delegate Methods - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ return [pickerData objectAtIndex:row]; } @end
第二个视图也就完成了,下面创建第三个,在DoubleComponentPicker.h中声明输出口和操作
#import <UIKit/UIKit.h> #define kFillingComponent 0 #define kBreadComponent 1 @interface DoublecomponentPickerViewController : UIViewController <UIPickerViewDelegate,UIPickerViewDataSource>{ IBOutlet UIPickerView *doublePicker; NSArray *fillingTypes; NSArray *breadTypes; } @property (nonatomic,retain)UIPickerView *doublePicker; @property (nonatomic,retain)NSArray *fillingTypes; @property (nonatomic,retain)NSArray *breadTypes; -(IBAction)buttonPressed; @end
控件的形式和关联和第二个视图中一样,可以参考。在相应的.m文件中进行编码
@synthesize doublePicker; @synthesize fillingTypes; @synthesize breadTypes; -(IBAction)buttonPressed{ NSInteger breadRow = [doublePicker selectedRowInComponent:kBreadComponent]; NSInteger fillingRow = [doublePicker selectedRowInComponent:kFillingComponent]; NSString *bread = [breadTypes objectAtIndex:breadRow]; NSString *filling = [fillingTypes objectAtIndex:fillingRow]; NSString *message = [[NSString alloc] initWithFormat:@"your %@ on %@ bread will be right up.",filling,bread]; UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Thank you" message:message delegate:nil cancelButtonTitle:@"Great" otherButtonTitles:nil]; [alert show]; [alert release]; [message release]; } - (void)viewDidLoad { NSArray *breadArray = [[NSArray alloc] initWithObjects:@"Inter Milan",@"AC Milan",@"Arsenal",@"Liverpool",@"Chelsea",@"Newcastle",@"Manchester United",@"Real Madrid",nil]; self.breadTypes = breadArray; [breadArray release]; NSArray *fillingArray = [[NSArray alloc] initWithObjects:@"Raul",@"AC Milan",@"Arsenal",@"Liverpool",@"Chelsea",@"Newcastle",@"Manchester United",@"Real Madrid",nil]; self.fillingTypes = fillingArray; [fillingArray release]; } - (void)dealloc { [doublePicker release]; [breadTypes release]; [fillingTypes release]; [super dealloc]; } #pragma mark - #pragma mark Picker Data Source Methods - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ return 2; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{ if (component == kBreadComponent) { return [self.breadTypes count]; } return [self.fillingTypes count]; } #pragma mark Picker Delegate Methods - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ if (component == kBreadComponent) { return [self.breadTypes objectAtIndex:row]; } return [self.fillingTypes objectAtIndex:row]; } @end
这样就结束了
[3] 一些惯用设置,标记一下
来源: 互联网 发布时间: 2014-02-18
一些常用设置,标记一下
设置全屏:
必须在setContentView()之前调用
否则会报错:android.util.AndroidRuntimeException: requestFeature() must be called before adding content
// Full screen // 隐藏Title(其中是项目名称) requestWindowFeature(Window.FEATURE_NO_TITLE); // 隐藏系统的工具栏 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
设置软键盘不弹出:
// 关掉软键盘 ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE)) .hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
几种表示大小的单位:
px(pixels) 像素 : 与设备相关。
dip/dp(device independent pixels) 设备独立像素 : 不依赖于设备,支持 WVGA 、 HVGA 等。布局时尽量使用单位 dip ,少使用 px 。
sp(scaled pixels) 放大像素 : 一般用于字体。
padding vs margin
padding 是该元素的主要内容到边框的距离 , 即内边距; 一般描述控件内容和控件的位置关系。
margin 是边框距离其他元素的距离,即外边距; 一般用来描述控件间 位置关系
最新技术文章: