Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android中处理活动_Android_Android Activity_Orientation_Onconfigurationchanged - Fatal编程技术网

在Android中处理活动

在Android中处理活动,android,android-activity,orientation,onconfigurationchanged,Android,Android Activity,Orientation,Onconfigurationchanged,我需要为我的活动应用不同的纵向和横向布局。此外,如果方向是纵向的,我需要显示警惕 我已经在AndroidManifest中指定了android:configChanges=“orientation | keyboardHidden”。我还重写onConfigurationChanged方法,如下所示: @Override public void onConfigurationChanged(Configuration newConfig) { Log.d("tag", "config c

我需要为我的活动应用不同的纵向和横向布局。此外,如果方向是纵向的,我需要显示警惕

我已经在AndroidManifest中指定了android:configChanges=“orientation | keyboardHidden”。我还重写onConfigurationChanged方法,如下所示:

@Override
public void onConfigurationChanged(Configuration newConfig)
{
    Log.d("tag", "config changed");
    super.onConfigurationChanged(newConfig);

    int orientation = newConfig.orientation;
    if (orientation == Configuration.ORIENTATION_PORTRAIT)
        Log.d("tag", "Portrait");
    else if (orientation == Configuration.ORIENTATION_LANDSCAPE)
        Log.d("tag", "Landscape");
    else
        Log.w("tag", "other: " + orientation);

    ....
}
从横向旋转到纵向时,日志如下所示:

config changed
Portrait
但从肖像画到风景画的变化看起来

config changed
Portrait
config changed
Landscape

为什么调用两次OnConfiguration Changed?如何避免这种情况?

您选择以这种方式处理旋转有什么特别的原因吗?虽然这会更快,因为活动不会在方向更改时重新启动,但如果我没记错的话,通常不建议这样做。处理方向更改的另一种方法是替代重写
onConfigurationChanged()
、重写
onCreate()
onStart()
onResume()
,以便

@Override
public void onStart() {
    super.onStart();
    int orientation = getWindowManager().getDefaultDisplay().getOrientation();
    if(orientation == Configuration.ORIENTATION_PORTRAIT) {
        Log.i(TAG, "Orientation is portrait");
        // show whatever alerts here
    }
}

然后指定两个布局-一个用于纵向,一个用于横向。布局的纵向版本将保持在
res/layout/whatever.xml
,横向版本将保持在
res/layout land/whatever.xml
。AndroidGuys在这个主题上写了很多好文章,请参见

,我很确定您希望使用onCreate而不是onStart。唯一的区别似乎是,当应用程序到达前台时,onStart将被调用。在这种情况下,您不会希望让用户等待您重新初始化UI。否则,只需根据该if条件更改setContentView调用。

Android在更改方向时会启动新的活动实例,因此使用onCreate是理想的方法。显然,您必须保存/恢复活动的数据,以便从上次中断的地方开始—但无论如何,您都应该这样做,因为任何数量的事件都可能会使您的应用程序失去焦点/死机。

您只需保存上一个方向,并检查它是否真的发生了更改


如果您为您的活动设置了
AndroidManifest.xml
android:configChanges
keyboardHidden | orientation
onCreate
等。。。不会被叫的。这使得实现更容易实现。当然,布局也会从纵向变为横向。

请看我对另一个问题的回答:

简言之,正确处理配置更改很难。最好在应用程序由于配置更改而即将停止和重新启动之前实现调用的。使用此方法保存您想要的任何内容(“这是一个不错的选择”),然后让系统拆除您的应用程序


使用新配置重新启动应用程序时,请使用以检索刚刚保存的状态,并使用它继续应用程序,而不必使用捆绑包和共享首选项。

为什么OnConfiguration Changed()是一种糟糕的方式?你能给我一个解释的链接吗?如果我使用onCreate()或类似的方法,活动将被重新创建,其数据将丢失。我同意你的观点,当设备的方向改变时,会调用onCreate方法。为什么它比onConfigurationChanged更好?我相信在这种情况下,你最终会构建两次UI。屏幕旋转时,将调用OnConfiguration Change和onCreate。您已经必须在onCreate中为所有其他创建情况设置UI。我注意到,如果处理onConfigurationChanged,则不会重新创建“活动”,也不会调用onDestroy和onCreate