为什么Android中的设备旋转后,Fragment中的onCreateView被调用两次?

Nik*_*zic 2 android rotation fragment

我有简单的活动和片段交易。我注意到在Fragment的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();
    }
Run Code Online (Sandbox Code Playgroud)

片段代码在这里:

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

}
Run Code Online (Sandbox Code Playgroud)

Den*_*sVA 6

旋转后,Android 会自动恢复其视图的状态。您不必在旋转后再次调用 addFragmentToActivity。片段将自动为您恢复!

在您的情况下,它发生两次,因为: 1. Android 恢复片段,其 onCreateView 被称为 2. 您用自己的片段替换恢复的片段,该片段的 oncreateview 也被调用

做这个:

if (savedInstanceState == null)
{
     addFragmentToActivity(manager, fragment, R.id.test);
}
Run Code Online (Sandbox Code Playgroud)


Bal*_*gem 6

首次加载时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
Run Code Online (Sandbox Code Playgroud)

希望这能解决混乱