如何在onRestoreInstanceState()中设置视图的背景颜色

问题描述:

我目前正在尝试学习如何使用视图和状态。我通常能够在下面的设置其颜色的功能,如:如何在onRestoreInstanceState()中设置视图的背景颜色

View mColorRegion = findViewById(R.id.color_region); 
    mColorRegion.setBackgroundColor(Color.CYAN); 

不过,我似乎无法能够设置颜色在onRestoreInstanceState(),作为

 mColorRegion.setBackgroundColor(savedInstanceState.getInt("color")); 

然而,与同观为一个TextView工作,我能够恢复文本如下所示:

TextView mText = (TextView)findViewById(R.id.color_region); 
    mText.setText(savedInstanceState.getString("text"); 

有什么区别,我怎么可以设置backg圆形颜色onRestoreInstanceState()



编辑:由于原来的职位,我注意到两两件事:


1)mColorRegion.setBackgroundColor(Color.CYAN)似乎并不的onCreate()工作无论是。

2)即使当按下一个按钮下面的函数正确地更改视图的颜色,它不一样,如果我直接从onRestoreInstanceState(称之为工作)

public void centerButton1(View clickedButton) { 
     mColorRegion.setBackgroundColor(Color.CYAN); 
    } 

嗯...

所以我找到了“半解决方案”。如果您添加以下行至AndroidManifest.xml中,它会在方向变化保持颜色:

 android:configChanges="orientation|screenSize" 


但是,这仍然没有回答为什么我可以设置文本,但不颜色onRetoreInstanceState()的onCreate() ...

很多人看不惯使用android:configChanges="orientation|screenSize",像Google's Dianne Hackborn。首先,它会让您的应用程序在多个布局之间切换的过程非常困难(例如,如果您想要一个横向布局和一个纵向布局),因为您必须完成Android通常所做的所有工作自动为您在onConfigurationChanged()

无论如何,我也有这样的问题。我正在创建一个DialogPreference,并且在轮换后,我无法更改 SeekBaronRestoreInstanceState(savedInstanceBundle)的进度...所以这是我的建议,如果你不能使用的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(),因为onRestoreInstanceState()被调用onStart()之后调用,但之前的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"之外,总有另一种方式(除非你想快速旋转WebViews)。