最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

UI進階

2021-07-06 09:31 作者:獨行D暗靈  | 我要投稿

Fragment

  • Android從3.0開始引入Fragment(碎片)

  • 允許將Activity拆分成多個完全獨立封裝的可重用的組件

  • 每個組件擁有自己的生命周期和UI布局

  • 為不同型號、尺寸、分辨率的設備提供統(tǒng)一的UI設計方案


  • 自定義的Fragment必須繼承Fragment類或其子類

創(chuàng)建Fragment

  • 通常在創(chuàng)建Fragment時,需要實現(xiàn)三個方法∶

    1. onCreate()

    2. onCreateView()

    3. onPause()

  • 將Fragment加載到Activity中主要有兩種方式∶

    1. 把Fragment添加到Activity的布局文件中

    2. 在Activity的代碼中動態(tài)添加Fragment


管理Fragment

  • 通過FragmentManager實現(xiàn)管理Fragment對象的管理

  • 通過getFragmentManager()獲取FragmentManager對象

  • FragmentManager能夠完成以下三方面的操作︰

    1. 通過findFragmentByld()或findFragmentByTag()方法,來獲取Activity中已存在的Fragment對象

    2. 通過popBackStack()方法將Fragment從Activity的后退棧中彈出

    3. 通過addOnBackStackChangedListerner()方法來注冊一個偵聽器以監(jiān)視后退棧的變化


  • 獲取FragmentTransaction對象

?FragmentManager fragmentManager=getFragmentManager ( ) ;
?FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();


FragmentTransaction被稱作Fragment事務,與數(shù)據庫事務類似,F(xiàn)ragment事務代表了Activity對Fragment執(zhí)行的多個改變操作。


  • 事務中動作的執(zhí)行順序可以隨意,但需注意以下兩點:

    • 程序的最后必須調用commit()方法

    • 程序中添加了多個Fragment對象,顯示的順序跟添加順序一致

    • 當刪除Fragment對象時,在沒有調用addToBackStack()方法情況下,F(xiàn)ragment對象會被銷毀

