[置顶] Android fragment 使用Sharepreferences来获取值,更新界面

    如果有看过我前面几篇博文的都知道,这个项目里面采用的是fragment片段对每个界面进行组织的,当用户切换fragment A时,就隐藏该fragment,当再次回到这个fragment A时,就将该fragment进行显示,不用多次创建new一个fragment,这是一种很好的组织方式。当采用上述的方式时,总会遇到这样的问题:当再次切换到fragment A时,没有new一个,那从fragment B传递过来的变量值如何才能获取的到呢?

      这就用到了fragment提供的一个方法:

     

@Override
	public void onHiddenChanged(boolean hidd) {<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">}</span>
        这个方法可以判断fragment是否隐藏,当hidd为true时,就可以执行你拿数据的逻辑,这些数据你可以定义一个接口或者放到Sharepreferences里面来获取,进而更新你的listview,总之这个方法提供了一个很好的接口和逻辑来让你处理从不同的界面传递过来的变量值。

     现在说说我使用Sharepreferences来从系统设定界面传递用户选中的按某个字段排序的功能,自然我也想到了,将使用Sharepreferences的get方法放到

onHiddenChanged方法里面,当fragment再次显示的时候,应该可以拿得到已经保存在Sharepreferences的值,但我发现我错了,使用过Sharepreferences的人知道,Sharepreferences的方法需要传递一个context进去,当我使用一下代码的时候,始终报一个空指针的异常,代码如下:
@Override
	public void onHiddenChanged(boolean hidd) {
		if (!hidd) {//判断fragment是否已经显示
			
				oppsortInt = SharepreferencesUtilSystemSettings.getValue(
						getActivity(), System_Key_OpenPosition,
						System_OpenPosition_Sort_Currency);//报异常的代码
				tradeVec = getTradeVec();
				dataMap = loadListData();
				sortOrderHisByAll(oppsortInt);
				fireTableDataChange();
			

		}
	}

 
 
很显然,报异常的原因是因为无法获得context,无法实例化,当第一次加载这个fragment界面的时候,这个方法执行的过程当中,还没有完成和activity绑定的动作,所以会导致第一次的时候是无法执行getActivity()的方法,也就是获得的context是为空的,我是通过重写onattch(),通过打印的语句才知道整个fragment的执行流程的,具体的代码如下:
@Override
	public void onAttach(android.app.Activity activity) {
		super.onAttach(activity);
		System.out.println("onAttach是否先执行且执行一次");
		System.out.println("onAttach是否先执行且执行一次");
		System.out.println("onAttach是否先执行且执行一次");
		System.out.println("onAttach是否先执行且执行一次");
		System.out.println("onAttach是否先执行且执行一次");
		System.out.println("onAttach是否先执行且执行一次");
		System.out.println("onAttach是否先执行且执行一次");
	};

	@Override
	public void onHiddenChanged(boolean hidd) {
		if (!hidd) {
			if (getActivity() == null) {
				tradeVec = getTradeVec();
				dataMap = loadListData();
				sortOrderHisByAll(oppsortInt);
				fireTableDataChange();
				System.out.println("onHiddenChanged是否后执行,并且第一次activity为空");
				System.out.println("onHiddenChanged是否后执行,并且第一次activity为空");
				System.out.println("onHiddenChanged是否后执行,并且第一次activity为空");
				System.out.println("onHiddenChanged是否后执行,并且第一次activity为空");
				System.out.println("onHiddenChanged是否后执行,并且第一次activity为空");
				System.out.println("onHiddenChanged是否后执行,并且第一次activity为空");
			} else {
				oppsortInt = SharepreferencesUtilSystemSettings.getValue(
						getActivity(), System_Key_OpenPosition,
						System_OpenPosition_Sort_Currency);
				tradeVec = getTradeVec();
				dataMap = loadListData();
				sortOrderHisByAll(oppsortInt);
				fireTableDataChange();
System.out.println("onHiddenChanged是否后执行,是否每次切换fragment都会重新执行该方法");
System.out.println("onHiddenChanged是否后执行,是否每次切换fragment都会重新执行该方法");
			}

		}
	}

打印出来的结果如下:

第一次进入fragment A的执行结果:<img src="http://img.blog.csdn.net/20150929160806421?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">当切换到fragment B时,再切换回fragment A时的打印结果:<img src="http://img.blog.csdn.net/20150929160815934?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /><img src="http://img.blog.csdn.net/20150929160826865?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></span>
相信读者从上述的结果就可以看出来了,只要在onHiddenChanged对getActivity()进行判断,先不获取该值,再次加载时获取就可以实现上述效果,有不正确的地方欢迎指教!!!</span>

 
 
 
 

你可能感兴趣的:(android,Fragment)