開發之中用到的Fragment的次數越來越多,很多小的項目都已經直接在使用Fragment作為Activity的載體來切換頁面。而在開發之中頁面的切換我們最關心的問題就是數據的傳遞了。今天我們主要來研究下Fragment頁面切換數據的傳遞方式。
第一種方式:Bundle傳遞參數
Fragment1 fragment1 = new Fragment1(); Bundle bundle = new Bundle(); bundle.putString("name", "張三"); fragment1.setArguments(bundle); FragmentManager fm = getFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); transaction.addToBackStack(null); transaction.add(R.id.content,fragment1); transaction.hide(HomeFragment.this); transaction.commit();
這里需要注意的是,一定要現有Fragment在去使用Bundle傳遞參數。
接受參數就相對比較簡單了,一半的時候會考慮在Fragment的onAttach生命周期里面去接受。
代碼如下:
Bundle arguments = getArguments();
String name = arguments.getString("name");
是不是很簡單了,當然我們最好還需要判斷下獲取的值是不是為空,因為有可能在沒有網絡的時候沒有從服務器獲取到數據,這里就會接受不到。
再來介紹第二種參數的傳遞方式:
我們在商城客戶端里面市場會碰到這樣的需求,我們選擇了購買的時候還需要指定我們的送貨地址,選擇發票之類的業務。這樣我們就需要把另外的Fragment里面選擇的結果傳遞到前面的Fragment里面去做相關處理。
通常這樣的情景在Activity里面一半會通過參數回傳的方式
@Override public void startActivityForResult(Intent intent, int requestCode) { // TODO Auto-generated method stub super.startActivityForResult(intent, requestCode); }
但是在Fragment里面不推薦這么使用,在Fragment里面一般使用比較靈活的回調接口去傳遞參數。
所以我們首先需要去定義一個接口,接口的代碼如下:
public interface OnResultListener { void OnResult(String value); }
這里的命名方式還是比較正規的,模仿的是android里面點擊事件來做的。
然后我們可以做這樣的一些類操作:
1、一個Fragment里面點擊前往另外的一個Fragmengt
2、另外的一個Fragment里面有個按鈕點擊會通過接口回調的方式把參數回調個第一個Fragmennt
在第二個Fragment里面我們需要定義一個方法,傳遞的參數就是我們前面定義的一個接口,通過this給這個接口賦值。
private OnResultListener listener; public void setListemer(OnResultListener listener) { this.listener = listener; }
然后我們可以在何時的時機去給這個接口里面的接口方法的參數傳遞值。
@Override public void onClick(View v) { switch (v.getId()) { case R.id.f1_but: if (listener != null) { listener.OnResult("test"); } else { Toast.makeText(getActivity(), "listener is null", Toast.LENGTH_SHORT).show(); } // 彈出棧 getFragmentManager().popBackStack(); break; default: break; } }
這里需要的彈出棧,當我們點擊確定按鈕的時候就會把當前的Fragment彈出棧,去第一個Fragment里面。
由於我們最先的需求是從第一個Fragment前往第二個Fragment。所以我們還需要在第一個Fragment里面去做切換。
FragmentManager fm = getFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); transaction.addToBackStack(null); transaction.add(R.id.content,fragment1); transaction.hide(HomeFragment.this); transaction.commit();
這里有幾點需要注意的:
1、不要使用replace期做替換,使用add方法,replace會先干掉Fragment里面的view 到時候回調回來的參數不能顯示。
2、add使用,要Hide,這樣避免頁面的層疊狀況。
3、注意添加到棧,這樣我們就可以操作返回鍵了,因為Fragment是掛載到Acticity上面的,不將Fragment添加到棧,點擊返回鍵是直接對當前的Activity做操作
如果當前只有一個Activity是會直接退出當前APP的
本來向附上源碼的,但是無奈找不到在哪上傳附件,憂傷啊!
