在我的Android应用程序中,当我旋转设备(滑出键盘)时,“活动”将重新启动(调用onCreate)。现在,这可能是应该的,但我在onCreate方法中做了很多初始设置,所以我需要:
将所有初始设置放在另一个功能中,这样不会在设备旋转或使其不再调用Create,布局仅调整或将应用程序限制为仅肖像,以便不调用onCreate。
在我的Android应用程序中,当我旋转设备(滑出键盘)时,“活动”将重新启动(调用onCreate)。现在,这可能是应该的,但我在onCreate方法中做了很多初始设置,所以我需要:
将所有初始设置放在另一个功能中,这样不会在设备旋转或使其不再调用Create,布局仅调整或将应用程序限制为仅肖像,以便不调用onCreate。
当前回答
将此代码添加到manifest.xml中。
这是你的活动。
<activity
....
..
android:configChanges="orientation|screenSize"/>
其他回答
每次旋转屏幕时,打开的活动都会完成,并再次调用onCreate()。
1.当屏幕旋转时,您可以做一件事来保存活动状态,这样,当再次调用活动的onCreate()时,您就可以恢复所有旧的内容。参考此链接
2.如果要阻止重新启动活动,只需在manifest.xml文件中放置以下行。
<activity android:name=".Youractivity"
android:configChanges="orientation|screenSize"/>
您还可以考虑使用Android平台的跨方向更改持久化数据的方式:onRetainNonConfigurationInstance()和getLastNonConfigurationInstance)。
这允许您在配置更改中保存数据,例如您可能从服务器获取的信息或在onCreate中或之后计算的其他信息,同时还允许Android使用xml文件重新布局“活动”,以适应当前使用的方向。
请看这里或这里。
应该注意的是,这些方法现在已经被弃用(尽管比上面大多数解决方案所建议的自己处理方向改变更灵活),建议每个人都切换到Fragments,而不是在每个想要保留的Fragment上使用setRetainInstance(true)。
与其试图阻止onCreate()被完全激发,不如尝试检查传递到事件中的Bundle savedInstanceState,看看它是否为null。
例如,如果我有一些逻辑应该在真正创建“活动”时运行,而不是在每次方向更改时运行,那么只有当savedInstanceState为空时,我才在onCreate()中运行该逻辑。
否则,我仍然希望布局按照方向正确重新绘制。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game_list);
if(savedInstanceState == null){
setupCloudMessaging();
}
}
不确定这是否是最终答案,但这对我来说是有效的。
谷歌推出的android架构中最好的组件之一将满足ViewModel的所有要求。
它旨在以生命周期的方式存储和管理与UI相关的数据,并允许数据在屏幕旋转时继续存在
class MyViewModel : ViewModel() {
请参阅:https://developer.android.com/topic/libraries/architecture/viewmodel
有几种方法可以做到这一点:
保存活动状态
您可以在onSaveInstanceState中保存活动状态。
@Override
public void onSaveInstanceState(Bundle outState) {
/*Save your data to be restored here
Example: outState.putLong("time_state", time); , time is a long variable*/
super.onSaveInstanceState(outState);
}
然后使用捆绑包恢复状态。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState!= null){
/*When rotation occurs
Example : time = savedInstanceState.getLong("time_state", 0); */
} else {
//When onCreate is called for the first time
}
}
自行处理方向更改
另一种选择是自己处理方向更改。但这并不是一种好的做法。
将此添加到清单文件中。
android:configChanges="keyboardHidden|orientation"
对于Android 3.2及更高版本:
android:configChanges="keyboardHidden|orientation|screenSize"
@Override
public void onConfigurationChanged(Configuration config) {
super.onConfigurationChanged(config);
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
//Handle rotation from landscape to portrait mode here
} else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
//Handle rotation from portrait to landscape mode here
}
}
限制旋转
您还可以将活动限制在纵向或横向模式,以避免旋转。
将此添加到清单文件中的活动标记:
android:screenOrientation="portrait"
或者在活动中以编程方式实现:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}