片段和onConfigurationChanged

时间:2013-04-29 15:40:32

标签: android android-fragments layout-inflater

我正在尝试用活动做一些事情,但是在一个片段中。 我所做的是使用活动:

旋转设备时,首先停止活动重启 android:configChanges="keyboardHidden|orientation|screenSize"

在我的活动中添加:

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

 setContentView(R.layout.main);
}

所以让活动不重启,而是重新加载main.xml,使用layout-land

现在我有一个显示viewpager的活动,其中包含三个片段。 一切正常。旋转的检测在片段中

public class FRG_map_web extends Fragment  {

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

        Log.i("myLogs", "Rotation");

    }

问题是该片段不使用setContentView(R.layout.main);这是代码:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.frg.myFragment, null); 

我试图使用:

LayoutInflater inflater = inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

view = inflater.inflate(R.layout.frg.myFragment, null); 

...

LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

view = inflater.inflate(R.layout.frg.myFragment, null); 

...

LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );

view = inflater.inflate(R.layout.frg.myFragment, null); 

...

LayoutInflater li = LayoutInflater.from(context);

和不同的方式,但总是没有成功 我无法正常充气。

有谁能告诉我我该怎么做?

提前致谢,我感谢您的帮助

此致

5 个答案:

答案 0 :(得分:25)

如果我理解正确,您不希望片段在每次旋转时重新加载。相反,您希望重新发布视图并使用您已有的信息更新它们。

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

    // Get a layout inflater (inflater from getActivity() or getSupportActivity() works as well)
    LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View newView = inflater.inflate(R.layout.frg.myFragment, null);
    // This just inflates the view but doesn't add it to any thing.
    // You need to add it to the root view of the fragment
    ViewGroup rootView = (ViewGroup) getView();
    // Remove all the existing views from the root view.
    // This is also a good place to recycle any resources you won't need anymore
    rootView.removeAllViews();
    rootView.addView(newView);
    // Viola, you have the new view setup
}

根据文档(getView()),getView()返回从onCreateView()返回的相同视图,但它没有。它实际上返回你在onCreateView()中返回的视图的父级,这正是你需要的。 getView()将返回NoSaveStateFrameLayout的实例,该实例专门用于Fragments作为其根视图。

希望这有帮助。

答案 1 :(得分:14)

您是否考虑过保留片段实例?请参阅Fragment#setRetainInstance

允许重新创建Activity(不指定android:configChanges),但保留片段实例的方向更改。如果在Fragment#onCreate中发生所有繁重的工作,这应该可以正常工作。由于没有重新创建片段,因此不会再次调用onCreate()。

答案 2 :(得分:2)

我可以通过在onConfigurationChanged:

中重新附加片段来实现
   @Override
   public void onConfigurationChanged(Configuration newConfig)
    {
        getActivity().detachFragment(this);

        super.onConfigurationChanged(newConfig);

        ....

        getActivity().attachFragment(this);
    }

请记住,通过分离和附加您的片段,您将只使用其视图。但片段状态在片段管理器中“保存”。

答案 3 :(得分:0)

也许你可以尝试使用

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.frg.myFragment, container, false);
}

。在任何情况下,片段仍然必须被销毁和重新创建,为什么不让Android通过重新启动活动自动处理它?如果有任何数据要保留,您可以将其保存在onSavedInstanceState()中。 Android中不建议设置android:configChanges="keyboardHidden|orientation|screenSize"

答案 4 :(得分:0)

您可以尝试分离 e 附加片段:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    FragmentManager fragmentManager = getFragmentManager();
    if (fragmentManager != null) {
        fragmentManager.beginTransaction().detach(this).commitAllowingStateLoss();
    }
    super.onConfigurationChanged(newConfig);
    if (fragmentManager != null) {
        fragmentManager.beginTransaction().attach(this).commitAllowingStateLoss();
    }
}