0

我无法在方向更改时保存字符串。我试过使用onSaveInstanceState()/onRestoreInstanceState()onRetainNonConfigurationInstance()/getLastNonConfigurationInstance()没有运气。

我有:

@Override
public String onRetainNonConfigurationInstance(){
    final String savedType = currentType;
    return savedType;
}

onCreate()我有:

currentType = (String) getLastNonConfigurationInstance();

这对我还没有用,而且currentType总是null在方向改变之后。有什么建议么?


修订


所以这就是我目前拥有的,但它仍然无法正常工作:

@Override
protected void onSaveInstanceState(Bundle outState){
    outState.putString("savedType", currentType);
    super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState){
    currentType = savedInstanceState.getString("savedType");
    super.onRestoreInstanceState(savedInstanceState);
}

我已经尝试在super我能想到的每种组合中将方法调用放在每个方法的开头和结尾,但是当再次创建视图时仍然得到一个NullPointerExceptionfor 。currentType



这发生在一个对话框中,我不确定这是否与它有关,但认为这可能是一个有用的信息。



部分解决方案/部分新问题



所以我让这个工作有点像我想要的。当不再需要变量时,方法中隐藏了一条语句,该语句设置currentType为生命周期结束时。null现在已经不成问题了。屏幕将成功改变方向,但如果它在两者之间连续改变太快,它会 FC。这是我用来让它在这种状态下工作的:

类字段:

private String currentType;

最后onCreate我有:

currentType = (String) getLastNonConfigurationInstance();

进而:

@Override
public Object onRetainNonConfigurationInstance() {
    final String s = currentType;
    return s;
}

如果方向没有改变然后很快又变回来,它就可以正常工作。不过我想解决这个问题,因为百货商店和零售店正在使用/将使用它,我可以看到人们丢弃它,这将导致 FC(把它放在我的沙发上进行测试)。我只存储一个字符串,所以我存储的内容不会占用太多内存。对这种新情况有什么建议吗?

4

2 回答 2

1

你试过把它放在一个Bundle中吗?

private static final String CURRENT_TYPE = "currentType";
private static final String DEFAULT_TYPE = "defaultType";
@Override
protected void onSaveInstanceState (Bundle outState) {
  outState.putString(CURRENT_TYPE, currentType);
  super.onSaveInstanceState(outState);
}
@Override
protected void onCreate (Bundle savedInstanceState) {
  ...
  currentType = (savedInstanceState == null)? null : 
        savedInstanceState.getString(CURRENT_TYPE, DEFAULT_TYPE);
  ...
}
于 2012-01-13T22:00:04.380 回答
0

所以我让这个工作有点像我想要的。当不再需要该变量时,在生命周期结束时将 currentType 设置为 null 的方法中隐藏了一条语句。现在已经不成问题了。屏幕将成功改变方向,但如果它在两者之间连续改变太快,它会 FC。这是我用来让它在这种状态下工作的:

类字段:

private String currentType;

在 onCreate 结束时,我有:

currentType = (String) getLastNonConfigurationInstance();

进而:

@Override
public Object onRetainNonConfigurationInstance() {
    final String s = currentType;
    return s;
}

如果方向没有改变然后很快又变回来,它就可以正常工作。询问有关此新错误的新问题,

于 2012-01-16T14:44:02.510 回答