在Activity中没有调用Android onConfigurationChanged()

时间:2011-06-15 14:28:29

标签: java android android-activity orientation

我意识到这个主题还有其他一些帖子,但这些帖子的解决方案对我不起作用。

基本上,我想停止我的Activity在设备方向更改时重新启动。为此,我修改了清单文件中的活动:

        <activity android:name=".MyActivity" android:configChanges="orientation|keyboardHidden"></activity>

我在我的活动中覆盖了onConfigurationChanged()

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

    System.out.println("IN onConfigurationChanged()");
}

但是,在方向更改时,活动仍在重新启动,并且未调用onConfigurationChanged()方法。

有谁知道为什么会这样?

8 个答案:

答案 0 :(得分:8)

您应该使用13 API并在清单的活动部分设置此配置: 机器人:configChanges = “取向| keyboardHidden |屏幕尺寸”

工作正常。在所有Android版本。

答案 1 :(得分:2)

将您的清单更改为以下

<activity android:name=".MyActivity" android:configChanges="orientation|keyboardHidden|screenSize"></activity>

并参阅此链接以获取详细说明orientation issue

答案 2 :(得分:1)

唯一有效的方法是使用getLastNonConfigurationInstance()。 http://developer.android.com/reference/android/app/Activity.html#getLastNonConfigurationInstance()

答案 3 :(得分:1)

您不应该使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);方法调用应用程序中的任何位置,这将避免调用onConfigChanged()方法。

答案 4 :(得分:0)

如果您在清单中定义configchanges = orientation,那么活动将不会重新启动,而是onConfigurationChanged将被调用,因为您当前已实现它。首先尝试使用日志类Log记录(这是在android中记录事物的正确方法,不要使用System out,这被认为是一种不好的做法)和超级之前,但这只是1%的几率它会修复什么发生在你身上。

第二种情况是您将当前活动嵌套在tabHost例如或活动组中。如果您的活动有父活动,则需要在该活动中添加配置更改,并在那里进行回调。

如果是这种情况,并且您想要转发结果或者在子项中执行某些操作,那么您需要在父项中获取对子项的引用,并在其上调用方法以进行更改。

答案 5 :(得分:0)

如果你有一个片段,那么你也需要这个:

void setRetainInstance(boolean retain) 
  

控制是否有片段   实例在Activity重新创建时保留(例如从a   配置改变)。

我遇到了这个并将其设置为'true'修复它。

答案 6 :(得分:0)

我用过这个,它有所帮助:

package="com.s2dio.evallet"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="8" />

答案 7 :(得分:-2)

onConfigurationChanged方法模式化为以下

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();
    }
}