我目前正在使用Android应用程序,似乎当我使用GridLayout并将我的平板电脑置于横向模式时,布局会重新加载,我会丢失所有变量。
这种布局有什么特别之处吗?
答案 0 :(得分:4)
没有什么特别的。这是android系统的工作原理。
但是,如果您希望每次配置更改时都停止加载活动,则可以将此代码放在Manifest.xml
文件中。
<activity>
android:configChanges="orientation|screenSize"
...
</activity>
希望这有帮助。
<强>更新强>
另请注意,每次定向或屏幕尺寸更改时,这都会停止重新创建活动。
对于每种情况,这可能不是一个合适的解决方案。
您可以使用onConfigurationChanged()
方法。这个android方法在你的activity
运行时跟踪配置的变化。该方法由系统调用。如果您希望自己的活动为横向和纵向模式显示不同的布局,则只需创建两个xml layouts
并将下面的代码放在onConfigurationChanged(Configuration newConfig)
内:
@override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
setContentView(R.layout.layout_landscape);
else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
setContentView(R.layout.layout_portrait);
}
答案 1 :(得分:1)
当您的方向发生变化时,android系统会重新创建活动以加载该特定方向的更改。您可以阻止重新加载,也可以重新设计每个方向的布局。要更改布局,您必须创建单独的布局文件,并且必须在onCreate中设置它
例如:
if(orientation == LANDSCAPE){
setContentView(R.layout.layout_landscape);
}else{
setContentView(R.layout.layout_portrait);
}
或正如我所说,你必须阻止重建活动。即使你可以尝试,它也不是一个好的选择。因为你必须在你的清单中设置它。
<activity
android:name="MainActivity"
android:screenOrientation="portrait"
android:configChanges="keyboardHidden|orientation|screenSize">
答案 2 :(得分:1)
当您旋转Android设备时,当前活动及其中的所有内容都将被销毁,并再次创建活动。保持变量覆盖onSaveInstanceState(在销毁活动之前调用它)并存储变量。
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
然后在你的onCreate方法中添加以下代码,该代码将检查是否存在来自活动可能已被销毁的数据。如果存在,它会将数据放入适当的变量中,这样您就可以继续使用活动,就像没有任何改变一样。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // Always call the superclass first
// Check whether we're recreating a previously destroyed instance
if (savedInstanceState != null) {
// Restore value of members from saved state
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
} else {
// Probably initialize members with default values for a new instance
}
...
}
http://developer.android.com/training/basics/activity-lifecycle/recreating.html