为什么在 Android 中设备旋转后调用了 Fragment 中的 onCreateView 两次?
Why is onCreateView in Fragment called twice after device rotation in Android?
我有简单的 activity 和片段交易。我注意到在配置更改时,Fragment 的 oncreateView 被调用了两次。为什么会这样?
Activity 代码在这里:
@Override
protected void onCreate(Bundle savedInstanceState) {
System.out.println("Activity created");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager manager = getSupportFragmentManager();
BlankFragment fragment = new BlankFragment();
addFragmentToActivity(manager,
fragment,
R.id.root_activity_create
);
}
public static void addFragmentToActivity (FragmentManager fragmentManager,
Fragment fragment,
int frameId)
{
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(frameId, fragment);
transaction.commit();
}
片段代码在这里:
public class BlankFragment extends Fragment {
public BlankFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_blank, container, false);
}
}
Android 旋转后自动恢复其视图状态。您不必在旋转后再次调用 addFragmentToActivity。片段将自动为您还原!
在你的例子中,它发生了两次,因为:
1. Android恢复fragment,其onCreateView被调用
2.你用你自己的片段替换恢复的片段,那个片段的oncreateview也被调用
这样做:
if (savedInstanceState == null)
{
addFragmentToActivity(manager, fragment, R.id.test);
}
首次加载时 onCreateView()
被调用一次
但是 onRotationonCreateView()
被调用了两次
为什么?
因为这个transaction.replace(frameId, fragment);
真的吗?是的,我的意思是因为 fragment
。您在第一次加载时已经有一个片段,当您旋转 onCreate()
时将再次调用,所以现在片段管理器有旧片段,所以它的方法将执行(一次) ,接下来你正在做交易 replace()
,它将删除旧片段并一次又一次地用新片段替换它(onCreateView()
将被第二次调用)。每次旋转都会重复。
如果你用transaction.add(frameId, fragment,UNIQUE_TAG_FOR_EVERY_TRANSACTION)
你就知道原因了。对于每个旋转,no.of onCreateView()
调用将增加 1。这意味着您正在添加片段而不是删除旧片段。
但解决方案是使用旧片段。
在 onCreate()
中 activity
val fragment = fragmentmanager.findFrgmentByTag("tag")
val newFragment : BlankFragment
if(fragment==null){
newFragment = BlankFragment()
}else{
newFragment = fragment as BlankFragment()
}
//use newFragment
希望这能解决困惑
我有简单的 activity 和片段交易。我注意到在配置更改时,Fragment 的 oncreateView 被调用了两次。为什么会这样?
Activity 代码在这里:
@Override
protected void onCreate(Bundle savedInstanceState) {
System.out.println("Activity created");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager manager = getSupportFragmentManager();
BlankFragment fragment = new BlankFragment();
addFragmentToActivity(manager,
fragment,
R.id.root_activity_create
);
}
public static void addFragmentToActivity (FragmentManager fragmentManager,
Fragment fragment,
int frameId)
{
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(frameId, fragment);
transaction.commit();
}
片段代码在这里:
public class BlankFragment extends Fragment {
public BlankFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_blank, container, false);
}
}
Android 旋转后自动恢复其视图状态。您不必在旋转后再次调用 addFragmentToActivity。片段将自动为您还原!
在你的例子中,它发生了两次,因为: 1. Android恢复fragment,其onCreateView被调用 2.你用你自己的片段替换恢复的片段,那个片段的oncreateview也被调用
这样做:
if (savedInstanceState == null)
{
addFragmentToActivity(manager, fragment, R.id.test);
}
首次加载时 onCreateView()
被调用一次
但是 onRotationonCreateView()
被调用了两次
为什么?
因为这个transaction.replace(frameId, fragment);
真的吗?是的,我的意思是因为 fragment
。您在第一次加载时已经有一个片段,当您旋转 onCreate()
时将再次调用,所以现在片段管理器有旧片段,所以它的方法将执行(一次) ,接下来你正在做交易 replace()
,它将删除旧片段并一次又一次地用新片段替换它(onCreateView()
将被第二次调用)。每次旋转都会重复。
如果你用transaction.add(frameId, fragment,UNIQUE_TAG_FOR_EVERY_TRANSACTION)
你就知道原因了。对于每个旋转,no.of onCreateView()
调用将增加 1。这意味着您正在添加片段而不是删除旧片段。
但解决方案是使用旧片段。
在 onCreate()
中 activity
val fragment = fragmentmanager.findFrgmentByTag("tag")
val newFragment : BlankFragment
if(fragment==null){
newFragment = BlankFragment()
}else{
newFragment = fragment as BlankFragment()
}
//use newFragment
希望这能解决困惑