《【教学课件】第7章Fragment片段与动作列选单.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第7章Fragment片段与动作列选单.ppt(73页珍藏版)》请在三一办公上搜索。
1、第7章 Fragment片段與動作列選單,7-1 再談Android事件處理7-2 動作列選單7-3 上下文選單7-4 彈出式選單7-5 Fragment片段,7-1 再談Android的事件處理,7-1-1 Android介面元件的事件 7-1-2 長按事件:onLongClickListener 7-1-3 鍵盤事件:onKeyListener 7-1-4 觸控事件:onTouchListener,7-1-1 Android介面元件的事件 使用View類別處理介面元件的事件,Android事件處理主要是發生在Activity活動類別的介面元件,我們是透過View類別來處理介面元件產生的事件
2、。基本上,活動的使用介面是View和ViewGroup物件所組成,在View類別定義有一組巢狀傾聽者介面,提供相關回撥方法(Callback Methods,即介面方法)來幫助我們執行事件處理,例如:觸摸Button元件,OnTouchListener介面的onTouch()方法就會呼叫。因為Activity類別本身已經實作一些傾聽者介面來處理事件,所以,有些事件我們需要自行建立和註冊傾聽者物件,例如:Click事件;有一些只需覆寫相關回撥方法,例如:KeyDown和KeyUp事件。,7-1-1 Android介面元件的事件 事件回撥方法,Android提供相當多事件回撥方法(Event Ca
3、llback Methods),簡單的說,事件傾聽者就是一組View類別的Java介面,在介面擁有一些回撥方法來處理使用者輸入的相關事件。常用的事件回撥方法,如下表所示:,7-1-2 長按事件:onLongClickListener,長按事件(LongClick Event)是使用者觸摸螢幕且停留超過一秒鐘時觸發,相當於Windows作業系統按下滑鼠右鍵觸發的事件。基本上,長按事件的事件處理架構和Click事件相同,它是實作OnLongClickListener傾聽者介面的onLongClick()方法,如下所示:public boolean onLongClick(View v)/處理Lon
4、gClick事件的程式碼 return false;,7-1-3 鍵盤事件:onKeyListener 說明,鍵盤事件(Keyboard Event)主要是指按下鍵盤按鍵的KeyDown和放開按鍵的KeyUp事件,因為Activity類別實作KeyEvent.Callback介面,所以,我們只需在繼承類別覆寫onKeyDown()和onKeyUp()方法就可以處理這兩種事件。,7-1-3 鍵盤事件:onKeyListener KeyDown事件,以KeyDown事件的onKeyDown()方法為例,其架構如下所示:public boolean onKeyDown(int keyCode,Key
5、Event event)if(keyCode=KeyEvent.KEYCODE_DEL)/按下的是Del鍵 return true;return super.onKeyDown(keyCode,event);,7-1-4 觸控事件:onTouchListener 說明,Android行動裝置的特點是觸控螢幕,因為Click事件也適用在觸控螢幕,但是Touch事件不能使用在行動裝置的鍵盤,換句話說,對於大部分介面元件來說,建議使用Click事件即可,只有一些特殊觸控操作的手勢(Gestures)才需要使用到Touch事件。,7-1-4 觸控事件:onTouchListener 動作,觸控事件(T
6、ouch Event)主要是在處理手勢的三種動作:ACTION_DOWN、ACTION_MOVE和ACTION_UP(類似滑鼠拖拉過程),如下所示:ACTION_DOWN:手勢動作的開始,可以在手指第1個接觸點的座標建立一個虛擬指標,類似滑鼠游標,只是你看不見。ACTION_MOVE:當指標在螢幕上移動時就產生此動作(即手指在螢幕上滑動,如同滑鼠游標在螢幕上移動)。ACTION_UP:手指離開螢幕,可以取得最後1個接觸點指標的座標。,7-1-4 觸控事件:onTouchListener 判斷動作,在實作的onTouch()方法可以從參數MotionEvent判斷是哪一種動作,如下所示:publ
7、ic boolean onTouch(View v,MotionEvent event)int act=event.getAction();switch(act)case MotionEvent.ACTION_DOWN:/處理ACTION_DOWN break;case MotionEvent.ACTION_UP:/處理ACTION_UP break;case MotionEvent.ACTION_MOVE:/處理ACTION_MOVE break;return false;,7-2 動作列選單,7-2-1 動作列的基礎 7-2-2 建立動作列選單 7-2-3 子選單 7-2-4 選項按鈕選單
8、,7-2 動作列選單 種類,Android提供相關機制可以替活動或指定元件新增選單,主要的選單有三種,如下所示:選項選單(Options Menu):當使用者按下行動裝置【MENU】鍵,可以在下方顯示選項選單,因為目前裝置大多沒有【MENU】鍵,所以,選項選單已經整合至動作列的overflow選單圖示,也稱為Overflow選單。上下文選單(Context Menu):即Windows作業系統右鍵的快顯功能表,當使用者長按介面元件超過一秒鐘,就會顯示上下文選單。彈出式選單(Popup Menu):我們可以在停泊元件下方顯示類似對話方塊的彈出式選單,如果空間不足,就顯示在上方。,7-2-1 動作
9、列的基礎-認識動作列1,動作列是位在活動上方的一個固定區域,一種介面元件來顯示活動的標題文字、圖示和切換與巡覽功能,也可以用來指示Android應用程式目前所在的活動,和顯示選單(Menu)。,7-2-1 動作列的基礎-認識動作列2,Android最常使用的是選項選單(Options Menu),當使用者按下行動裝置的實體【MENU】鍵,可以在下方顯示最多6個選項的選單。不過,目前Android行動裝置大多已經沒有實體【MENU】鍵,選項選單也整合至動作列的overflow選單圖示,對於沒有實體【MENU】鍵的裝置來說,我們需要點選標題列最右方【垂直3點】圖示來開啟選單,如右圖所示:,7-2-
10、1 動作列的基礎 選單資源的XML檔案(說明),選單資源XML檔案的內容是在選單中顯示的選項,我們可以直接使用XML標籤來定義選單的選項,選單資源檔可以使用在動作列選單、上下文選單和彈出式選單。,7-2-1 動作列的基礎 選單資源的XML檔案(新增),在Android Studio專案Ch7_2_1的Project視窗的【appres】上,執行【右】鍵快顯功能表的New/Android resource file指令新增資源檔,可以看到New Resource File對話方塊。,7-2-1 動作列的基礎 選單資源的XML檔案(範例),7-2-1 動作列的基礎 選單資源的XML檔案(選單圖示)
11、,選單圖示是位在專案實際路徑app/src/main/res/drawable目錄下的同名圖示檔(Project視窗如果選【Android】檢視,顯示的專案路徑和實際路徑並不相同),如下圖所示:,7-2-1 動作列的基礎 再談ActionBarActivity活動類別1,ActionBarActivity類別是Activity類別的子類別,可以讓我們在活動使用AppCompat支援函數庫(Support Library)的動作列功能,以便讓API 7以上版本(Android 2.1)的活動都擁有一致的動作列。總之,如果在Android活動需要使用動作列,我們需要使用ActionBarActiv
12、ity類別(Minimum SDK如果選最新API 21 Android 5.0版,可以直接使用Activity類別,如果選之前版本都需要使用AppCompat支援函數庫來相容最新版動作列)。,7-2-1 動作列的基礎 再談ActionBarActivity活動類別2,首先在Java類別檔開頭匯入ActionBarActivity類別,如下所示:import android.support.v7.app.ActionBarActivity;MainActivity類別需要改為繼承ActionBarActivity,而不是Activity類別,如下所示:public class MainActi
13、vity extends ActionBarActivity.,7-2-1 動作列的基礎 將選單資源XML檔案建立成選單,因為選單資源XML檔案不會自動成為選單,我們需要執行Code/Override Methods指令,在MainActivity類別新增onCreateOptionsMenu()方法來將選單資源建立成選單,如下所示:Override public boolean onCreateOptionsMenu(Menu menu)MenuInflater inflater=getMenuInflater();,menu);return super.onCreateOptionsMen
14、u(menu);,7-2-2 建立動作列選單 說明,Android Studio的【Blank Activity】活動範本預設新增動作列的menu_main.xml和相關Java程式碼(為了縮短程式碼長度,本書很多範例刪除這部分程式碼),在這一節筆者準備直接使用此活動範本來建立動作列選單。,7-2-2 建立動作列選單 處理動作列選單的選項,在第7-2-1節已經說明如何建立動作列選單,這一節將說明處理選擇的選項,我們需要在MainActivity類別覆寫onOptionsItemSelected()方法來判斷使用者的選擇。【Blank Activity】活動範本會自動產生此方法,如下所示:Ove
15、rridepublic boolean onOptionsItemSelected(MenuItem item)switch(item.getItemId()case:.break;case:.break;return super.onOptionsItemSelected(item);,7-2-3 子選單 說明,在動作列選單中,每一個選項可以是另一個選單,稱為子選單(Sub Menu),不過,子選單並不允許再擁有另一個子選單。例如:Android Studio專案Ch7_2_3的執行結果,如下圖所示:,7-2-3 子選單 選單資源的XML檔,在選單資源的XML檔的標籤中,可以看到另一個men
16、u元素,如下所示:,7-2-3 子選單 onOptionsItemSelected()方法,public boolean onOptionsItemSelected(MenuItem item)TextView output=(TextView);switch(item.getItemId()case R.id.item01:output.setText(項目1);return true;case R.id.item02:output.setText(子選單);return true;case R.id.item03:output.setText(子項目1);return true;case
17、R.id.item04:output.setText(子項目2);return true;case R.id.item05:output.setText(項目2);return true;return super.onOptionsItemSelected(item);,7-2-4 選項按鈕選單 說明,在動作列選單也可以建立成選擇功能的選項按鈕選單,我們可以群組選項來建立成選項按鈕,例如:Android Studio專案Ch7_2_4的執行結果,如下圖所示:,7-2-4 選項按鈕選單 選單資源XML檔,選單資源XML檔是使用標籤來群組選項建立成選項按鈕,如下所示:.,7-2-4 選項按鈕選單
18、onOptionsItemSelected()方法,在覆寫onOptionsItemSelected()方法是使用android:id屬性值判斷執行功能,不過,我們需要自行處理是否選擇指定選項,如下所示:public boolean onOptionsItemSelected(MenuItem item)Button btn=(Button);switch(item.getItemId()case:if(item.isChecked()item.setChecked(false);else item.setChecked(true);btn.setBackgroundColor(Color.R
19、ED);return true;.case:if(item.isChecked()item.setChecked(false);else item.setChecked(true);btn.setBackgroundColor(Color.GREEN);return true;return super.onOptionsItemSelected(item);,7-3 上下文選單,7-3-1 浮動上下文選單 7-3-2 上下文的動作模式,7-3 上下文選單,上下文選單(Context Menu)就是Windows作業系統右鍵的快顯功能表,當使用者長按介面元件超過一秒鐘,就會顯示上下文選單。And
20、roid提供2種方法來建立上下文選單,如下所示:浮動上下文選單:類似對話方塊的選單,如果元件支援,當長按介面元件,就會顯示浮動上下文選單。上下文的動作模式:此模式是系統實作的動作模式(Action Mode),可以在動作列上方顯示上下文動作列,並且支援複選,如果是開發Android 3.0以上版本的應用程式,建議使用此模式來建立上下文選單。,7-3-1 浮動上下文選單-說明,類似對話方塊的選單,如果元件支援,當長按介面元件,就會顯示浮動上下文選單。在Android建立浮動上下文選單和之前的選單相似,我們一樣是使用選單資源檔來建立選單的選項。,7-3-1 浮動上下文選單-建立上下文選單選單,如同
21、動作列選單,我們也是在onCreateContextMenu()方法將選單資源建立成上下文選單,如下所示:menu.setHeaderTitle(選擇按鈕的背景色彩);,menu);上述程式碼呼叫setHeaderTitle()方法指定標題文字後,依序使用串流方法呼叫getMenuInflater()和inflate()方法將選單資源的選項新增至Menu物件。上下文選單處理選取選項的事件處理是覆寫onContextItemSelected()方法,其結構和onOptionsItemSelected()方法相同,筆者就不重複說明。,7-3-1 浮動上下文選單-註冊上下文選單,上下文選單是附屬在指
22、定介面元件,我們需要註冊上下文選單,例如:Button元件或LinearLayout版面配置等,以便長按介面元件可以顯示上下文選單,如下所示:public void onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState););LinearLayout layout=(LinearLayout);registerForContextMenu(layout);,7-3-2 上下文的動作模式 說明,上下文的動作模式(Contextual Action Mode)是在動作列上方顯示上下文動作列,此模式的上下文選單支援複
23、選。建立的基本步驟是在實作ActionMode.Callback介面後,呼叫startActionMode()方法來顯示上下文選單。,7-3-2 上下文的動作模式 使用匿名內層類別實作ActionMode.Callback介面1,首先使用匿名內層類別實作ActionMode.Callback介面來建立和處理上下文選單的選擇,如下所示:mCallback=new ActionMode.Callback()Override public boolean onPrepareActionMode(ActionMode mode,Menu menu)return false;Override publi
24、c void onDestroyActionMode(ActionMode mode)mMode=null;,7-3-2 上下文的動作模式 使用匿名內層類別實作ActionMode.Callback介面2,Override public boolean onCreateActionMode(ActionMode mode,Menu menu)/建立上下文選單 return true;Override public boolean onActionItemClicked(ActionMode mode,MenuItem item)/處理使用者的選擇 return false;,7-3-2 上下文
25、的動作模式 呼叫startActionMode()方法顯示上下文選單,然後就可以呼叫startActionMode()方法來顯示上下文選單,我們是在介面元件的長按事件來呼叫此方法,如下所示:View.OnLongClickListener listener=new View.OnLongClickListener()Override public boolean onLongClick(View v)if(mMode!=null)return false;else mMode=startActionMode(mCallback);v.setSelected(true);return true;
26、btn.setOnLongClickListener(listener);,7-4 彈出式選單 說明,彈出式選單(Popup Menu)的顯示方式類似對話方塊,它是指定介面元件建立的專屬選單,例如:按下按鈕,可以在元件下方顯示彈出式選單。請注意!Android需要是API 11以上版本才支援彈出式選單。,7-4 彈出式選單 建立,我們是在介面元件的事件處理來建立和顯示彈出式選單,如下所示:PopupMenu popup=new PopupMenu(MainActivity.this,view);popup.setOnMenuItemClickListener(MainActivity.this
27、););popup.show();上述程式碼使用建構子建立PopupMenu物件,建構子的第1個參數是Context物件,即活動本身,第2個是所屬的介面元件,然後註冊活動本身是OnMenuItemClickListener傾聽者物件,接著使用選單資源建立選單內容,最後呼叫show()方法顯示彈出式選單。,7-4 彈出式選單 處理使用者選取的選項,在活動需要實作PopupMenu.OnMenuItemClickListener介面來作為傾聽者物件,我們是在onMenuItemClick()方法處理使用者選取的選項。,7-5 Fragment片段,7-5-1 Fragment片段的基礎 7-5-2
28、 在活動建立Fragment片段 7-5-3 在活動與Fragment之間交換資料,7-5-1 Fragment片段的基礎 認識Fragment片段(說明),在Android活動可以使用Fragment類別來模組化使用介面,方便我們建立適合使用在小螢幕和大螢幕等不同尺寸的Android應用程式。Fragment片段是一個可重複使用的類別,類別實作活動的部分使用介面和行為,簡單的說,Fragment片段定義部分使用介面,因為是模組化的部分使用介面,同一Fragment片段就可以內嵌在1至多個不同活動,稱為宿主活動(Host Activity),請注意!Fragment片段一定需要內嵌在活動,並不
29、能單獨的獨立執行。如同活動,每一個Fragment片段包含Java類別和對應的版面配置檔,可以將介面元件和功能封裝起來,方便我們在不同活動來重複使用。,7-5-1 Fragment片段的基礎 認識Fragment片段(圖例),例如:第7-5-3節範例的活動與Fragment片段結構,如下圖所示:,7-5-1 Fragment片段的基礎 Fragment片段的生命周期,7-5-1 Fragment片段的基礎 主要方法的說明,7-5-2 在活動建立Fragment片段 說明,Android Studio工具提供現成範本,可以幫助我們在專案新增Fragment片段,在本節的範例專案分別使用標籤和Ja
30、va程式碼來顯示片段內容。,7-5-2 在活動建立Fragment片段 新增片段1,請啟動Android Studio新增名為Ch7_5_2專案後,展開專案套件,在名稱上執行【右】鍵快顯功能表的New/Fragment/Fragment(Blank)指令,可以看到新增片段的精靈畫面。,7-5-2 在活動建立Fragment片段 新增片段2,請切換至fragment_first.xml檔,修改TextView元件的id屬性值lblOutput;text屬性值是【第一個Fragment片段】。然後切換至FirstFragment.java,其程式碼如下所示:import;import androi
31、d.support.v4.app.Fragment;import;import;import;上述程式碼匯入所需套件,請將改為支援函數庫的,這是因為宿主MainActivity活動類別是使用支援函數庫,所以Fragment片段也需一致使用支援函數庫。,7-5-2 在活動建立Fragment片段 新增片段3,然後就是繼承Fragment類別的FirstFragment類別宣告,如下所示:public class FirstFragment extends Fragment public FirstFragment()Override public View onCreateView(Layout
32、Inflater inflater,ViewGroup container,Bundle savedInstanceState)return,container,false);,7-5-2 在活動建立Fragment片段 標籤(Step1),在MainActivity類別的activity_main.xml版面配置是使用標籤指定顯示的FirstFragment片段。在Android Studio介面設計工具新增標籤和片段的步驟,如下所示:Step 1:請切換至activity_main.xml版面配置,刪除TextView元件。,7-5-2 在活動建立Fragment片段 標籤(Step2),
33、Step 2:在Palette工具箱的【Custom】區段選【】,可以看到Fragments對話方塊。,7-5-2 在活動建立Fragment片段 標籤(Step3),Step 3:選【FirstFragment】,按【OK】鈕,可以在指定插入點新增FirstFragment片段,如下圖所示:,7-5-2 在活動建立Fragment片段 標籤(Step4-5),Step 4:在下方點選【fragment_first】超連結,指定片段顯示的版面配置檔後,將標籤的【layout:width】屬性改為【match_parent】。Step 5:請執行Android Studio專案,顯示的訊息字串就
34、是片段內容,如下圖所示:,7-5-2 在活動建立Fragment片段 在活動管理Fragment片段(說明),在活動版面配置使用標籤新增Fragment片段是靜態指定方式,這一小節我們準備改用Java程式碼來切換顯示Fragment片段。,7-5-2 在活動建立Fragment片段 在活動管理Fragment片段1,請在activity_main.xml版面配置的標籤前新增水平的2個按鈕後,在標籤後新增一個FrameLayout版面配置,作為切換Fragment片段的容器元件,如下圖所示:,7-5-2 在活動建立Fragment片段 在活動管理Fragment片段2,因為我們準備在FrameL
35、ayout切換顯示不同的Fragment片段,請在專案再新增名為SecondFragment片段(版面配置是fragment_second.xml)。現在,我們可以使用程式碼指定FrameLayout這個容器顯示第一個Fragment片段,首先建立FirstFragment物件,如下所示:FirstFragment ff=new FirstFragment();上述程式碼使用建構子建立片段後,即可取得FragmentManager物件來管理片段,使用的是和資料庫類似的交易處理,如下所示:FragmentManager fm=getSupportFragmentManager();,7-5-2
36、在活動建立Fragment片段 在活動管理Fragment片段3,程式碼呼叫getSupportFragmentManager()方法(如果沒有使用支援函數庫,請改為getFragmentManager()方法)取得FragmentManager物件後,呼叫beginTransaction()方法開始執行片段管理的交易,如下所示:FragmentTransaction trans=fm.beginTransaction();,ff);mit();上述程式碼呼叫add()方法新增片段,第1個參數是容器元件,第2個是顯示的片段物件,最後呼叫commit()方法確認片段管理交易。,7-5-2 在活動
37、建立Fragment片段 在活動管理Fragment片段4,因為方法會傳回取得的物件,所以,可以直接使用串連呼叫方法(Method Chaining),如同項鍊的一串珠子來依序呼叫各方法,如下所示:getSupportFragmentManager().beginTransaction().,sf).commit();上述程式碼呼叫replace()方法取代片段成為第2個參數的Fragment物件sf。如果需要,我們是呼叫remove()方法刪除片段,參數是欲刪除的Fragment物件,如下所示:getSupportFragmentManager().beginTransaction().re
38、move(sf).commit();,7-5-2 在活動建立Fragment片段 Fragment物件的newInstance()類別方法1,SecondFragment類別和FirstFragment類別宣告的結構有些不同,因為建立SecondFragment片段物件時,可以傳遞參數來更改TextView元件內容,所以在類別宣告擁有newInstance()類別方法,如下所示:public class SecondFragment extends Fragment private static final String MESSAGE=MESSAGE;private String msg;p
39、ublic static SecondFragment newInstance(String msg)SecondFragment fragment=new SecondFragment();Bundle args=new Bundle();args.putString(MESSAGE,msg);fragment.setArguments(args);return fragment;,7-5-2 在活動建立Fragment片段 Fragment物件的newInstance()類別方法2,在之後是預設的空建構子,如下所示:public SecondFragment()Override publi
40、c void onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState);if(getArguments()!=null)msg=getArguments().getString(MESSAGE);在上述onCreate()方法使用getArguments()方法取出物件附加的參數,使用getString()方法取出字串參數。,7-5-2 在活動建立Fragment片段 Fragment物件的newInstance()類別方法3,然後在onCreateView()方法將片段充氣成元件後,即可指定TextView元件
41、顯示的字串,如下所示:Override public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState)View view=inflater.inflate(,container,false);TextView output=(TextView);output.setText(msg);return view;上述程式碼將版面配置fragment_second.xml檔充氣成View物件view後,就可以呼叫view.findViewById()方法找尋和指定TextV
42、iew元件內容。,7-5-2 在活動建立Fragment片段 Fragment物件的newInstance()類別方法4,回到MainActivity類別,建立SecondFragment片段物件並不是使用建構子,而是呼叫newInstance()類別方法來建立物件和傳遞參數,如下所示:SecondFragment sf;sf=SecondFragment.newInstance(改成第二個Fragment片段);FirstFragment是單純使用建構子來建立片段物件,如下所示:FirstFragment ff=new FirstFragment();,7-5-3 在活動與Fragment之
43、間交換資料-說明,在活動與Fragment之間交換資料是透過方法呼叫,我們是使用方法參數來傳遞資料。實務上,為了模組化Fragment片段,並不建議在Fragment片段之間直接交換資料,我們需要透過宿主活動來交換資料。所以,當我們需要在活動的2個Fragment片段之間傳遞資料時,首先是從第1個Fragment片段傳遞資料至宿主活動,然後再從宿主活動傳遞資料至第2個Fragment片段。,7-5-3 在活動與Fragment之間交換資料-範例,將第6-4節Android應用程式的BMI計算機分割成2個片斷,在第1個BMIFragment片段輸入身高和體重,按下按鈕,可以在第2個TextFra
44、gment片段顯示計算結果的BMI值,其執行結果如右圖所示:,7-5-3 在活動與Fragment之間交換資料-從Fragment片段傳遞資料至宿主活動1,本節範例的BMIFragment片段需要傳遞BMI值至MainActivity活動,也就是在BMIFragment類別呼叫宿主活動的方法,透過的是BMIListener介面,所以,在BMIFragment類別宣告之中擁有BMIListener介面宣告,如下所示:public interface BMIListener public void onButtonClick(double bmi);,7-5-3 在活動與Fragment之間交換資
45、料-從Fragment片段傳遞資料至宿主活動2,在MainActivity類別需要實作BMIListener介面和onButtonClick()方法,如下所示:public class MainActivity extends ActionBarActivity implements BMIFragment.BMIListener.public void onButtonClick(double bmi).上述方法參數bmi是準備從片段傳遞給宿主活動的資料。,7-5-3 在活動與Fragment之間交換資料-從Fragment片段傳遞資料至宿主活動3,在BMIFragment類別的onAtta
46、ch()方法可以使用BMIListener介面型態取得MainActivity活動物件,如下所示:public void onAttach(Activity activity)super.onAttach(activity);try/取得父活動物件 activityCallback=(BMIListener)activity;catch(ClassCastException e)throw new ClassCastException(activity.toString()+需實作BMIListener);,7-5-3 在活動與Fragment之間交換資料-從Fragment片段傳遞資料至宿主
47、活動4,最後,我們在按鈕的事件處理方法呼叫宿主活動的onButtonClick()方法,參數bmi是計算結果的BMI值,如下所示:activityCallback.onButtonClick(bmi);透過方法呼叫的參數,就可以將BMI值從BMIFragment片段傳遞至MainActivity宿主活動。,7-5-3 在活動與Fragment之間交換資料-從宿主活動傳遞資料至Fragment片段1,當MainActivity活動取得從BMIFragment傳遞的BMI值後,我們是呼叫TextFragment類別宣告成public的方法,將BMI值從MainActivity活動傳遞至TextFr
48、agment片段,如下所示:public void changeBMIValue(double bmi)output.setText(Double.toString(bmi);上述changeBMIValue()方法是位在TextFragment類別的public方法。,7-5-3 在活動與Fragment之間交換資料-從宿主活動傳遞資料至Fragment片段2,在MainActivity類別是在實作的onButtonClick()介面方法呼叫此方法,如下所示:public void onButtonClick(double bmi)FragmentManager fm=getSupportF
49、ragmentManager();TextFragment tf=(TextFragment)fm.findFragmentById(R.id.fragment2);tf.changeBMIValue(bmi);上述方法取得FragmentManager物件後,呼叫findFragmentById()方法取得TextFragment物件後,就可以呼叫changeBMIValue()方法顯示BMI值。,7-5-3 在活動與Fragment之間交換資料-從宿主活動傳遞資料至Fragment片段3,在onButtonClick()方法的參數bmi是從BMIFragment片段傳遞至活動的資料,再透過呼叫changeBMIValue()方法的參數,將資料傳遞至TextFragment片段。,End,