調用commit(O后,事務并不會馬上提交,而是會在Activity的UI線程中等待直到線程能執(zhí)行的時候才執(zhí)行。


與Activity通訊

  • Fragment獲取其所在的Activity中的組件

?View listview=getActivity ( ).findViewById(R.id.list);

  • Activity獲取指定Frament實例

?ExampleFragment fragment = (ExampleFragment)getFragmentManager().findFragmentById(R.id.example_fragment)
?

  • 在Fragment中定義回調接口

?public static class FragmentA extends ListFragment {
? //Activity必須實現(xiàn)下面的接口
? public interface OnNewsSelectedListener {
? ? ? ? ?//傳遞當前被選中的標題的id
? ?public void onNewsSelected ( long id) ;
? ? ?}
?}

  • Fragment與Activity共享事件

?public static class FragmentA extends ListFragment {
? ? ?OnNewsSelectedListener mListener;
? ? ?//.. ....省略
? ? ?@override
? ? ?public void onListItemClick(Listview l,View v,int position,long id){
? ? ? ? ?mListener.onNewsselected (id);
? ? ?}
? //......省略
?}

在數(shù)據傳遞時,也可以直接把數(shù)據從FragmentA傳遞給FragmentB,不過該方式降低了Fragment的可重用的能力?,F(xiàn)在的處理方式只需要把發(fā)生的事件告訴宿主,由宿主決定如何處置,以便Fragment的重用性更好。


Fragment的生命周期

  • Fragment的生命周期具有以下四個狀態(tài):

    1. 活動狀態(tài)

    2. 暫停狀態(tài)

    3. 停止狀態(tài)

    4. 銷毀狀態(tài)

  • Fragment生命周期中的方法

方法功能描述onAttach()當一個Fragment對象關聯(lián)到一個Activity時被調用onCreate()初始化創(chuàng)建Fragment對象時被調用onCreateView()當Activity獲得Fragment的布局時調用此方法onActivityCreated()當Activity對象完成自己的onCreate()方法時調用onStart()Fragment對象在UI界面可見時調用onResume()Fragment對象的UI可以與用戶交互時調用onPause()由Activity對象轉為onPause狀態(tài)時調用onStop()有組件完全遮擋,或者宿主Activity對象轉為onStop狀態(tài)時調用onDestroyView()Fragment對象清理View資源時調用,即移除Fragment中的視圖onDestroy()Fragment對象完成對象清理View資源時調用onetach()當Fragment被從Activity中刪掉時被調用


  • Fragment和Activity兩者之間生命周期的關系

    • Activity直接影響其所包含的Fragment的生命周期

    • Fragment的回調方法要比Activity多,多出的方法主要用于與Activity的交互

    • 當Activity進入運行狀態(tài)時(即running狀態(tài)) ,才允許添加或刪除Fragment

    • 有當Activity處于resumed狀態(tài)時,F(xiàn)ragment的生命周期才能獨立運轉

    • 其他階段依賴于Activity的生命周期


靜態(tài)方式

  • Fragment的生命周期調用過程:

    • onPause()

    • onStop()

    • onDestroyView()

    • onDestroy()

    • onDetach()

    • onStart()

    • onResume()

    • onPause()

    • onStop()

    • onAttach()

    • onCreate()

    • onCreateView()

    • onActivityCreated()

    • onStart()

    • onResume()

    • 當首次展示布局頁面時,其生命周期方法調用的順序是︰

    • 當關閉手機屏幕或者手機屏幕變暗時,其生命周期方法調用的順序是︰

    • 當對手機屏幕解鎖或者手機屏幕變亮時,其生命周期方法調用的順序是︰

    • 當對Fragment所在屏幕按返回鍵時,其生命周期方法調用的順序是︰


Menu菜單和ToolBar

Menu菜單

  • Android中提供的菜單有如下幾種

    • 選項菜單

    • 子菜單

    • 上下文菜單

    • 圖標菜單

    • 擴展菜單

Options Menu選項菜單

  • 系統(tǒng)創(chuàng)建菜單的方法主要有以下兩種:

    • onCreateOptionsMenu():創(chuàng)建選項菜單

    • onCreateContextMenu():創(chuàng)建上下文菜單

  • 上下文菜單使用onCreateOptionsMenu()回調方法對菜單進行初始化;使用onPrepareOptionsMenu()方法動態(tài)改變選項菜單的內容


  • 創(chuàng)建并顯示Menu菜單

?@override
?public boolean onCreateOptionsMenu (Menu menu) {
? ? ?super.onCreateOptionsMenu (menu) ;
? ? ?//添加4個菜單項,分成2組
? ? ?int group1 = 1;
? ? ?int gourp2 = 2;
? ? ?menu.add (group1, 1, 1,"菜單項1");
? ? ?menu.add (group1, 2,2,"菜單項2");
? ? ?menu.add (gourp2,3,3,"菜單項3");
? ? ?menu. add (gourp2, 4, 4,"菜單項4");
? ? ?//顯示菜單
? ? ?return true;
?}
?


響應菜單項

  • Android為菜單提供了兩種響應方式:

    • onOptionsItemSelected()方法

    • onMenuItemSelected()方法

  • onMenuItemSelected與onOptionsItemSelected區(qū)別:

    • onMenuItemSelected():當選擇選項菜單或上下文菜單都會觸發(fā)該事件處理方法

    • onOptionsItemSelected():該方法只在選項菜單被選中時才會被觸發(fā)

如果Activity中同時重寫onMenuItemSelected()和onOptionsItemSelected()方法時,當點同一個菜單項時,將先調用onMenuItemSelected()方法,然后調用onOptionsItemSelected()方法性。


  • onOptionsItemSelected()方法

?@override
?public boolean onOptionsItemSelected (MenuItem item){
? ? ?switch (item. getItemId () ){
? ? ? ? ?case 1:
? ? ? ? ? ? ?Toast.makeText(this,"菜單項1",Toast. LENGTH_SHORT) .show ();
? ? ? ? ? ? ?break;
? ? ? ? ?case 2: ...
? }
? return super.onOptionsItemSelected (item) ;
?}


  • onMenuItemSelected()方法

?@override
?public final boolean onMenuItemSelected (intfeatureId,MenuItem item){
? ? ?switch (item. getItemId()) {
? ? ? ? ?case 1:
? ? ? ? ? ? ?Toast.makeText(this,"菜單項11",Toast.LENGTH_SHORT).show ();
? ? ? ? ?case 2:
? ? ? ? ?case 3:
? ? ? ? ?case 4:
? }
? return super.onMenuItemSelected (featureId, item ) ;
?}


SubMenu子菜單

  • 創(chuàng)建步驟:

    1. 重寫Activity類的onCreateOptionsMenu()方法

    2. 調用Menu的addSubMenu()方法添加子菜單

    3. 調用SubMenu的add()方法為子菜單添加菜單項

    4. 重寫Activity類的onOptionsItemSelected()方法

當調用setIcon)方法設置圖標時,圖標無法顯示是因為在MenuBuilder的optionalIconsVisible屬性默認為false。當要顯示圖標時,需要通過反射機制調用MenuBuilder對象的setOptionalIconsVisible)方法,將其設置為true即可。


  • 創(chuàng)建子菜單

