碎片和处理方向的变化

时间:2011-12-13 19:37:41

标签: android orientation fragment

我有一个带有片段的活动。

我想自己处理方向更改,所以我更新了清单,如下所示:

    <activity android:name="com.test.app" android:configChanges="orientation|keyboardHidden"/>

然后我将活动更新为:

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

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        updateLayout();
    }

    private void updateLayout() {
        setContentView(R.layout.my_layout);
    }

我也用片段做到了这一点:

    fragment.setRetainInstance(true);

我遇到的问题是,当我进行屏幕方向时,它在setContentView()上失败,说我的片段有一个重复的id。不确定如何做到这一点不会发生 - 想法?

TIA。

1 个答案:

答案 0 :(得分:1)

我相信这是因为你告诉它不要丢弃你之前的布局,所以当你旋转它时,你仍然有你的旧视图(在这种情况下,它与新视图相同,因此ID冲突)。

另外,我不确定,但我认为:

fragment.setRetainInstance(true);

是不必要的?因为在这里你告诉它不要重新配置你对配置更改的活动:

android:configChanges="orientation|keyboardHidden"

根据我的经验,XML中的configChanges设置足以阻止娱乐。

编辑:

嗯,再看一遍,你究竟是如何使用Fragments的?如果这里发布的代码来自你的FragmentActivity,那么我希望这样的东西可以膨胀你的Fragment并将它添加到Activity中:

class SomeActivity extends FragmentActivity
{
    ...
    @Override
    public void onCreate( Bundle savedInstance )
    {
    ...
        LayoutInflater inflater = getLayoutInflater();
        inflater.inflate( R.layout.some_fragment, root );
    ...
    }
}

使用XML看起来像: some_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<fragment
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:name="com.someapp.fragments.SomeFragment">
</fragment>

所以我想我不清楚你是如何使用Fragments的。但是使用它们,使用XML配置设置,成功禁用旋转娱乐。