android - 重新加载 fragment 时多次调用 fragment onCreate

标签 android android-listview android-fragments android-fragmentactivity android-listfragment

下面是我的代码:

public class MyListFragmentActivity extends FragmentActivity{

@Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    System.out.println("DEBUG : MLFA onCreate");
    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction().replace(fragmentID, new MyListFragment())
            .replace(detailFragmentID, new MyDetailFragment()).commit();
        }
    }



     @Override
    protected void onRestart() {
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            Fragment prevFrag = getSupportFragmentManager().findFragmentById(detailFragmentID);
    if (prevFrag != null) {
        fragmentTransaction.remove(prevFrag);
        getSupportFragmentManager().beginTransaction().replace(detailFragmentID, new MyDetailFragment()).commitAllowingStateLoss();
    } else {
        getSupportFragmentManager().beginTransaction().replace(detailFragmentID, new MyDetailFragment()).commitAllowingStateLoss();
    }
}

MyListFragment

public class MyListFragment extends Fragment{

//When we click on each item in list view call detail fragment to relad its layout
OnItemClickListener onItemClickListener = new OnItemClickListener() {

/** Getting the fragmenttransaction object, which can be used to add, remove or replace a fragment */
        FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
        /** Getting the existing detailed fragment object, if it already exists.
        *  The fragment object is retrieved by its tag name
        * */
        Fragment prevFrag = getFragmentManager().findFragmentById(detailFragmentID);

        /** Remove the existing detailed fragment object if it exists */
        if (prevFrag != null) {
            fragmentTransaction.remove(prevFrag);
           MyDetailFragment mydetailFragment = new MyDetailFragment();
            fragmentTransaction.replace(detailFragmentID, mydetailFragment);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.show(getFragmentManager().findFragmentById(detailFragmentID));
            fragmentTransaction.commit();
        }
}

MyDetailFragment

public class MyDetailFragment extends Fragment{

onCreate() // on create being called multiple times ? why ?????????????

onCreateView()

}

当我点击我的列表项时,MyDetailFragment onCreate() 只被调用一次,但是当我将设备倾斜到纵向或横向时,MyDetailFragment onCreate() 被调用多次?

为什么会这样?我在这里做错了什么以及如何解决这个问题?

最佳答案

每次更改方向时,都与重新启动应用程序一样好。您需要适本地处理更改,例如释放资源、再次获取它们、停止您正在做的任何工作并恢复它们等等。

你没有做错任何事。

关于android - 重新加载 fragment 时多次调用 fragment onCreate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21424046/

相关文章:

android - 推送后在 Github 上保护 API key

android - 如何在 ListView 的按下状态下使用带有渐变的可绘制对象?

java - 如何循环遍历 ListView 并从每行的 TextView 中获取文本

android - 在 Fragment 构造函数中访问资源

Android View Pager Adapter显示空白屏幕

java - 如何从 viewpageradpater 更新 fragment "continuously"的 TextView ?viewpager 适配器在主要 fragment 中

安卓 : LocationManager dynamically adjust minTime/minDistance thresholds

android - 我可以在保留私钥的同时更改 Android 签名证书主题吗

android - FLAG_ACTIVITY_NEW_TASK 和 FLAG_ACTIVITY_CLEAR_TASK 行为怪异

android - 为每个 ListView 行而不是 onItemClickListener 实现 onClickListener 是否有缺点?