我的示例改编自其中一个兼容性库附带的示例应用程序。这是布局文件:
<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示例中消失。任何帮助都非常感谢。
答案 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,请不要提及它。