7

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

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

在我的活动中添加:

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

 setContentView(R.layout.main);
}

所以得到的activity不会重启,而是重新加载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);

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

谁能告诉我该怎么做?

在此先感谢,感谢您的帮助

问候

4

5 回答 5

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 作为其根视图。

希望这可以帮助。

于 2013-05-07T05:20:26.837 回答
15

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

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

于 2013-05-08T12:02:27.790 回答
2

我可以通过在 onConfigurationChanged 中重新附加片段来做到这一点:

   @Override
   public void onConfigurationChanged(Configuration newConfig)
    {
        getActivity().detachFragment(this);

        super.onConfigurationChanged(newConfig);

        ....

        getActivity().attachFragment(this);
    }

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

于 2014-04-04T13:16:45.130 回答
2

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

@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();
    }
}
于 2018-12-27T22:13:33.380 回答
0

也许你可以尝试使用

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

. 无论如何,fragment 还是要被销毁和重新创建的,为什么不让 Android 通过重启 Activity 来自动处理呢?如果有任何数据要保留,您可以将其保存在onSavedInstanceState(). android:configChanges="keyboardHidden|orientation|screenSize"不建议在 Android 中设置。

于 2013-05-03T05:58:59.683 回答