Activity向Fragment中傳遞引數
Fragment 與 Activity之間傳遞資料有兩種方法,一種是使用setArgument,一種是使用介面回撥。下面先學習第一種方法。
(1)使用setArgument方法:
為了便於理解,我在這裡打個比喻:假如Activity是皇帝,它設立了三個部門(如三省六部),分別是Fragment1,Fragment2和Fragemnt3;
現在他現在要吩咐部門Fragment1去做一些事情,比如說:領兵攻打島國!!好,它肯定不自己跑去告訴該部門的。
一般來說,會有個宰相或者太監總管來負責皇帝口諭是吧;這個太監總管就是FragmentManager。然後,當然,
太監總管也是不會親自跑過去的,這時候有個名叫
它就負責三件事情:add(), remove(), replace(),按照皇帝的意思去增加一個部門,撤銷一個部門,和替換掉一個部門。
現在這個事務太監有新任務了,就是增加一個部門,然後告訴它去攻打島國。好。把內容“帶兵攻打島國”裝到信封裡
(信封就是Bundle)。注意到,這是密令,當然要做個記號什麼的來標記一下,就是加上Tag,這裡我們指定是“179521”。
最後綁在白鴿上傳送出去(commit())。
<pre name="code" class="java">@Override public void onClick(View arg0) { if (arg0.getId()==R.id.send_data_btn) { LeftFragment fragment = new LeftFragment(); Bundle bundle = new Bundle(); bundle.putString("order", "帶兵攻打島國"); fragment.setArguments(bundle); FragmentManager fragmentManager = getFragmentManager(); //開始Fragment事務 FragmentTransaction fTransaction = fragmentManager.beginTransaction(); //將Fragment新增到事務中,並指定一個TAG fTransaction.add(fragment, "179521"); //提交Fragment事務 fTransaction.commit(); } }
上面那個比喻不是十分恰當,現在用正式的語言來說明下哈:
要是你熟悉Activity的生命週期,應該知道每一個應用都有一個獨一無二的Task,Task裡有個回退棧backstack,儲存Activity的視窗例項物件;
由於Fragment也是有視窗例項物件的,因此它出現時也是要進入到回退棧的。
使用Fragment,Android為了讓使用者或者開發者來執行對Fragment的管理,比如說增加,移除和替換等。從Android3.0後有一個類,
FragmentManager專門用來管理Fragment,但是它不親自執行具體動作,而是使用一個物件,片段事務,FragmentTransaction
應該認識到的是每個FragmentTransaction是一組同時執行的變化的集合。比如說同時新增2個Fragment,然後刪除其中一個。
這都是同時執行的。用add(),remove(), replace()方法,把所有需要的變化加進去,然後呼叫commit()方法,將這些變化應用。
在commit()方法之前,你可以呼叫addToBackStack(),把這個transaction加入backstack中去,這個back stack是由activity
管理的,當用戶按返回鍵時,就會回到上一個fragment的狀態。
在Fragment接收資料:
得到FragmentManager,然後根據標籤Tag和key取出對應的內容。
<pre name="code" class="java">@Override
public void onClick(View arg0) {
if (arg0.getId()==R.id.get_data_btn) {
String name = getFragmentManager().findFragmentByTag("179521").getArguments().getString("order");
Toast.makeText(getActivity(), "命令是"+name, Toast.LENGTH_SHORT).show();
}
}
結果如下: