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