android:configChanges="orientation"与fragment不兼容

61

我只是想调整一些应用程序以适应HoneyComb。

我遇到的问题是,在方向更改(横向/纵向)时,我的活动被销毁了。

当我使用经典活动时,我在清单中编写了以下内容:

但现在,所有这些行都不再起作用!

有没有解决方法?

我的代码:

    <activity android:name=".TwitterActivity" android:label="@string/app_name"
        android:configChanges="keyboardHidden|orientation" />

    <activity android:name=".TwitterActivity$AppListFragment"
    android:configChanges="keyboardHidden|orientation"  />
8个回答

78

根据我在Honeycomb 3.0和兼容库(r1)方面的经验。

configChange ="orientation" 对于片段(fragment)在防止活动(activity)(应用它的活动)在屏幕方向改变时被重新创建方面是有效的。如果你希望该fragment不在活动重新创建时被重新创建,则在onCreate中调用setRetainInstance

除非我漏掉了什么,否则我不太明白你的第二个清单条目,AppListFragment不是一个Fragment吗? 如果是,为什么要在您的清单中将其列为条目?

请参见 SO Answer 中的新限定符,如果你的目标SDK版本是13,则可能会导致这种情况,请尝试使用android:configChanges="orientation|screenSize"


第二个清单条目只是一个测试,因为我很失望。我可以向您保证,在活动内部的片段中设置configchange="orientation"是无效的。 - Waza_Be
@ Profete162 我不确定你所说的“在活动中的片段无法工作”的意思。片段内部不应影响活动的重新创建。您的目标 sdk 是什么?请参阅链接以获取可能的答案。 - PJL
回答看起来很棒,我会去尝试一下今晚的工作,但我非常确定你的答案会被接受! - Waza_Be
12
感谢screenSize提示和指向其他stackoverflow答案的链接,给它点个赞。 - sven
从Google文档(搜索“方向”并阅读下面的两个属性)中:http://developer.android.com/guide/topics/manifest/activity-element.html#config - milosmns

37

我曾经遇到类似的问题,但是需要添加一些内容才能使它与各种版本(包括ICS)一起工作。

在主应用程序活动中,我添加了Jason提供的略微不同版本。

<activity
android:name=".MyMainActivity"
android:configChanges="orientation|keyboardHidden|screenSize" 
android:label="@string/app_name" >

我曾经在Honeycomb之前的版本上使用以下代码:

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

我不得不编写第一个示例,以使其在所有版本上都能运行。我目前正在使用片段和ActionBarSherlock进行向后兼容。

我还改变了保存和重新加载的方式:

        public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        // Set up webview object
        View v = inflater.inflate(R.layout.webview_layout, container, false);
        webview = (WebView)v.findViewById(R.id.webview_fragment);
        webview.getSettings().setJavaScriptEnabled(true);

        // Check to see if it has been saved and restore it if true
        if(savedInstanceState != null)
        {
            if (savedInstanceState.isEmpty())
                Log.i(tag, "Can't restore state because bundle is empty.");
            else
            {
                if (webview.restoreState(savedInstanceState) == null)
                    Log.i(tag, "Restoring state FAILED!");      
                else
                    Log.i(tag, "Restoring state succeeded.");      
            }

        }
        else 
        {
            // Load web page
            webview.setWebViewClient(new MyWebViewClient());
            webview.getSettings().setPluginsEnabled(true);
            webview.getSettings().setBuiltInZoomControls(false); 
            webview.getSettings().setSupportZoom(false);
            webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);   
            webview.getSettings().setAllowFileAccess(true); 
            webview.getSettings().setDomStorageEnabled(true);
            webview.loadUrl(mTabURL);       
        }
        return v;
    }

保存实例状态方法的代码:
       @Override
    public void onSaveInstanceState(Bundle outState)
    {
        if(webview.saveState(outState) == null)
            Log.i(tag,"Saving state FAILED!");
        else
            Log.i(tag, "Saving state succeeded.");      
    }

希望这能有所帮助。

非常感谢,这帮助我解决了一个类似的问题,当我将我的应用程序升级到ICS时。 - Andi Jay

34

在API 13及以下版本中,configChanges属性有一个新值,screenSize

因此,如果您正在使用大屏幕,请确保在configChanges属性中添加screenSize:

        android:configChanges="orientation|keyboardHidden|screenSize"

1
screenSize会在 Api < 13 上崩溃吗? - Muhammad Babar

9

从Android 3.2(API级别13)开始,当设备在纵向和横向方向之间切换时,“屏幕尺寸”也会发生变化。因此,如果你想在开发API级别为13或更高版本的应用程序(由minSdkVersion和targetSdkVersion属性声明)时防止方向更改导致运行时重新启动,必须除了“orientation”值之外还要包括“screenSize”值。也就是说,你必须声明android:configChanges="orientation|screenSize"。但是,如果你的应用程序针对API级别12或更低版本,则始终会自己处理此配置更改(即使在运行Android 3.2或更高版本的设备上,此配置更改也不会重新启动你的活动)。


5

即使没有片段,我也遇到了同样的问题(即活动重新启动)。

我改变了:

android:configChanges="orientation|keyboardHidden"

to:

android:configChanges="orientation|keyboardHidden|screenSize" 

防止该活动重新启动。

2

我知道这个回答有点晚了,但最近我也遇到了这个问题,并成功地解决了Fragment Activity的问题。

1)在清单文件中,

      android:configChanges="orientation|keyboardHidden|screenSize"

2)在类文件中,重写 onSaveInstanceState(Bundle outState)方法。就这样!享受吧:)


0
在清单文件中,活动内添加此行。
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"

-1

将此添加到Manifeast.Xml中

<android:configChanges="orientation|screenSize" >

它适合你的需求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接