为什么在 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

希望这能解决困惑