fragment当切换页面的时候,页面的UI信息没有了,然后再次切换这个页面的时候,又变回原来没有登录的状态的界面

现在稍有头绪的使用方法是用onSaveInstanceState(Bundle outState) 和onViewStateRestored(Bundle savedInstanceState)的这两个方法来进行UI状态的保存和取出,直接把UI的字符串值传入Bundle中,但是取数据和保存数据条件该写什么?

还有,这里不应该使用onStart()onPause()方法来保存这样的UI界面数据,因为这样的方式保存是保存一些永久数据,使用sharedPreferences保存不是很适合;因为当我下次再次启动而我的账户是没有登录的话,一样会被调用出sharedPreferences数据设置到UI中,明显这是设计不合理。

 

25-2

string是获取从xml文件中的布局getText()所得,而Const.STRING_DENGLU_ZHUCE只是自己写的一个String常量;使用这样的方式进行判断,是不准确的。

 

 

25-3

onPause()中写保存数据的方法,在onStart()中写取出数据的方法:

MeFragment:

@Override
public void onStart() {
super.onStart();
LogUtil.i("MeFragment", "onStart");
try {
if(!(string).equals(R.string.str_login_register)){
SharedPreferences sharedPreferences = getActivity().getSharedPreferences("MeFragmentState", Context.MODE_PRIVATE);
String state = sharedPreferences.getString("MeFragmentState", null);
tv_denglu_zhuce_qian.setText(state);
}
} catch (Exception e) {
ExceptionUtil.handleException(e);
} finally {
}
}
 
@Override
public void onPause() {
LogUtil.i("MeFragment", "onPause");
if(!string.equals(R.string.str_login_register)){
SharedPreferences sharedPreferences = getActivity().getSharedPreferences("MeFragmentState", Context.MODE_PRIVATE);
Editor et = sharedPreferences.edit();
et.putString("MeFragmentState", tv_denglu_zhuce_qian.getText().toString());
et.commit();
LogUtil.i("MeFragmentState", "MeFragmentSaveState_Str = OK");
}
super.onPause();
}


然而,使用SharedPreferences 这种方式保存数据,再取出数据是行不通的;就算修改了25-2)的字符串判断,这里取出的数据的业务模式也是不合理的。

 

25-4

在网上看了一些文章,都是在onSaveInstanceState(Bundle outState)和onViewStateRestored(Bundle savedInstanceState)的这两个方法中存数据和取数据,由于onSaveInstanceState这个方法并不是所有时候都会调用,要是用户主动关闭页面,或者frament页面之间切换的话,就不会被调用该方法,所以还需要在onPause()onStop()方法中保存数据,具体保存在哪个方法,看你业务需要。最好写在onPause()中,处于可见状态但不能与用户交互的时候也存起来,以防万一。

网上的文章,onSaveInstanceState(Bundle outState)和onViewStateRestored(Bundle savedInstanceState)演示使用这两个方法的时候,是说Bundle的用法跟sharedpreferences的用法差不多,都是put数据进去,数据是kye,value键值对。直接使用Bundle后面的对象就可以存取。但是网上的用法都是直接outState.put(***,***),然后saveInstanceState.get(***),并没有使用if判断语句。然而这样经过我测试所得,会出异常,异常是nullPointException,然后我先将异常包裹,看页面会变成什么样子。

 

又抛出异常,这个问题的原因是,我把super.onViewStateRestored()继承父类的这个super,也被我包裹在try/catch中,所以报错。

 


不做判断的话,启动的时候,就会取出数据,但是都没有数据你取什么数据,所以是绝对需要做判断的;于是我想应该在这个outState对象当中会有一些判断true or false的语句,查到了一个isEnpty()的方法,经过测试,这个判断条件会出异常,并不能使用isEnpty()这个方法作为条件做判断;于是继续在网上找帖子,在一个问答贴中看到了原来是判断outState!=null就可以了,这个我一时间也没有想起。

写好了取数据时的判断,那么又到了存数据的判断,保存数据我不知道使用什么作为判断,但是肯定是需要判断的。起初我是使用了接收广播的实体类中取出数据,作为判断条件,按理好像可以这样使用,但是运行测试的时候,又出现了异常nullPointException,并且异常指的错误行就是这个判断条件的,于是我又想这个实体类还没有返回的时候,我知道会是null,但是还是会nullPointException,那么估计是(实体.getUserName())这个方法本来就是nullPotinException,所以照样出异常,那么就是说不能使用这个作为判断条件。于是我寻找这个把创建这个实体的代码找一下是在哪里new出来的,发现这个问题并不是new出来的,而是反序列化sharedPreferences中获取出来的。

 

25-5

使用25-2)的字符串作为判断不行,使用(实体.getUserName())这个方法也不行,那么试试再创建一个实体,把接收到的广播在sharedPreferences中取出的string的用户名再放入实体行不行?

那么在广播中创建一个用户user对象,而在onSaveInstanceState(Bundle outState)中就可以使用if(user!=null)判断实体对象是否为null作为判断条件了。

MeFragment:

private UserEntity user;
 
@Override
public void onViewStateRestored(Bundle savedInstanceState) {
super.onViewStateRestored(savedInstanceState);
LogUtil.i("MeFragment", "onViewStateRestored");
LogUtil.i("MeFragment", "onViewStateRestored 1="+tv_denglu_zhuce_qian.getText().toString());
try {
if(savedInstanceState!=null){
String str = savedInstanceState.getString("strUserName");
tv_denglu_zhuce_qian.setText(str);
LogUtil.i("MeFragment", "onViewStateRestored 2="+tv_denglu_zhuce_qian.getText().toString());
}
 
} catch (Exception e) {
ExceptionUtil.handleException(e);
} finally {
 
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
LogUtil.i("MeFragment", "onSaveInstanceState");
if(user!=null){
String strUserName = user.getUsername();
outState.putString("strUserName", strUserName);
LogUtil.i("MeFragment", "onSaveInstanceState_Str="+tv_denglu_zhuce_qian.getText().toString());
}
super.onSaveInstanceState(outState);
}
 
/********************************************************************************
* 广播注册和注销的代码不贴了,不是这里的重点
********************************************************************************/
class SetViewBroadCast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
try {
String logizServiceString = intent.getAction();
if(logizServiceString.equals(Const.ACTION_LOGIN_SETVIEW)){
String string = tv_denglu_zhuce_qian.getText().toString();
if(string.equals(Const.STRING_DENGLU_ZHUCE)){
//在反序列化方法中,放入获取SharedPreferences中的序列化过的str,获得原对象
UserEntity userEntity = deSerialization(getObject());
LogUtil.i("sharePreferences", "sharePreferences"+userEntity.toString());
String strUserName = userEntity.getUsername();
tv_denglu_zhuce_qian.setText(strUserName);
//核心代码
user = new UserEntity();
user.setUsername(strUserName);
}
}
} catch (Exception e) {
ExceptionUtil.handleException(e);
} finally {
 
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值