GridLayout Android

时间:2015-11-25 03:30:47

标签: android layout

我目前正在使用Android应用程序,似乎当我使用GridLayout并将我的平板电脑置于横向模式时,布局会重新加载,我会丢失所有变量。

这种布局有什么特别之处吗?

3 个答案:

答案 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