是否可以在片段中手动调用 onCreateView?

Posted

技术标签:

【中文标题】是否可以在片段中手动调用 onCreateView?【英文标题】:Is it possible to manually call onCreateView in a Fragment? 【发布时间】:2013-06-16 22:49:34 【问题描述】:

是否可以在Fragment 中手动调用方法onCreateView,或者,如果不能,有什么方法可以模拟这个调用?

我有一个FragmentActivity 和 tabHost。每个选项卡都包含一个Fragment,当我按下“刷新”按钮时,我想刷新Fragment 的视图。更具体地说,我想重新调用onCreateView 方法。

我的代码目前看起来像:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) 
// Inflate the layout for this fragment
    view= inflater.inflate(R.layout.fragment_hall, container, false);

    layoutExsternal = (RelativeLayout) view.findViewById(R.id.layoutExsternal);
    layoutHall = (RelativeLayout) view.findViewById(R.id.layoutHall);

    init();

    return view;
 

  [...]

@Override
public boolean onOptionsItemSelected(MenuItem item) 
      // TODO Auto-generated method stub
     Log.d("itemSelected1", this.getClass().getSimpleName());

     switch (item.getItemId()) 
        case R.id.menu_refresh:

            //HERE I want to insert a method for refresh o redraw

     return true;
     

return super.onOptionsItemSelected(item);


【问题讨论】:

更好的方法是重构您的 onCreateView。首先找到您的布局视图并将它们分配给字段,然后调用填充它们的委托方法。然后让您的刷新操作调用委托。你的 init() 方法似乎已经有了这个。不能刷新就这么叫吗? 我发现这种方法很有用***.com/a/41888950/3496570 【参考方案1】:

有时我发现 FragmentTransaction 的替换不能用它自己替换一个片段,对我有用的是使用分离和附加:

getSupportFragmentManager()
    .beginTransaction()
    .detach(fragment)
    .attach(fragment)
    .commit();

删除和分离的区别见this question

【讨论】:

我在onActivityResult(从影响布局的选项可能已更改的设置返回)中使用了它,我需要commitAllowingStateLoss,因为“当您的活动时,您将在onResume() 之前立即收到此电话正在重新开始。”。调用 commit 会导致“在 onSaveInstanceState 之后无法执行此操作”。 片段状态仍然保留! 使用 .commitAllowingStateLoss() 代替!【参考方案2】:

我已经解决了我的问题。我用自己替换当前片段,但在我保存当前片段的引用之前,我关闭当前片段调用 onDestroy() 的生命周期。我记得它是“newFragment”变量。

switch (item.getItemId()) case R.id.menu_refresh: //THIS IS THE CODE TO REFRESH THE FRAGMENT. FragmentManager manager = getActivity().getSupportFragmentManager(); FragmentTransaction ft = manager.beginTransaction(); Fragment newFragment = this; this.onDestroy(); ft.remove(this); ft.replace(container.getId(),newFragment); //container is the ViewGroup of current fragment ft.addToBackStack(null); ft.commit(); return true;

【讨论】:

手动调用生命周期方法永远不是正确的解决方案。你也不需要newFragment 变量;你可以再次使用this 正如@Karu 所说,手动调用生命周期方法不是一个好方法。【参考方案3】:

您可以让替换按钮用片段的新实例替换当前布局。

// onButtonClick
SomeFragment fragment = new SomeFragment();
getFragmentManager().beginTransaction().replace(R.id.current_layout, fragment).commit();

【讨论】:

不是没有commit吗?

以上是关于是否可以在片段中手动调用 onCreateView?的主要内容,如果未能解决你的问题,请参考以下文章

替换未调用 onAttach、onCreate、onCreateView 等的活动中的片段

调用 onCreateView() 之前出现“找不到片段 id 的视图”错误

onCreateView()没有第二次调用

完成 onCreate 中的活动时,如何在 onCreate 之前调用我的片段的 onCreateView?

Android选项卡片段不调用OnCreateView从tab2切换到tab1

popBackStack导致一次又一次调用片段的oncreateView