zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

Android控件篇

Android 控件
2023-09-14 09:06:21 时间

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<String, String>extraHeaders)。

                        默认情况下,通过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<T extends android.widget.Adapter>----android.widget.AbsListView----android.widget.ListView

                在开发列表时,主要有适配器、单击事件处理、单选/多选处理等须要考虑。当中适配器包含数据源为数据库的适配器(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<T extends android.widget.Adapter>----android.widget.AbsListView----android.widget.ListView----android.widget.ExpandableListView

                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<T extends android.widget.Adapter>----android.widget.AbsListView----android.widget.GridView

                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)输入数据的控制

                        输入数据的控制通常在布局的配置中进行。能够设置的数据类型包含password、纯数字、password验证码等。

                        当EditrText用于输入密码时,能够配置android:password="true",这样能够使输入信息在1s后变为“*”符号。

                        当EditText用于输入纯数字时。能够配置android:numeric="true"。用户仅能输入0~9等10个数字。

                        当EditText用于password验证时,能够配置android:capitalize="***"。使输入信息仅能为“***”,避免了开发人员再用正則表達式进行推断。

                        在较新的android版本号中,Google为了统一。使用android:inputType属性配置,其属性值包含none(不可编辑)、textPassword(password)、textVisiblePassword(password可见)、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<T extends android.widget.Adapter>----android.widget.AbsSpinner----android.widget.Spinner

                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)文件大小解析

                        文件大小的解析用法很easy。主要位于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也进入暂停或恢复状态。