屏幕方向改变时如何防止布局重置?

时间:2012-06-24 08:14:26

标签: java android android-layout android-orientation

我的示例改编自其中一个兼容性库附带的示例应用程序。这是布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="8dp">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:text="@string/fragment_menu_msg" />

<CheckBox android:id="@+id/menu1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:checked="true"
    android:text="@string/fragment1menu">
</CheckBox>

<CheckBox android:id="@+id/menu2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:checked="true"
    android:text="@string/fragment2menu">
</CheckBox>

</LinearLayout>

这里有一些Java代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_menu);

    ViewGroup layout = (ViewGroup) findViewById(R.id.layout);
    Button btn = new Button(getApplication());
    btn.setId(1);
    btn.setText("Button 1");
    layout.addView(btn);

    mCheckBox1 = (CheckBox) findViewById(R.id.menu1);
    mCheckBox1.setOnClickListener(mClickListener);
}

final OnClickListener mClickListener = new OnClickListener() {
    public void onClick(View v) {

        ViewGroup layout = (ViewGroup) findViewById(R.id.layout);
        Button btn = new Button(v.getContext());
        btn.setId(2);
        btn.setText("Button 2");
        layout.addView(btn);
    }
};

活动开始,您禁用第一个复选框,一个按钮(按钮2)添加到布局,您更改屏幕方向,按钮2(在onClickListener方法中添加)消失。

Screenshots on Directupload.net

我已经阅读了很多关于Handling Runtime Changes的内容,但我仍然没有清楚地了解如何防止按钮2在avobe示例中消失。任何帮助都非常感谢。

4 个答案:

答案 0 :(得分:0)

如果您想要在纵向模式下设置屏幕,并希望在方向更改时停止重新创建活动,那么只需将以下代码添加到您的活动中即可。

代码:

<activity android:name=".YourActivityName" android:windowSoftInputMode="adjustPan" android:screenOrientation="portrait" android:configChanges="keyboard|keyboardHidden|orientation"></activity>

此代码对我有帮助,也适合您。

享受。

:)

快乐编码......

答案 1 :(得分:0)

当您更改方向并且其所有状态都丢失时,活动将重新启动(在您的情况下为动态添加按钮)。您必须准备好处理此问题,因为还有其他可能发生这种情况的情况。例如,如果应用程序在后台并且设备需要释放内存,则可能会将其杀死。

正确的解决方案是在活动被销毁之前保存活动状态,然后在重新创建活动后将其恢复。像这样:

@Override
protected void onSaveInstanceState(Bundle outState) {
    // save state of your activity to outState
}

@Override
public void onCreate(Bundle savedInstanceState) {
    if (savedInstanceState != null) {
        // restore state of your activity from savedInstanceState
    }
}

有关详细信息,请参阅官方文档中的Saving activity state主题。

答案 2 :(得分:-1)

将此条目放入清单中,包含活动和覆盖onConfigurationChanged函数

android:configChanges="orientation|keyboardHidden|screenSize"

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


}

这将停止在方向改变上重新创建活动......

答案 3 :(得分:-1)

让你的活动在清单

中看起来像这样
  <activity
                android:name=".Hello"
                android:label="@string/app_name"
                android:screenOrientation="portrait"   <-- Screen will be forced to have portrait
                android:configChanges="orientation|keyboardHidden|screensize" > <-- No Restart in these cases

ScreenSize属性似乎是在4.0中添加的,所以如果你要低于4.0,请不要提及它。