5

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

<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 方法中添加)消失。

Directupload.net 上的屏幕截图

我已经阅读了很多关于处理运行时更改的内容,但我仍然不清楚如何防止按钮 2 在 avobe 示例中消失。非常感谢任何帮助。

4

4 回答 4

1

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

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

@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
    }
}

有关详细信息,请参阅官方文档中的保存活动状态主题。

于 2012-06-26T06:05:49.850 回答
0

如果您想将屏幕设置为纵向模式并希望在方向更改时停止重新创建活动,那么只需将下面的代码放入您的活动中。

代码:

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

这段代码对我有帮助,也对你有用。

享受。

:)

快乐的编码...

于 2012-06-25T04:28:01.997 回答
-1

将此条目放在带有活动的清单中并覆盖 onConfigurationChanged 函数

android:configChanges="orientation|keyboardHidden|screenSize"

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


}

这将停止重新创建方向变化的活动......

于 2012-06-24T08:29:08.250 回答
-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 以下运行,请不要提及它。

于 2012-06-24T08:29:40.717 回答