是否可以在片段中手动调用 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 的视图”错误
完成 onCreate 中的活动时,如何在 onCreate 之前调用我的片段的 onCreateView?