項目中,為了實作不同fragment之間值得傳遞,首先想到的是利用bundle或者shareprefercnce之類的共享資料機制,當不符合項目需求,有點過于複雜和備援,就利用網上一位前輩的建議,在主Activity中,建立一個共享的資料變量,在其他fragment中隻要擷取到這個值就可以得到資料,實作共享,代碼如下:
主activity定義一個共享資料變量:
private String instrName;
public String getInstrName() {
return instrName;
}
public void setInstrName(String instrName) {
this.instrName = instrName;
}
在其他fragment中使用如下語句即可得到該資料:
String instrName = ((MainActivity)getActivity()).getInstrName();
但重點不在于擷取資料,我遇到的困難是這樣的,先前的博文有提到我使用了popupwindow作為左側下拉菜單,為了實作主界面不同fragment的切換,做了一個隐藏和顯示的處理,隻要已經執行個體化的fragment類,要用的時候,直接show顯示即可,不用的時候hide隐藏起來。又不懂或者不知道如何使用的可以參考我這篇博文: 點選打開連結。這樣實作之後,我要再fragment a中的清單點選其中一個清單項,跳轉到另一個fragment b中,當然這個清單項的值需要傳遞到fragment b中,很多人會認為不是直接可以使用你上面的方法可以得到共享的資料嗎?
其實難點在于,第一次切換到fragment b中,已經執行個體化的時候,确實能得到共享的資料,當第二次切換到fragment b,點選的是其他的清單項,這時候我發現,這個fragment b已經被我隐藏了,并且是這樣的:(已經初始化的fragment就不再初始化,隻需要hide隐藏),但是隐藏了之後,這段擷取資料的代碼
String instrName = ((MainActivity)getActivity()).getInstrName();
應該放到哪裡會執行呢?
我的要求是從fragment a一切換到fragment b中就要馬上擷取到共享的資料,并展現在fragment b的清單中?
解決方案其實是有的,以前activity在恢複顯示的時候有一個方法就是監聽顯示是否完成,同樣對于fragment也有類似的方法可以監聽,如下:
@Override
public void onHiddenChanged(boolean hidd) {
if (hidd) {
String instrName = ((MainActivity)getActivity()).getInstrName();
System.out.println("當對沖界面重新恢複顯示時候,得到從開倉單擷取到的商品名稱"+instrName+"***************++++++++++++*****");
System.out.println("當對沖界面重新恢複顯示時候,得到從開倉單擷取到的商品名稱"+instrName+"***************++++++++++++*****");
} else {
//相當于Fragment的onPause
String instrName = ((MainActivity)getActivity()).getInstrName();
System.out.println("當對沖界面重新恢複顯示時候,得到從開倉單擷取到的商品名稱"+instrName+"***************++++++++++++*****");
}
}
這樣在fragment隐藏或者顯示的時候,都能夠擷取到共享的資料。 注意點是第一次是需要new一個frament對象,這時候也要得到共享資料,隻需要将代碼寫到oonCreateView中即可。