Android中提供了丰富的UI空间,为了最大限度地发挥平台的性能,每一个开发者必须熟练掌握UI控件尤其是常用的UI控件,并能根据需要呈现的内容选择最恰当的控件。
Android提供了XML配置和Java两种方式来配置控件属性。通常,XML配置有利于扩展和多目标环境的适配,但由于增加了XML解析过程而使性能略低且无法动态变化,而Java方式虽然性能较好,但由于目标环境多变的Android设备而言,其扩展性通常无法满足项目的需要,在实际的开发工作中,开发者可根据实际情况的需要及两种方法的优缺点,自行决定采用哪种方式。
1.布局控件
常用的布局控件包括LinearLayout、RelativeLayout、TableLayout、FrameLayout、AbsoluteLayout等,其中最常用的是LinearLayout和RelativeLayout,比较重要的是FrameLayout,而AbsoluteLayout布局已经被弃用。
(1)LinearLayout
继承关系:java.lang.Object---android.view.View---android.view.ViewGroup---android.widget.LinearLayout
属性介绍:
android:layout_width属性定义了控件的宽度;
android:layout_height属性定义可控件的高度;
android:orientation属性决定了控件的方向;LinearLayout支持vertical和horizontal两种布局方式,在默认情况下,android:orientation的属性值为horizontal。
android:layout_weight其含义是使控件占据所有可用空间。
wrap_context属性表示适配内容;
fill_parent和match_parent属性表示适配父控件;
属性值在frameworks\base\core\res\res\values\目录下的Attrs.xml中定义。
(2)RelativeLayout
继承关系:java.lang.Object---android.view.View---android.view.ViewGroup---android.widget.RelativeLayout
设置控件与父控件的相对位置的属性:
android:layout_alignParentLeft
android:layout_alignParentRight
android:layout_alignParentTop
android:layout_alignParentBottom
设置控件间的相对位置的属性:
android:layout_toRightof表示位于目标控件的右边
android:layout_toLeftOf表示位于目标控件的左边
android:layout_above表示位于目标控件的上边
android:layout_below表示位于目标控件的下边
android:layout_alignbaseline表示和目标控件的基线对齐
android:layout_alignLeft表示不考虑填充,控件和目标控件左对齐
android:layout_alignTop表示不考虑填充,控件位于目标控件顶部
android:layout_alignRight表示不考虑填充,控件和目标控件右对齐
android:layout_alignBottom表示不考虑填充,控件位于目标控件底部
layout_centerInParent表示控件位于父控件中央
layout_centerHorizontal表示控件在父控件中水平居中
layout_centerVertical表示控件在父控件中垂直居中
layout_alignWithParentIfMissing表示目标控件失效时,父控件作为目标控件
RelativeLayout不支持android:layout_weight属性,当没有指明和其他控件之间的位置关系时,控件位于父控件的左上方。
(3)TableLayout
继承关系:java.lang.Object---android.view.View---android.view.ViewGroup---android.widget.LinearLayout---android.widget.TableLayout
TableLayout可以设置是否允许该列伸展至充满可用空间或收缩甚至隐藏而为其它控件特出地方:
public void setColumnCollapsed(int columnIndex, boolean isCollapsed) //列隐藏
public void setColumnStretchable(int columnIndex, boolean isStretchalble) //伸展列
public void setColumnShrinkable(int columnIndex, boolean isShrinkable) //收缩列
(4)FrameLayout
FrameLayout是Android中另一个非常重要的布局控件,是很多动画类和复杂控件类的父类。
继承关系:java.lang.Object----android.view.View----android.view.ViewGroup----android.widget.PrameLatout
2.显示控件
显示控件主要有TextView、ProgressBar、WebView、ViewSwitcher、TextSwitcher、ViewFlipper、SeekBar和ViewStub等。
(1)TextView
继承关系:java.lang.Object----android.view.View----android.widgetTextView
1)字体相关属性
在Android中,对字体提供了多种支持,可以配置采用的字体、字体大小、字体特效和字体颜色等。
在字体大小的配置上,目前系统提供了Large、Medium、NORMAL、Small等模式。对应的字体实际大小分别为20sp、18sp、16sp、14sp。在默认情况下,字体大小模式为NORMAL。android:textSize="20sp"
在字体特效上支持normal、bold、italic、bold_italic等4中特效。android:textStyle="bold"
在字体颜色上,Android支持多种系统颜色,用户可以显示指定字体颜色,格式为“#ARGB”。android:textColor="?android:attr/textColorPrimary" android:textColor="#ff44ff00"
在字体上,Android支持4中字体:normal、sans、serif、monospace。设置字体的方法:android:typeface="sans"
如果希望用新的字体,可以将字体放置在断言中,加载字体方法:Typeface tf=Typeface.createFromAsset(getAssets()),"fonts/custom.ttf"); tv.setTypeface(tf);
2)内容排列属性
对于内容排列方法,TextView支持多行滚动、单行、最大行数、最小宽度、滚动条等多项设置,在具体实现时可通过自动完成功能获得帮组。
android:singleLine="true" //单行
android:maxLines="2" //最大行数
android:minwidth="64dip" //最小宽度
android:scrollbars="vertical" //垂直滚动条
(2)ProgressBar
ProgressBar是表示播放、下载、缓存进度的一种可视化控件。
继承关系:java.lang.Object----android.view.View----android.widget.ProgressBar
根据适用的场景不同,ProgressBar有4中风格,即progressBarStyle、progressBarStyleHorizontal、progressBarStyleLarge、progressBarStyleSmall。其中progressBarStyle时默认风格,和progressBarStyleLarge、progressBarStyleSmall一样,是环形的进度条,这这进度条的好处是可用在无法明确进度值的场景中。progressBarStyleHorizontal风格的ProgressBar为水平进度条。
progressBarStyleHorizontal风格的Progress具有主进度和辅进度两个状态,特别适用于具有缓存的场景,设计上充分考虑了网络需求。
ProgressBar的缺点是不允许用户调节进度。如果在某些情况下希望用户能干预进度,则需要使用SeekBar控件。
(3)WebView
继承关系:java.lang.Object----android.view.View----android.view.ViewGroup----android.widget.AbsoluteLayout----android.webkit.WebView
WebView是一个复杂的框架的显示部分,其框架有WebView、WebSettings、WebViewClient、WebStorage、WebChromeClient、WebHistoryItem等构成。
1)WebSettings的常用设置
WebView通过WebView.getSettings().setDefaultFontSize()设置字体。通过WebView.getSettings().setDefaultZoom()设置屏幕的缩放级别。
通过WebView.getSettings().setPluginsEnable(true)来设置允许Gears插件,进而实现网页中的Flash动画显示。
通过WebView.getSettings().setBuiltInZoomControls(true)实现显示缩放控件。
2)加载内容的两种方式
通过WebView加载网址或者本地文件脚本的方法:public void loadUrl(String url) 或public void loadUrl(String url, Map
默认情况下,通过loadUrl加载的网页并非由WebView显示,而是通过Activity管理器选择恰当的应用(通常为浏览器)来加载,如果不想通过浏览器加载网页,实现方法:WebView webView=new WebView(this); webView.setWebViewClient(new WebViewClient(){ public boolean shouldOverrideUrlLoading(WebView, String url){return false;}});
如果希望加载直接的数据,可以考虑使用如下方法:public void loadData(String data, String minetype,String encoding);
WebView需要android.permission.INTERNET权限。
(4)ViewSwitcher
ViewSwitcher支持在两个子视图间进行切换,其视图的创建可以通过setFactory进行(两个子视图相同),也可以通过addView方法添加(更灵活的方式)。
继承关系:java.lang.Object--android.view.View--android.view.ViewGroup--android.widget.FrameLayout--android.widget.ViewAnimator-android.widget.ViewSwitcher
(5)TextSwitcher
TextSwitcher是ViewSwitcher的子类,支持在两个TextView间进行切换。
提供了设置字符串的快捷方式,分别为针对当前视图的setCurrentText和针对非当前视图的setText。
(6)ViewFlipper
支持多个子视图,可以帮组开发者实现幻灯片功能。
ViewFlipper的继承关系:java.lang.Object----android.view.View----android.view.ViewGroup----android.widget.FrameLayout----android.widget.ViewAnimator----android.widget.ViewFlipper。
通过ViewFlipper可以设置子视图切换的时间间隔、是否自动切换等。
启动幻灯片的java代码:ViewFlipper mflipper=((ViewFlipper)this.findViewById(R.id.flipper)); mFlipper.startFlipping();
(7)SeekBar
SeekBar是一种特殊的进度条,其与ProgressBar的区别在于,SeekBar支持用户手动调整进度,可以实现进度条的个性化设置。
继承关系:java.lang.Object----android.view.View----android.widget.ProgressBar----android.widget.AbsSeekBar----android.widget.SeekBar
监控SeekBar的进度条变化的实现方法:
seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser){}
public void onStartTrackingTouch(SeekBar seekBar){}
public void onStopTrackingTouch(SeekBar seekBar){}
});
在默认情况下,SeekBar的最大值为100,通过setMax方法可以设置SeekBar的最大值。设置SeekBar的进度的方法:
public synchronized void setProgress(int progress);
public synchronized void setSecondaryProgress(int secondaryProgress)
个性化的进度条更多的是通过设置android:progressDrawable属性实现的。
(8)ViewStub
ViewStub是一种非常灵活的视图,主要用于布局资源的实时加载。
继承关系:java.lang.Object----android.view.View----android.view.ViewStub
当设置ViewStub为可视的或者调用其inflate()方法时,布局资源被渲染,ViewStub的位置被渲染的布局资源替换。
当布局资源被渲染后,ViewStub将被系统从其父控件中移除,这意味着其ID失效,其inflatedId将变为可用。
渲染布局资源的方法:ViewStub stub=(ViewStub)findViewById(R.id.editor_stub); View inflated=stub.inflate();
3.容器控件
容器控件主要包括SlidingDrawer、ListView、ExpandableListView、GridView、ScrollView、HorizontalScrollView和TabHost等。
(1)SlidingDrawer
SlidingDrawer提供了一种抽屉式的效果,支持水平和竖直两种布局方式。
继承关系:java.lang.Object----android.view.View----android.view.ViewGroup----android.widget.SlidingDrawer
SlidingDrawer由手柄(handle)和内容(content)两个子视图组成,其父控件必须是FrameLayout或RelativeLayout。
当拖拽手柄时,SlidingDrawer会调用OnDrawerOpenListener、OnDrawerCloseListener、OnDrawerScrollListener等监听事件。
(2)ListView
ListView时Android中最常用的复杂容器控件之一,支持单行、多行、自定义布局等多种子视图布局,同时支持普通显示、单选和多选等风格。为了实现上述风格,ListView引入了适配器模式。
继承关系:java.lang.Object----android.view.View----android.view.ViewGroup----android.widget.AdapterView
在开发列表时,主要有适配器、单击事件处理、单选/多选处理等需要考虑,其中适配器包括数据源为数据库的适配器(CursorAdapter)和数据源为普通数据类型的适配器(BaseAdapter)等。
1)普通列表
普通列表的实现相对简单,重在列表项的实现和数据的加载。
2)可选列表
可选列表分单选列表和多选列表两种,其中单选列表时间比较简单,而多选列表实现相对复杂。
通过ListView的setMultiChiceModeListener方法可以设置ListView.MultiChioceModeListener监听器来帮组开发者进行多选处理。
对于可选列表,同样存在自定义适配器的问题,自定义适配器的方法和普通列表类似。不同的是,自定义列表项的布局文件必须包括CheckBox(多选)或者RadioButton(单选)。
通过setItemChecked方法开发者可以手动设置是否选择列表项。
单选列表的实现主要是通过setChoiceMode方法将ListView的ChoiceMode设为ListView.CHOICE_MODE_SINGLE进行的。通过setCheckedItemPosition方法可以获得当前选择列表项的位置。
3)滚动滑块
在AbsListView中引入了滚动滑块的功能,在通常情况下,ListView中的滚动滑块时关系的,为了打开滚动滑块功能,在ListView中设置属性:android:fastScrollEnable="true"。在java代码中的实现方法:myListView.setFastScrollEnabled(true);
ListView的其他常用方法:
getFirstVisiblePosition() //获取首个可见Item的位置
getItemAtPosition() //获取某个位置的Item
setSelectedPosition() //设置当前选中项
(3)ExpandableListView
ExpandableListView实际上是树形控件,可以实现复杂的列表组合,当然考虑到屏幕的限制,ExpandableListView只有在打开组列表项时才能看到子列表的信息,这在一定程度上不利于用户快速获取完整的信息。
继承关系:java.lang.Object----android.view.View----android.view.ViewGroup----android.widget.AdapterView
ExpandableListView的实现和普通列表的实现类似,但有群组的区别,Android提供了simple_expandable_list_item_1和simple_expandable_list_item_2两种默认布局。
(4)GridView
GridView即网格控件,该控件通常用于=主菜单和浏览类场景。
继承关系:java.lang.Object----android.view.View----android.view.ViewGroup----android.widget.AdapterView
GridView的实现和ListView相同,只是呈现方式不同。
(5)ScrollView
ScrollView提供了一种在有限的屏幕上展现更多信息的方式,其意图是作为设计模式中装饰者模式的装饰者出现,仅支持垂直滚动。
继承关系:java.lang.Object----android.view.View----android.view.ViewGroup----android.widget.FrameLayout----android.widget.ScrollView
ScrollView支持替换滚动条的滑块,开发者可以根据自己的需求,设置不同的滑块。
如果希望为水平滚动滑块,可以使用HorizontalScrollView。
(6)TabHost
严格意义上讲,TabHost需要联合TabWidget才能构成标签页的效果。TabHost有助于开发者在有限的屏幕显示区域中显示更多的内容。当让后台还是依靠FrameLayout。
继承关系:java.lang.Object----android.view.View----android.view.ViewGroup----android.widget.FrameLayout----android.widget.TabHost
TabHost并非一定要作为布局文件的根元素出现。
4.输入控件
在Android中,输入控件主要包括EditText、Spinner、AutoCompleteTextView、MultiAutoCompleteTextView、DatePicker和TimePicker等。
(1)EditText
EditText是Android中最常用的输入控件之一。
继承关系:java.lang.Object----android.view.View----android.widget.TextView----android.widget.EditText
1)输入数据的控制
输入数据的控制通常在布局的配置中进行,可以设置的数据类型包括密码、纯数字、密码验证码等。
当EditrText用于输入密码时,可以配置android:password="true",这样可以使输入信息在1s后变为“*”符号。
当EditText用于输入纯数字时,可以配置android:numeric="true",用户仅能输入0~9等10个数字。
当EditText用于密码验证时,可以配置android:capitalize="***"。使输入信息仅能为“***”,避免了开发者再用正则表达式进行判断。
在较新的android版本中,Google为了统一,使用android:inputType属性配置,其属性值包括none(不可编辑)、textPassword(密码)、textVisiblePassword(密码可见)、number(数字)、phone(电话号码)、datetime、date(日期)、time(时间)等。
2)风格控制
EditText还支持对风格(如行数、可否编辑、光标选择。最大长度、提示等)的控制。
通过android:singleLine="true"限制风格为单行。
通过android:minLines属性还可以配置最小行数。
通过android:maxLines属性可以配置最大行数。
通过android:editable="false"属性限制编辑。
通过android:ellipsize属性自动隐藏无法显示的内容,其属性值包括none、start、middle、end、marquee等。
通过android:selectAllOnFocue="true"属性咋获得焦点时选择内容。更灵活的光标选择可以通过setSelection方法进行。
通过android:maxLength属性控制输入的最大长度。
通过android:hint属性设置提示。如果希望通过方法设置,可以使用方法setHint。
3)软键盘控制
隐藏软键盘:
InputMethodManger imm=(InputMethidManger)getSystemService(Context.INPUT_METHID_SERVICE);
imm.hideSoftInputFromWindow(myEdit.getWindowToken(), 0);
显示软键盘的方法:
public boolean showSoftInput(View view, int flags, ResultReceiver resultReceiver);
public boolean showSoftInput(View view, int flags);
public void showSoftInputFromInputMethod(IBinder token, int flags);
(2)Spinner
Spinner可以实现下拉框的效果,并监听用户的选择。
继承关系:java.lang.Object----android.view.View----android.viewViewGroup----android.widget.AdapterView
Spinner的数据源也是通过适配器模式设置的,Android提供了simple_spinner_dropdown_item的系统布局实现。
(3)AutoCompleteTextView
AutoCompleteTextView提供了自动完成功能,其数据源支持数据、数据库等。
继承关系:java.lang.Object----adroid.view.View----android.widget.TextView----android.widget.EditText----android.widget.AutoCompleteTextView。
Android提供了simple_dropdown_item_1line、simple_dropdown_item_2line两种AutoCompleteTextView系统布局风格。基本可以满足开发者的需要,不需要自定义布局。
在默认情况下,只有在输入两个字符时,AutoCompleteTextView才开始执行匹配,如果希望变更开始匹配的字符数量,可以使用setThreshold方法。
AutoCompleteTextView不支持数据源的更新,其只能实现单选功能,如果希望实现多选,则需使用MultiAutoCompleteTextView。
5.控制控件
在android中,控制控件主要包括Button、CheckBox、RadioButton、RatingBar、ToggleButton和ZoomControls等。
(1)Button
Button是最基本的控制控件。
继承关系:java.lang.Object----android.view.View----android.widget.TextView----android.widget.Button
Button还有两个变种,即ImageButton和ToggleButton。其中ImageButton显示的内容为背景图像,ToggleButton可以记忆选择状态。
在Android中,Button支持阴影(shape)、渐变(gradient)、边缘(stroke)、拐角(corners)等多种属性,这些属性有助于开发者设计出个性化的风格。
1)ImageButton
使用ImageButton时,需要设置背景图片。
2)ToggleButton
ToggleButton控件主要执行开发操作,
(2)CheckBox
CheckBox用于标记是否选择内容,通常用于多选场景中。
继承关系:java.lang.Object----android.view.View----android.widget.TextView----android.widget.Button----android.widget.CompoundButton----android.widget.CheckBox.
CheckBox的常用方法:
public void setChecked(boolean checked) //设置是否选择
public boolean isChecked() //判断是否选择
public void toggle() //反转选择
(3)RadioButton
RadioButton用于实现单选功能,常和RadioGroup一起使用。在每个RadioGroup中仅有一个RadioButton处于选中状态。
继承关系:java.lang.Object----android.view.View----android.widget.TextView----android.widget.Button----android.widget.CompoundButton----android.widget.RadioButton.
通过RadioGroup.OnCheckedChangeListener监听器可以监听到RadioButton的选择状态变化。
(4)RatingBar
RatingBar常用的评价场景中,用于给出评级。
继承关系:java.lang.Object----android.view.ViewGoup----android.widget.ProcessBar----android.widget.AbsSeekBar----android.widget.RatingBar。
通过RatingBar.OnRatingBarChangeListener可以监听到RatingBar的状态变化。
(5)ZoomControls
ZoomControls是一个执行缩放的控件,通常用于网页和文本阅读等场景。随着多点触控的逐渐流行,人们更习惯通过多点触控来执行相关页面的缩放。ZoomControl已被边缘化。
继承关系:java.lang.Object----android.view.View----android.view.viewGroup----android.widget.LinearLayout----android.widget.ZoomControls。
常用方法:
public void setIsZoomInEnabled(boolean isEnabled);
public void setIsZoomOutEnabled(boolean isEnabled);
public void setZoomSpeed(long speed);
public void setOnZoomInClickListener(OnClickListener listener);
public void setOnZoomOutClickListener(OnClickListener listener);
6.多媒体控件
在Android中,多媒体控件主要包括VideoView、MediaController、ImageView/、ImageSwitcher和Gallery等。
(1)ImageView
ImageView是最常用的多媒体控件,它支持的缩放方式有matrix、fitXY、fitStart、fitConter、fitEnd、center、centerCrop、centerInside等,相关的属性为android:scaleType。ImageView为图片的设置提供了强大的支持。
继承关系:java.lang.Object----android.view.Viewo----android.widget.ImageView
ImageView常用的方法:
public void setImageResource(int resId) //设置资源ID
public void setImageURI(Uri uri) //设置本地Uri
public void setImageDrawable(Drawable drawable) //设置Drawable
(2)ImageSwitcher
ImageSwitcher主要用于图片浏览场景,在图片切换时,可以实现动画效果。
继承关系:java.lang.Object----android.view.View----android.view.ViewGroup----android.widget.FrameLayout----android.widget.ViewAnimator----android.widget.ViewSwitcher----android.widget.ImageSwitcher
7.特殊控件
在Android中,有些控件是用于特定用途的,主要包括AnalogClock、DigitalClock、AppWidgetHostView、RemoteViews、KeyboardView等。
(1)RemoteViews
严格来讲,RemoteViews并非视图控件,它提供了跨进程加载其他进程布局的方法
继承关系:java.lang.Object----android.widget.RemoteViews
在创建RemoteViews对象时,通常需要设置相应进程的包名,布局ID等;在操作视图控件时,通常需指定控件ID、控件方法和参数。
8.桌面部件
在Android中,UI桌面部件目前仅支持App Wfdgets、Live folders两种形式。者两种形式都是跨进程的远程视图。
(1)App Widgets的实现
App Widgets的实现相对复杂,注重实现跨进程的数据通信,常用于Home Screen中,其实现一般包括如下几个步骤:
定义App Widget布局文件,定义AppWidgetProviderInfo资源,创建AppWidgetProvide类,创建App Widgets的配置Activity(可选)。
App Widgets支持的控件有限,其中布局控件包括FrameLayout、LinearLayout、RelativeLayout等,支持的widget包括AnalogClock、Button、Chronometer、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper等。
为了收到App Widgets的更新消息,ExampleAppWidgetProvider应支持android.appwidget.action.APPWIDGET_UPDATE。
为了收到App Widgets的删除消息,ExampleAppWidgetProvider应支持android.appwidget.action.APPWIDGET_DELETED。
为了收到App Widgets的启动消息,ExampleAppWidgetProvider应支持android.appwidget.action.APPWIDGET_ENABLED。
为了收到App Widgets的禁用消息,ExampleAppWidgetProvider应支持android.appwidget.action.APPWIDGET_DISABLED。
App Widgets更新本质上是通过AppWidgetManager进行的,配置Activity为创建App Widgets的可选过程,为了能够更新,App Widgets必须支持Action名为android.appwidget.action.APPWIDGET_CONFIGURE的Intent。
(2)Live folders的实现
Live folders的作用是在启动器的辅屏上创建出列表,应用它可以极大地方便用户的操作。Live folders的实现一般包括如下几个步骤:
配置文件的实现,数据库的实现,Live folders的Activity的实现。
如果希望创建Live folders,必须接收Action为android.intent.action.CREATE_LIVE_FOLDER的Intent。注意该Intent要有返回值。
9.自定义控件
自定义控件非常方便。基本的要求是必须实现父控件的虚函数和自身的构造函数。
当自定义控件涉及及属性扩展时,在执行构造函数时就必须传入属性集(AttributeSet)
为了使属性有效,必须在对象初始化时加载属性。
10.数据适配
为了解决复杂数据的显示,Android将适配器模式发挥到了极高的水平。
(1)视图适配
在Android中,视图显示的数据的来源复杂,可以是数据库、数组、列表甚至XML文件。和其它平台一样,Android同样采用了视图和数据分离的设计,但其设计得较精巧。
为了适配数据,需要进行以下工作:
创建列表项布局文件,根据数据源创建相应的适配器,通过setAdapter方法设置适配器。
在列表项中,有时会出现Button等可单击的控件,为了使Button和列表项均能相应单击事件,避免列表项无法获得焦点,在加载时需通过相关控件的setFocusable时控件不会再单击列表项普通区域(非可单击控件区域)时先获得焦点。
BaseAdapter的适配器主要是在其getView方法中进行。CursorAdapter的适配器主要是在bingView和newView‘方法中进行的。
如果是在ListActivity中,且数据源是基本型,那么可以执行方式:getListView().setAdapter(new TestListAdapter())。
如果数据源时数据库型,必须先获取数据库光标。
执行头视图和尾视图添加的操作必须放在setAdapter方法前,这是因为在添加头视图或尾视图时,其适配器已经是HeaderViewListAdapter而非ListAdapter了。
(2)标准化解析
在进行开发时,某些数据如IP地址、文件大小、日期、时间等,往往有特定的格式,特别是日期、涉及本地化等因素,开发者自行生成符合用户习惯的显示时,会略显复杂。事实上。Android的android.text.format包提供了对类似数据的标准解析。
1)IP地址解析
WifiInfo info=mAccessPoint.getInfo();
int address=info.getIpAddress();
Formatter.formatIpAddress(address);
2)文件大小解析
文件大小的解析使用方法非常简单,主要位于android.text.format.Formatter类中。方法是:public static String formatFileSize(Context context, long number)。
formatFileSize方法会根据提供的number自动进行换算,当number为9230时,其返回的字符串为9.01.
3)日期解析
日期的解析和本地化有着密切的关系,对于不同的国家,年、月、日、的顺序甚至方式都会有所不同,采用的日历页有差异,。另外还涉及缩写和24小时制等因素,在Android中,日期的解析是通过android.text.format.DateFormat实现的。
在android.text.format.Time和android.text.format.DateUtils中页有关于日期和时间的处理。
在DateFormat中,年用y表示,月用M表示,日用d表示,12小时制的小时用h表示,24小时制的小时用k表示,分用m表示,秒用s表示,时区用z表示,星期用E表示,小写上下午分别用a和p表示,大写上下午分别用A和P表示。
4)格式化
Android为了统一起见,采用的缩写与字母的位数有关
格式化日期、时间DateFormat方法:
public static final CharSequence format(CharSequence inFormat, Date inDate)
public static final CharSequence format(CharSequence inFormat, long InTimeInMillis)
获取当前日期、时间的格式的DateFormat方法:
public static final java.text.DateFormat getDateFormat(Context context)
public static final java.text.DateFormat getTimeFormat(Context context)
判断系统设置是否是24小时制的DateFormat方法:
public static boolean is24HourFormat(Context context)
5)本地化
上、下午的表示在不同的语言中有不同的表示方法。获得一个本地化的上、下午表述的DateUtils方法:pulic static String getAMPMString(int ampm)。其参数为Calendar.AM或Calendar.PM。
返回星期的本地化表述的DateUtils方法:public static String getMonthString(int month, int abbrev),其中month的值可为Calendar.JANUARY,abbrev的值可为DateUtils.LENGTH_LONG、DateUtils.LENGTH_MEDIUM等。
11.Fragment
为了适应平板电脑分辨率高、屏幕尺寸大的特点,引入了Fragment的概念,本质上Fragment并非新型控件,而是FrameLayout的延伸。
在行为上,可以将Fragment理解为子Activity。Fragment拥有自己的生命周期,能够接收自己的数据事件。当然,Fragment受Activity控制,一个Activity可以由多个Fragment组成,Fragment的引入在一定程度上使Android界面开发变得复杂化。
根据适用的场景不同,Fragment针对对话框有DialogFragment,正对列表有ListFragment,针对属性设置有PreferenceFragment,正对WebView有WebViewFragment等多个子类。
(1)Fragment声明周期
和Activity一样,Fragment也有自己的声明周期。
容器概念在Fragment框架中显得非常重要,Activity本身可以作为Fragment的容器,但不易实现Fragment的动态切换;FrameLayout也可以作为Fragment的容器,适用于复杂的场景。Fragment的管理是通过FragmentManager进行的。另外Fragment还支持事务处理的概念,可以一次处理多个操作。
为了使用Fragment,必须将Fragment添加到backStack中并附着到具体的容器上。处理方法:
FragmentManager fragmentManager=getFragmentManager();
FragmentTransaction ft=fragmentManager.beginTransaction();
ExampleFragment fragment=new ExampleFragment();
ft.add(R.id.fragment_container, fragment); //第一个参数为容器的ID
ft.commit();
当Fragment中可以存储若干参数,通常在实例化Fragment时传入,这些参数可以是Int、String、CharSequence等。保持参数的方法:
public static DetailsFragment newInstance(int index){
DetailsFragment f=new DetailsFragment();
Bundle args=new Bundle();
args.putInt("index", index);
f.setArguments(args);
return f;
}
实例化Fragment的方法:
DetailsFragment details=(DetailsFragment)getFragmentManager().findFragmentById(R.id.details);
if(details ==null){
details=DetailsFragment.newInstance(index);
FragmentTransaction ft=getFragmentManaget().beginTransaction();
ft.replace(R.id.details, details);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
}
需要根据注意的是,当判断当前Activity中是否含有特定Fragment时,有两种判断方式,一种是根据该Fragment或其容器ID来判断;另一种是根据创建该Fragment时设定的标志(Tag)来判断。
根据标志查找Fragment的方法:getFragmentManager().findFragmentByTag("tag");
需要说明,如果在调用FragmentTransaction的add()方法和replace()方法时没有指定标志,默认的标志位NULL。
(2)ListFragment
在ListFragment中,默认布局中包括一个ListView,开发者可以自定布局,方法为onCreateView(),此时返回的视图中必须包含ID为android.R.id.list的ListView。
和早前的ListView相比,ListFragment简化了针对网络通信场景的设计。
public void setEmptyText(CharSequence text) //无数据时的提示
public void setListShown(boolean shown) //是否显示为进度条
和setListShown功能类似的方法为BaseAdapter的areAllItemsEnabled方法。
在设置适配器时,必须采用ListFragment.setListAdapter()方法,在ListView中常用的ListView.setAdapter()方法会跳过一些重要的初始化工作(如适配器的getView()方法)而导致程序异常。
(3)DialogFragment
和Dialog不同,DialogFragment用来显示对话框,此时对话框的显示、隐藏、销毁、不受Activity框架控制,而由DialogFragment控制,这就避免了对话框的创建和销毁的部分场景下管理困难的问题。
和ListFragment一样,DialogFragment也支持自定义对话框的视图,自定义视图的方法为onCreateView方法。如果对话框的实现时从早期代码中移植过来的,则可以通过onCreateDialog封装Dialog对象来减少开发时间。
需要注意的是,考虑到重力传感器带来的横竖屏切换功能,DialogFragment支持普通对话框显示和普通视图显示两种风格。
当作为普通对话框显示时,调用的方法:
DialogFragment newFragment=MyDialogFragment.newInstance();
newFragment.show(getFragmentManager(), "dialog")
当作为普通视图显示时,调用方法:
FragmentTransaction ft=getFragmentManager().beginTransaction();
DialogFragment newFragment=MyDialogFrament.newInstance();
ft.add(R.id.embedded, newFragment);
ft.connit();
DialogFragment的这种能力,简化了屏幕旋转时的用户体验设计,但又在某种程度上使实现复杂化了。
(4)PreferenceFragment
PreferenceFragment的实现可以通过PreferenceManager进行管理,PreferenceManager支持通过XML资源文件和Intent来创建Preference。
(5)WebViewFragment
WebViewFragment封装了WebView,随着WebViewFragment的暂停或恢复,WebView也进入暂停或恢复状态。