项目中,为了实现不同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中即可。