为什么在Android中设备轮换后,Fragment中的onCreateView被调用两次?

时间:2018-02-15 11:31:18

标签: android rotation 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();
    }

片段代码:

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

}

2 个答案:

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