android - 为什么在 Android 中设备旋转后调用 Fragment 中的 onCreateView 两次?

标签 android rotation fragment

我有简单的 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/

相关文章:

android - Admob 编译错误 : more than one library with package name 'com.google.android.gms'

java - 多平台Base64编解码问题(Android to PC)

android - 抽屉导航与 android 中的 fragment 重叠

android - fragment 中的MapFragment,替代品?

Android Gradle 编译项目的特定风格

android - 在 Eclipse 中,是否有可能在代码中设置依赖于导出与运行/调试操作的设置?

iphone - 自动旋转会扭曲 iPhone 中的旋转 View

android - 为什么在使用 ROTATION_VECTOR 传感器之前克隆 Android 传感器值?

java - Android使一个元素只出现在纵向 View 中

android - 如何在 Android 中为整个 fragment 绑定(bind)输入更改事件?