android:configChanges =“orientation”不适用于片段

时间:2011-08-21 16:20:53

标签: android android-fragments android-activity restart

我只是想让我的一些应用程序适应HoneyComb。

我面临的问题是我对方向变化(风景/肖像)活动的破坏

当我使用经典活动时,我在清单中写道:

但现在,所有这些线路都不再起作用了!

是否有解决方法?

我的代码:

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

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

8 个答案:

答案 0 :(得分:77)

基于我对Honeycomb 3.0和兼容性库(r1)的经验。

configChange="orientation"确实可以处理片段,以防止在方向更改时重新创建活动(应用它)。如果您希望在重新创建活动时不重新创建fragment,请在setRetainInstance中致电onCreate

除非我遗漏了一些东西,否则我的第二个清单条目不完整,不是AppListFragment一个Fragment吗?如果是,那么为什么它会在您的清单中列为条目?

如果您要定位sdk 13,请参阅SO Answer了解可能导致此问题的新限定符,建议您尝试android:configChanges="orientation|screenSize"

答案 1 :(得分:37)

我有一个非常类似的问题,但不得不做一些补充,以使其与各种版本(包括ICS)一起使用。

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

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

我在蜂窝前做过这个:

           <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.");      
    }

希望这有帮助。

答案 2 :(得分:34)

在API 13之前,configChanges属性有一个新值,screenSize

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

        android:configChanges="orientation|keyboardHidden|screenSize"

答案 3 :(得分:9)

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

答案 4 :(得分:4)

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

我改变了:

android:configChanges="orientation|keyboardHidden"

为:

android:configChanges="orientation|keyboardHidden|screenSize" 

阻止活动重启。

答案 5 :(得分:1)

我知道这是一个很晚的答案,但我最近遇到了这个问题,并且能够解决碎片活动。

1)在Manifest中,

      android:configChanges="orientation|keyboardHidden|screenSize"

2)在Class文件中,覆盖onSaveInstanceState(Bundle outState)。    而已!享受:)

答案 6 :(得分:0)

在Manifest文件中,内部活动添加此行
android:configChanges =“keyboard | keyboardHidden | orientation | screenSize”。

答案 7 :(得分:-1)

将此添加到Manifeast.Xml

<android:configChanges="orientation|screenSize" >

它适合你。