我有简单的活动和片段交易。我注意到,在配置更改时,片段的oncreateView被调用两次。为什么会这样?
活动代码:
@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);
}
}
答案 0 :(得分:5)
首次加载onCreateView()
时会调用
但onRotation onCreateView()
被调用两次
为什么?
因为这个transaction.replace(frameId, fragment);
真的吗?是的,我的意思是因为fragment
。你已经在第一次加载时有一个片段,当你再次调用onCreate()
时,所以现在片段管理器有旧的片段,所以它的方法将执行(一次) ,接下来你正在进行事务replace()
,这将删除旧的片段并一次又一次地替换它(onCreateView()
将被第二次调用)。每次轮换都会重复这一过程。
如果您使用transaction.add(frameId, fragment,UNIQUE_TAG_FOR_EVERY_TRANSACTION)
,您就会知道原因。对于每次旋转,onCreateView()
次呼叫将增加1.这意味着您正在添加片段而不删除旧片段。
但解决方案是使用旧片段。
在onCreate()
活动中
val fragment = fragmentmanager.findFrgmentByTag("tag")
val newFragment : BlankFragment
if(fragment==null){
newFragment = BlankFragment()
}else{
newFragment = fragment as BlankFragment()
}
//use newFragment
希望这能解决困惑
答案 1 :(得分:2)
Android会在轮换后自动恢复其视图状态。您不必在轮换后再次调用addFragmentToActivity。片段将自动为您恢复!
在你的情况下,它发生两次,因为: 1. Android恢复片段,调用其onCreateView 2.用自己的片段替换已恢复的片段,也调用该片段的oncreateview
这样做:
if (savedInstanceState == null)
{
addFragmentToActivity(manager, fragment, R.id.test);
}