我目前正在尝试学习使用视图和状态。我通常能够在如下功能中设置颜色:
View mColorRegion = findViewById(R.id.color_region);
mColorRegion.setBackgroundColor(Color.CYAN);
但是,我似乎无法在 onRestoreInstanceState()中设置颜色,因为
mColorRegion.setBackgroundColor(savedInstanceState.getInt("color"));
但是,使用与TextView相同的View,我可以恢复文本,如下所示:
TextView mText = (TextView)findViewById(R.id.color_region);
mText.setText(savedInstanceState.getString("text");
有什么区别,以及如何在 onRestoreInstanceState()中设置背景颜色?
1)mColorRegion.setBackgroundColor(Color.CYAN)
似乎无法在 onCreate()中使用。
2)即使以下功能在按下按钮时正确更改了视图颜色,但如果我直接从 onRestoreInstanceState()调用它,它也不起作用:
public void centerButton1(View clickedButton) {
mColorRegion.setBackgroundColor(Color.CYAN);
}
嗯...
答案 0 :(得分:0)
所以我找到了“半解决方案”。如果将以下行添加到 AndroidManifest.xml ,它将在方向更改期间保留颜色:
android:configChanges="orientation|screenSize"
但是,这仍然无法解答为什么我可以设置文本而不是 onRetoreInstanceState()或 onCreate() ...
答案 1 :(得分:0)
许多人对使用android:configChanges="orientation|screenSize"
感到不满,例如Google's Dianne Hackborn。首先,它将使您的应用程序的多个布局之间的切换过程非常困难(例如,如果您想要一个横向布局,一个用于肖像),因为您将不得不完成Android通常所做的所有工作在 onConfigurationChanged()中自动为您服务。
无论如何,我也遇到过这种问题。我正在创建一个DialogPreference,并且在轮换时我无法在 onRestoreInstanceState(savedInstanceBundle)中更改 SeekBar 的进度...所以如果你不能这就是我的建议使用 onCreate(savedInstanceBundle)或 onActivityCreated(savedInstanceBundle)(对于片段)来恢复视图对象的状态:
1)创建一个名为“mRestoredBGColor”的私有类成员,
private int mRestoredBGColor = -1;
2)在 onRestoreInstanceState()中:
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
mRestoredBGColor = savedInstanceState.getInt("key_you_used_in_onSaveInstanceState");
}
3)然后在 onResume()中,因为在onStart()之后调用onRestoreInstanceState(),但在onResume()之前调用
@Override
public void onResume(){
super.onResume();
if(mColorRegion != null && mRestoredBGColor != -1){
mColorRegion.setBackgroundColor(mRestoredBGColor);
mRestoredBGColor = -1; //to make sure it only sets this once per rotation.
}
}
希望这有助于某人。我相信除了使用android:configChanges="orientation|screenSize"
之外,总会有另一种方式(除非您希望快速旋转WebView ...)。