Android碎片生命周期方向更改

Android碎片生命周期方向更改,android,android-fragments,fragment-lifecycle,Android,Android Fragments,Fragment Lifecycle,我有一个活动,它应该只在纵向模式下显示片段。所以,我的肖像布局有容器视图和我的风景-不要。但是,更改方向后,即使没有可显示的容器,也会重新创建纵向->横向碎片。 此外,这个重新创建的片段确实是活动的,并响应所有生命周期事件,如暂停、恢复等 日志: 如何避免方向改变后产生碎片 以下是我所有的: public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle

我有一个活动,它应该只在纵向模式下显示片段。所以,我的肖像布局有容器视图和我的风景-不要。但是,更改方向后,即使没有可显示的容器,也会重新创建纵向->横向碎片。
此外,这个重新创建的片段确实是活动的,并响应所有生命周期事件,如暂停、恢复等

日志:

如何避免方向改变后产生碎片

以下是我所有的:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        View container = findViewById(R.id.container);
        if (container != null) {
            getSupportFragmentManager().beginTransaction()
                    .replace(container.getId(), new A(), "tag")
                    .commit();
        } else {
            Log.d(MainActivity.class.getSimpleName(), "Nowhere to attach!");
        }
    }

    public static class A extends Fragment {

        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            return inflater.inflate(R.layout.fragment, container, false);
        }

        @Override
        public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);

            getViewLifecycleOwner().getLifecycle().addObserver(new LifecycleEventObserver() {
                @Override
                public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
                    Log.d(A.class.getSimpleName(), String.format("%s - %s", A.this.toString(), event.name()));
                }
            });
        }
    }
}
layout.xml


layout-land.xml


fragment.xml


我目前的解决方案是在Activity的
onCreate(…)
方法中传递
null

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

但这看起来很危险,因为我可能不是唯一一个使用保存的实例状态来实际存储状态的人。

你的意思是,当方向改变occres时,你想阻止碎片的再现吗?@Kabir,是的,没错。但是添加
setRetainInstance(true)
不会有帮助,只会导致IllegalStateException,因为它会尝试将片段附加到不存在的视图。好的,但您也可以使用onSaveInstanceState保存片段状态。我不需要保存它-我需要忽略它,所以不会再次创建它。然后我只有两种方式setRetainInstance(true)在片段的onCreate()内部。您可以保存片段的状态,并在定向发生时返回该片段。
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
    }