Fragment的資料傳遞,Fragment資料傳遞
開發之中用到的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的
本來向附上源碼的,但是無奈找不到在哪上傳附件,憂傷啊!