我有简单的 Activity 和 fragment 交易。我注意到在配置更改时,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();
}
fragment 代码在这里:
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);
}
}
最佳答案
在第一次加载时调用一次 onCreateView()
但是 onRotation onCreateView()
被调用了两次
为什么?
因为这个 transaction.replace(frameId, fragment);
真的吗?是的,我的意思是因为 fragment
。你已经有一个 fragment onFirst 加载,当你旋转时 onCreate()
将再次被调用,所以现在 fragment 管理器有旧 fragment ,所以它的方法将执行(一次),接下来你正在做事务 replace()
这将删除旧 fragment 并一次又一次用新 fragment 替换它(onCreateView()
将被第二次调用)。每次旋转都会重复这一过程。
如果您使用 transaction.add(frameId, fragment,UNIQUE_TAG_FOR_EVERY_TRANSACTION)
,您就会知道原因。对于每次轮换,onCreateView()
调用次数将增加 1。这意味着您正在添加 fragment 而不是删除旧 fragment 。
但解决方案是使用旧 fragment 。
在 Activity 的onCreate()
中
val fragment = fragmentmanager.findFrgmentByTag("tag")
val newFragment : BlankFragment
if(fragment==null){
newFragment = BlankFragment()
}else{
newFragment = fragment as BlankFragment()
}
//use newFragment
希望这能解决困惑
关于android - 为什么在 Android 中设备旋转后调用 Fragment 中的 onCreateView 两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48806201/