?public boolean onCreateOptionsMenu (Menu menu){
? ? ?//添加子菜單
? ? ?SubMenu subMenu = menu.addSubMenu ( 0,2,Menu .NONE,"基礎操作");
? ? ?subMenu .setIcon (android.R.drawable.ic_menu_manage);setIconEnable (menu);
? ? ?//添加子菜單項
? ? ?//重命名菜單項
? ? ?MenuItem renameItem = subMenu . add(2,201,1,"重命名");
? ? ?renameItem.setIcon (android.R.drawable.ic_menu_edit);
? ? ?//......
?}
?


ContextMenu上下文菜單

  • 上下文菜單是通過調用ContextMenu接口中的方法來實現(xiàn)

  • onCreateContextMenu()方法來生成ContextMenu對象

?onCreatecontextMenu(contextMenu menu,viewv ,ContextMenu .ContextMenuInfo menuInfo)
?

當需要傳遞額外信息時,需要重寫getContextMenuInfo(方法,并返回一個帶有數(shù)據的ContextMenuInfo實現(xiàn)類對象。


使用XML資源生成菜單

  • 使用XML資源生成菜單項的步驟:

    1. 在res目錄中創(chuàng)建menu子目錄

    2. 在menu子目錄中創(chuàng)建一個Menu Resource file ( XML文件)

    3. 使用XML文件的資源ID,在Activity中將XML文件中所定義的菜單元素添加到menu對象中

    4. 通過判斷菜單項對應的資源ID來實現(xiàn)響應的事件處理

  • 使用XML資源生成菜單1

?<menu>
? ? ?<group android: id="@+id/ group1" >
? ? ? ? ?<item
? ? ? ? ? ? ? ?android: id="@+id/ item_send"
? ? ? ? ? ? ? ?android: title="發(fā)送"/>
? ? ? ? ?<item
? ? ? ? ? ? ? ?android:id="@+id/ item_rename"
? ? ? ? ? ? ? ?android: title="重命名"/>
? ? ? ? ?<item
? ? ? ? ? ? ? ?android: id="@+id/ item_del"
? ? ? ? ? ? ? ?android: title="刪除"/>
? ? ?</group>
?</menu>
?

  • 使用XML資源生成菜單2

?contextMenuBtn = (Button)
?findViewById(R.id.contextMenuBtn) ;
?//為按鈕注冊上下文菜單,長按按鈕則彈出上下文菜單
?this.registerForContextMenu(contextMenuBtn);
?@override
?public void onCreateContextMenu(ContextMenu menu,View v,ContextMenuInfo menuInfo){
? ? ?menu.setHeaderTitle ("文件操作");
? ? ?getMenuInflater().inflate(R.menu.context_menu,menu);
?}

  • 資源文件實現(xiàn)子菜單

?<item android :title="系統(tǒng)設置">
? ? ?<menu>
? ? ?<item android:id="@+id/mi_display_setting"
? ? ? ? ? ?android:title="顯示設置"/>
? ? ?<item android:id="@+id/mi_network_setting"
? ? ? ? ? ?android:title="網絡設置"/>
? ? ?<!--其他菜單項-->
?</menu>
?

  • 為菜單項添加圖標

?<item
? ? ? ?android:id="@+id/mi_exit"
? ? ? ?android:title="退出"
? ? ? ?android : icon="@drawable/exit"/ >
?

  • 設置菜單項的可選策略

?<group android:id="... "
? ? ? ? android: checkableBehavior="all">
?<!--菜單項-->
?</group>
?

  • 使用android:checked設置特定菜單項

?<item
? ? ? ?android:id="..."
? ? ? ?android:title="sometitle"
? ? ? ?android:checked="true"/>
?

  • 為菜單項添加圖標

?<item
? ? ? ?android:id=" ..."
? ? ? ?android:title="sometitle"
? ? ? ?android:enabled="false"/>
?

  • 設置菜單項可見/不可見

?<item
? ? ? ?android:id="..."
? ? ? ?android:title="sometitle"
? ? ? ?android:visible="false"/>
?


Toolbar操作欄

  • Material Design風格的導航組件

  • 取代Actionbar

  • 為開發(fā)者預留許多可定制修改的余地∶

    1. 支持添加一個或多個的自定義組件

    2. 設置App的Logo圖標

    3. 支持設置標題和子標題

    4. 設置導航欄圖標

    5. 支持Action Menu


方法功能描述setTitle(int resId)設置標題setSubtitle(int resId)設置子標題setTitleTextColor(int color)設置標題字體顏色setSubtitleTextColor(int color)設置子標題字體顏色setNavigationIcon(Drawable icon)設置導航欄的圖標setLogo(Drawable darwable)設置Toolbar的Logo圖標


高級組件

AdapterView與Adapter

  • AdapterView實現(xiàn)過程類似于MVC架構

  • AdapterView實現(xiàn)過程

    • 控制層:Adapter適配器承擔了控制層的角色

    • 視圖層:AdapterView用于將前端顯示和后端數(shù)據分離

    • 模型層:數(shù)組、XML文件等形式的數(shù)據

  • AdapterView具有以下特征:

    • AdapterView繼承了ViewGroup,其本質上是容器

    • AdapterView可以包括多個”列表項“,并將”列表項“以合適的形式顯示出來

    • AdapterView所顯示的”列表項“是由Adapter提供,通過AdapterVIew的setAdapter()方法來設置Adapter適配器。


  • AdapterView及其子類的繼承關系

通常將ListView、GridView、Spinner和Gallery等AdapterView子類作為容器,然后使用Adapter為容器提供“列表項”,AdapterView負責采用合適的方式顯示這些列表項。


  • Adapter的常用子接口:

    • ListAdapter接口

    • baseAdapter抽象類

    • SImpleCursorAdapter類

    • ArrayAdapter類

    • SimpleAdapter類

Adapter對象扮演著橋梁的角色,通過橋梁連接著AdapterView和所要顯示的數(shù)據。Adapter提供了一個連通數(shù)據項的途徑,將數(shù)據集呈現(xiàn)到View中。


ListView列表視圖

  • ListView通常具有兩個職責:

    • 將數(shù)據填充到布局,以列表的方式來顯示數(shù)據

    • 處理用戶的選擇、點擊等操作SimpleCursorAdapter

  • 通常創(chuàng)建ListView的兩種方式:

    • 直接使用ListView進行創(chuàng)建

    • 使用Activity繼承ListActivity,實現(xiàn)ListView對象的獲取

XML屬性功能描述android:divider設置列表的分隔條android:dividerHeight用來指定分割條的高度android:entries指定一個數(shù)組資源android:footerDividersEnabled各個footer之間繪制分割條android:headerDividersEnabled各個header之間繪制分割條


  • ListView從AbsListView中繼承的屬性

XML屬性描述android:cacheColorHint用于設置該列表的背景始終以單一、固定的顏色繪制android:choiceMode為視圖指定選擇的行為adnroid:drawSelectorOnTop如果為true,選中的列表項將會顯示在上面android:fastScrollEnabled用于設置是否允許使用快速滾動滑塊android:listSelector設置選中項顯示的可繪制對象android:scrollingCache設置在滾動時是否使用繪制緩存,默認為true。android:smoothScrollbar列表會使用更精確的基于條目在屏幕上的可見像素高度的計算方法android:stackFromBottom設置是否將列表項從底部開始顯示android:textFilterEnabled設置是否對列表項進行過濾android:transcriptMode設置該組件的滾動模式

  • 使用ListView步驟:

    • 準備ListView所要顯示的數(shù)據

    • 使用數(shù)組或List集合存儲數(shù)據

    • 創(chuàng)建適配器,作為列表項數(shù)據源

    • 將適配器對象添加到ListView,并進行展示


實現(xiàn)ListView

  • ListView組件本身默認的id為@id/android:list

  • 直接調用getListView()

  • 在ListActivity中顯示其他組件的步驟∶

    • 先定義Activity的布局文件,在布局UI界面時先增加其他組件,再添加一個ListView組件用于展示數(shù)據

    • 在Activity中通過setContentView()方法來添加布局對象


  • 獲取并綁定Activity中的ListView

?<!-— 默認的Listview -->
?<Listview
? ? ? ? ? ?android: id="@+id/ listview"
? ? ? ? ? ?android: layout_width="match_ parent"
? ? ? ? ? ?android: layout_height="0dip"
? ? ? ? ? ?android: layout_weight="1"
? ? ? ? ? ?android : drawselectorOnTop="false" />
?

通過繼承ListActivity來實現(xiàn)ListView時,當用戶也定義了一個id為@id/android:list的ListView,與ListActivity中的默認ListView組件id一致,則使用setContentViewO方法可以指定用戶定義的ListView作為ListActivity的布局,否則會使用系統(tǒng)提供的ListView。


  • 實現(xiàn)圖文混排步驟︰

    • 定義行選項的布局格式

    • 自定義一個Adapter,并重寫其中的關鍵方法

    • 注冊列表選項的單擊事件

    • 創(chuàng)建Activity并加載對應的布局文件


GridView網格視圖

  • 用于按行和列的分布方式來顯示多個組件

  • 通過Adapter來提供顯示數(shù)據

XML屬性描述android:numColumns設置列數(shù)android:columnWidth設置每一列的寬度android:stretchMode設置拉伸模式android:verticalSpacing設置各個元素之間的垂直邊距android:horizontalSpacing設置各個元素之間的水平邊距

  • 創(chuàng)建GridView的步驟︰

    • 在布局文件中使用<GridView>元素來定義GridView組件

    • 自定義一個Adapter,并重寫其中的關鍵方法

    • 注冊列表選項的單擊事件

    • 創(chuàng)建Activity并加載對應的布局文件


WebView

  • WebView用于在App中加載網頁

  • 使用Web檢查器來調試HTML、CSS、Javascript等代碼

  • 可以對URL請求、頁面加載、渲染以及頁面的交互進行處理


  • WebView具有以下幾個輔助類:

    • WebChromeClient:輔助WebView實現(xiàn)與瀏覽器的交互動作

    • WebViewClient:幫助WebView處理各種通知、請求事件等

    • WebSettings : x對WebView進行配置和管理

    • addJavascriptInterface():將Java對象綁定到WebView中,以便JavaScript從頁面中控制Java對象,實現(xiàn)WebView與HTML頁面的交互


在Android 4.3及以前版本WebView內部采用Webkit渲染引擎,在Android 4.4以上版本采用chromium渲染引擎來渲染View的內容。


  • 使用WebView的步驟:

    ?<uses-permission android:name="android.permission.INTERNET"/>
    ?
    • 在布局文件中創(chuàng)建WebView元素

    • 在代碼中加載網頁

    • 在AndroidManifest.xml中配置訪問權限

  • 使用loadData()或loadDataWithBaseURL()方法將HTML代碼片段或本地存儲的HTML頁面內容顯示出來

  • loadDataWithBaseURL()不能加載來自網絡的內容

    • baseUrl:基礎目錄

    • data:被加載的內容

    • mimeType :指定資源的媒體類型

    • Encoding :設置網頁的編碼格式

    • historyUrl :歷史記錄字段


ViewPager

  • ViewPager是android擴展包v4包中的類,這個類可以讓用戶左右切換當前的view

  • ViewPager類直接繼承了ViewGroup類,所有它是一個容器類,可以在其中添加其他的view類。

  • ViewPager類需要一個PagerAdapter適配器類給它提供數(shù)據。

  • ViewPager經常和Fragment一起使用,并且提供了專門的FragmentPagerAdapter和FragmentStatePagerAdapter類供Fragment中的ViewPager使用


  • 最普通的PagerAdapter需要重寫下面的四個方法:

    • ①將給定位置的view添加到ViewGroup(容器)中,創(chuàng)建并顯示出來

    • ②返回一個代表新增頁面的Object(key),通常都是直接返回view本身就可以了

    • getCount():獲得viewpager中有多少個view

    • destroyltem():移除一個給定位置的頁面。適配器有責任從容器中刪除這個視圖。這是為了確保在finishUpdate(viewGroup)返回時視圖能夠被移除。

    • instantiateItem():

    • isViewFromObject():判斷instantiateltem(ViewGroup, int)函數(shù)所返回來的Key與一個頁面視圖是否是代表的同一個視圖



自定義組件

  • Android中所有控件和布局的基類都是View,自定義控件也就是繼承View或者View的派生類,然后再重寫類中的內部方法。

  • 通常來說自定義控件分為三種:

    • 自定義View:繼承View

    • 基于現(xiàn)有組件∶繼承View的派生類

    • 組合的方式∶自定義控件中包含了其他的組件

  • 自定義控件繪制過程︰

    • 創(chuàng)建一個類,繼承View類

    • onMeasure()方法,測量計算視圖的大小

    • onLayout()方法,設置視圖在屏幕中顯示的位置

    • onDraw()方法,繪制視圖

為什么要在安卓中使用自定義控件? 安卓在使用中大多數(shù)使用已有的一些控件,用法比較簡單,還有一部分是比較復雜的、用戶自己想的控件,這些就需要進行自定義控件!


  • 自定義View的方法,有以下十三種:

    • onFinishInflate()︰回調方法,當應用從XML加載該組件并用它構建界面之后調用的方法

    • onMeasure()∶檢測View組件及其子組件的大小

    • onLayout():當該組件需要分配其子組件的位置、大小時

    • onSizeChange():當該組件的大小被改變時

    • onDraw():當組件將要繪制它的內容時

    • onKeyDown :當按下某個鍵盤時

    • onKeyUp :當松開某個鍵盤時



UI進階的評論 (共 條)

分享到微博請遵守國家法律
鲁山县| 怀集县| 吉水县| 淳化县| 宁津县| 吉首市| 崇州市| 仙居县| 来凤县| 绥化市| 东阳市| 逊克县| 麦盖提县| 万盛区| 西畴县| 中牟县| 视频| 平山县| 乃东县| 宜兰市| 镇雄县| 历史| 嘉黎县| 乐都县| 屯门区| 山阳县| 石景山区| 清新县| 浙江省| 九龙城区| 满城县| 巴彦淖尔市| 桓仁| 南和县| 呼伦贝尔市| 凌源市| 揭东县| 顺平县| 桃园市| 岑巩县| 犍为县|