Isa*_*ler 1341 android rotation android-activity
在我的Android应用程序中,当我旋转设备(滑出键盘)然后我Activity重新启动(onCreate被调用).现在,这可能是它应该如何,但我在onCreate方法中做了很多初始设置,所以我需要:
onCreate不会再次调用,布局只是调整或onCreate不调用.Ret*_*ier 949
使用应用程序类
根据您在初始化时所做的操作,您可以考虑创建一个新类,该类Application将初始化代码扩展并移动到onCreate该类中的重写方法中.
public class MyApplicationClass extends Application {
@Override
public void onCreate() {
super.onCreate();
// TODO Put your application initialization code here.
}
}
Run Code Online (Sandbox Code Playgroud)
在onCreate创建整个应用程序时在应用程序类只调用,所以活动的方向或键盘能见度变化重启不会触发它.
最好将此类的实例公开为单例,并使用getter和setter公开正在初始化的应用程序变量.
注意:您需要在清单中指定新Application类的名称,以便注册和使用它:
<application
android:name="com.you.yourapp.MyApplicationClass"
Run Code Online (Sandbox Code Playgroud)
对配置更改做出反应 [更新:自API 13以来不推荐使用此功能; 看推荐替代 ]
作为另一种选择,您可以让应用程序侦听可能导致重新启动的事件(如方向和键盘可见性更改),并在您的Activity中处理它们.
首先将android:configChanges节点添加到Activity的清单节点
<activity android:name=".MyActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name">
Run Code Online (Sandbox Code Playgroud)
<activity android:name=".MyActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/app_name">
Run Code Online (Sandbox Code Playgroud)
然后在Activity中覆盖onConfigurationChanged方法并调用setContentView以强制GUI布局在新方向中重新完成.
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setContentView(R.layout.myLayout);
}
Run Code Online (Sandbox Code Playgroud)
Gor*_*orm 183
Android 3.2及更高版本的更新:
注意:从Android 3.2(API级别13)开始,当设备在纵向和横向之间切换时,"屏幕大小"也会更改.因此,如果要在开发API级别13或更高级别(由minSdkVersion和targetSdkVersion属性声明)时由于方向更改而阻止运行时重新启动,则必须在
"screenSize"值之外包含该"orientation"值.也就是说,你必须申报android:configChanges="orientation|screenSize".但是,如果您的应用程序的目标是API级别12或更低,那么您的活动始终会自行处理此配置更改(即使在Android 3.2或更高版本的设备上运行,此配置更改也不会重新启动您的活动).
neb*_*lae 123
onCreate()可以尝试检查Bundle savedInstanceState传入事件以查看它是否为空,而不是试图完全阻止被解雇.
例如,如果我有一些逻辑应该在Activity真正创建时运行,而不是在每次方向更改时运行,我只在onCreate()该savedInstanceState值为null 时才运行该逻辑.
否则,我仍然希望布局正确地重新绘制方向.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game_list);
if(savedInstanceState == null){
setupCloudMessaging();
}
}
Run Code Online (Sandbox Code Playgroud)
不确定这是否是最终的答案,但它对我有用.
Som*_*ere 98
我做了什么...
在清单中,到活动部分,添加:
android:configChanges="keyboardHidden|orientation"
Run Code Online (Sandbox Code Playgroud)
在活动的代码中,实现了:
//used in onCreate() and onConfigurationChanged() to set up the UI elements
public void InitializeUI()
{
//get views from ID's
this.textViewHeaderMainMessage = (TextView) this.findViewById(R.id.TextViewHeaderMainMessage);
//etc... hook up click listeners, whatever you need from the Views
}
//Called when the activity is first created.
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
InitializeUI();
}
//this is called when the screen rotates.
// (onCreate is no longer called when screen rotates due to manifest, see: android:configChanges)
@Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
setContentView(R.layout.main);
InitializeUI();
}
Run Code Online (Sandbox Code Playgroud)
Gre*_*egD 65
您描述的是默认行为.您必须通过添加以下内容来自行检测和处理这些事件:
android:configChanges
Run Code Online (Sandbox Code Playgroud)
到您的清单,然后是您想要处理的更改.因此,对于方向,您将使用:
android:configChanges="orientation"
Run Code Online (Sandbox Code Playgroud)
并且对于打开或关闭的键盘,您将使用:
android:configChanges="keyboardHidden"
Run Code Online (Sandbox Code Playgroud)
如果你想要处理两者,你可以使用管道命令将它们分开,如:
android:configChanges="keyboardHidden|orientation"
Run Code Online (Sandbox Code Playgroud)
这将在您调用的任何Activity中触发onConfigurationChanged方法.如果覆盖该方法,则可以传入新值.
希望这可以帮助.
Liu*_*kys 45
我刚刚发现了这个传说:
为了使Activity通过方向更改保持活动并进行处理onConfigurationChanged,上面的文档和代码示例在Manifest文件中提示:
<activity android:name=".MyActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name">
Run Code Online (Sandbox Code Playgroud)
它具有始终有效的额外好处.
奖金传说是省略keyboardHidden可能看起来合乎逻辑,但它会导致模拟器失败(至少对于Android 2.1):仅指定orientation将使模拟器同时调用OnCreate,onConfigurationChanged有时只调用OnCreate其他时间.
我没有看到设备上的故障,但我听说过仿真器失败了.所以值得记录.
Jon*_*n O 37
您也可以考虑使用Android平台在方向更改中保持数据的方式: onRetainNonConfigurationInstance()和getLastNonConfigurationInstance().
这允许您在配置更改中保留数据,例如您可能从服务器提取中获取的信息或在其中onCreate或之后计算的其他信息,同时还允许Android Activity使用xml文件重新布局您正在使用的方向.
应该注意的是,这些方法现在已被弃用(尽管仍然比上述大多数解决方案所建议的更方便地处理方向更改),建议每个人切换到您想要保留的每个方法Fragments,而不是使用setRetainInstance(true)它们Fragment.
Abd*_*bdo 30
该方法很有用,但在使用Fragments时不完整.
通常会在配置更改时重新创建片段.如果您不希望发生这种情况,请使用
setRetainInstance(true); 在Fragment的构造函数中
这将导致在配置更改期间保留片段.
http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)
小智 24
我只是简单地说
android:configChanges="keyboard|keyboardHidden|orientation"
Run Code Online (Sandbox Code Playgroud)
在清单文件中并没有onConfigurationChanged在我的活动中添加任何方法.
Car*_*rol 16
Run Code Online (Sandbox Code Playgroud)onConfigurationChanged is called when the screen rotates. (onCreate is no longer called when screen rotates due to manifest, see: android:configChanges)
清单的哪一部分告诉它"不要打电话onCreate()"?
此外,谷歌的文档说,以避免使用android:configChanges(除非作为最后的手段)....但随后他们建议所有DO使用的替代方法android:configChanges.
根据我的经验,模拟器总是要求onCreate()轮换.
但是我运行相同代码的1-2个设备却没有.(不确定为什么会有任何区别.)
Vai*_*iya 16
将以下代码放入您的<activity>代码中Manifest.xml:
android:configChanges="screenLayout|screenSize|orientation"
Run Code Online (Sandbox Code Playgroud)
Man*_*eja 16
只需执行以下步骤即可:
<activity
android:name=".Test"
android:configChanges="orientation|screenSize"
android:screenOrientation="landscape" >
</activity>
Run Code Online (Sandbox Code Playgroud)
这对我有用:
注意:方向取决于您的要求
sum*_*dey 15
Android清单中的更改包括:
android:configChanges="keyboardHidden|orientation"
Run Code Online (Sandbox Code Playgroud)
内部活动的增加是:
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
}
Run Code Online (Sandbox Code Playgroud)
Par*_*ikh 15
将此行添加到清单中: -
android:configChanges="orientation|keyboard|keyboardHidden|screenSize|screenLayout|uiMode"
Run Code Online (Sandbox Code Playgroud)
和活动的这个片段: -
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
Run Code Online (Sandbox Code Playgroud)
Piy*_*ush 13
做这件事有很多种方法:
您可以保存活动状态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);
}
Run Code Online (Sandbox Code Playgroud)
然后使用bundle恢复状态.
@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
}
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是自己处理方向变化.但这不是一个好习惯.
将其添加到清单文件中.
android:configChanges="keyboardHidden|orientation"
Run Code Online (Sandbox Code Playgroud)
适用于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 portarit mode here
} else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
//Handle rotation from portrait to landscape mode here
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以将活动限制为纵向或横向模式以避免旋转.
将其添加到清单文件中的activity标记:
android:screenOrientation="portrait"
Run Code Online (Sandbox Code Playgroud)
或者在您的活动中以编程方式实现:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
Run Code Online (Sandbox Code Playgroud)
Car*_*arl 11
即使它不是"Android方式",我通过自己处理方向更改并简单地在视图中重新定位小部件以考虑更改的方向,获得了非常好的结果.这比任何其他方法都快,因为您的视图不必保存和恢复.它还为用户提供了更加无缝的体验,因为重新定位的小部件是完全相同的小部件,只是移动和/或调整大小.不仅可以以这种方式保存模型状态,还可以保存视图状态.
RelativeLayout对于必须不时重新定位的视图,有时可能是一个不错的选择.您只需为每个子窗口小部件提供一组纵向布局参数和一组景观布局参数,每个参数都有不同的相对定位规则.然后,在您的onConfigurationChanged()方法中,将适当的一个传递setLayoutParams()给每个孩子的调用.如果任何子控件本身需要在内部重新定向,您只需在该子项上调用一个方法来执行重定向.那个孩子同样呼吁任何方法的需要重新定位内部,等子控件.
Sha*_*aun 11
我发现这样做的方法是使用onRestoreInstanceState和onSaveInstanceState事件来保存一些东西Bundle(即使你不需要保存任何变量,只是把东西放在那里,所以Bundle不是空的).然后,在该onCreate方法上,检查是否Bundle为空,如果是,则进行初始化,如果不是,则执行此操作.
每次旋转屏幕时,打开的活动都会完成,并再次调用onCreate().
1.当屏幕旋转时,你可以做一件事保存活动状态,这样,当再次调用活动的onCreate()时,你可以恢复所有旧东西.请参阅此 链接
2.如果要阻止重新启动活动,请在manifest.xml文件中放置以下行.
<activity android:name=".Youractivity"
android:configChanges="orientation|screenSize"/>
Run Code Online (Sandbox Code Playgroud)
注意:如果将来某人遇到与我相同的问题,我会发布此答案.对我来说,没有采用以下方法:
android:configChanges="orientation"
Run Code Online (Sandbox Code Playgroud)
当我旋转屏幕时,方法`onConfigurationChanged(Configuration newConfig)没有被调用.
解决方案:即使问题与方向有关,我也必须添加"screenSize".所以在AndroidManifest.xml文件中,添加:
android:configChanges="keyboardHidden|orientation|screenSize"
Run Code Online (Sandbox Code Playgroud)
然后实现该方法 onConfigurationChanged(Configuration newConfig)
您需要使用onSavedInstanceState方法将所有值存储到其参数中,即has是bundle
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
outPersistentState.putBoolean("key",value);
}
Run Code Online (Sandbox Code Playgroud)
并使用
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
savedInstanceState.getBoolean("key");
}
Run Code Online (Sandbox Code Playgroud)
要检索并查看对象,它将处理屏幕旋转
小智 5
在活动部分manifest,添加:
android:configChanges="keyboardHidden|orientation"
Run Code Online (Sandbox Code Playgroud)
人们说你应该使用
android:configChanges="keyboardHidden|orientation"
Run Code Online (Sandbox Code Playgroud)
但是在 Android 中处理旋转的最好和最专业的方法是使用 Loader 类。它不是一个著名的类(我不知道为什么),但它比 AsyncTask 好得多。有关更多信息,您可以阅读 Udacity 的 Android 课程中的 Android 教程。
当然,作为另一种方式,您可以使用 onSaveInstanceState 存储值或视图,并使用 onRestoreInstanceState 读取它们。这真的取决于你。
谷歌推出的 android 架构的最佳组件之一将满足您对 ViewModel 的所有要求。
旨在以生命周期方式存储和管理 UI 相关数据,并且允许数据在屏幕旋转时继续存在
class MyViewModel : ViewModel() {
Run Code Online (Sandbox Code Playgroud)
请参考:https : //developer.android.com/topic/libraries/architecture/viewmodel