调用setContentView()后没有数据

时间:2011-06-13 18:46:47

标签: android layout orientation data-loss

目前我正在处理我的应用money is time的更新,我遇到了以下问题。我想支持横向和纵向方向,所以我创建了两种不同的布局。

我的第一个问题是旋转后应用程序重新启动并且数字设置为刷新的位置。

在stackoverflow上找到this question之后很容易解决。

我已针对该问题实施了以下解决方案:

@Override
public void onConfigurationChanged(Configuration newConfig) {
     super.onConfigurationChanged(newConfig);
     setGui();
   }

我已经使用以下代码对其进行了测试,其中根据布局调整了轮子的布局。这一切都是应有的。当我改变方向时,数字不会改变。

public void setGui() {
    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        initWheel(R.id.money1, 0, 9, "%1d", moneyWidthPortrait, textSizePortrait);
        ...
    } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
        initWheel(R.id.money1, 0, 9, "%1d", moneyWidthLandscape, textSizeLandscape);
        ...
    }
}

但我也想改变背景和布局(填充和边距),所以我添加了以下两行:

public void setGui() {
    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        setContentView(portrait);
        ...
    } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
        setContentView(landscape);
        ...
    }
}

但在调用setContentView后,所有数据似乎再次丢失,并且在更改手机方向后轮子重置为零。

在方向和布局更改期间,最好避免将车轮重置为“0”?

编辑:回答后编辑

我已删除:

android:configChanges="keyboardHidden|orientation"

并补充说:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
  savedInstanceState.putInt("WheelMoney1", getWheelValue(R.id.money1));
  ...
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
  getWheel(R.id.money1).setCurrentItem(savedInstanceState.getInt("WheelMoney1"), false);
  ...
}

并实施了layout-landlayout-port来处理两种不同的布局。

2 个答案:

答案 0 :(得分:3)

听起来您需要实施onSaveInstanceStateonRestoreInstanceState

答案 1 :(得分:2)

更改方向时,您无需致电setContentView。如果您在正确的布局目录下使用相同的名称保存布局,Android将为您执行此操作。例如:

res/layout-land/main.xml
res/layout-port/main.xml

当您的活动切换方向时,Android将加载正确的布局。