Android 可以在片段中手动调用onCreateView吗?
是否可以在Android 可以在片段中手动调用onCreateView吗?,android,fragment,android-view,fragment-tab-host,Android,Fragment,Android View,Fragment Tab Host,是否可以在片段中手动调用方法onCreateView,或者,如果不可以,是否有某种方法可以模拟此调用 我与tabHost有一个FragmentActivity。每个选项卡都包含一个片段,我想在按下“刷新”按钮时刷新片段的视图。更具体地说,我想重新调用onCreateView方法 我的代码当前看起来像: @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstan
片段中手动调用方法onCreateView
,或者,如果不可以,是否有某种方法可以模拟此调用
我与tabHost有一个FragmentActivity
。每个选项卡都包含一个片段
,我想在按下“刷新”按钮时刷新片段的视图。更具体地说,我想重新调用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);
}
您可以让您的替换按钮用片段的新实例替换当前布局
// onButtonClick
SomeFragment fragment = new SomeFragment();
getFragmentManager().beginTransaction().replace(R.id.current_layout, fragment).commit();
我已经解决了我的问题。我将当前片段替换为自身,但在保存当前片段的引用之前,我关闭了当前片段调用onDestroy()的生命周期。我用“newFragment”变量来回忆它
有时我发现FragmentTransaction的replace不适用于用自身替换片段,对我有效的方法是使用detach和attach:
getSupportFragmentManager()
.beginTransaction()
.detach(fragment)
.attach(fragment)
.commit();
有关删除和分离之间的区别,请参见。手动调用生命周期方法从来都不是正确的解决方案。您也不需要newFragment
变量;您可以再次使用这个
。正如@Karu所说,手动调用生命周期方法不是一个好方法。是否缺少一个提交
?我在onActivityResult
中使用了它(从布局影响选项可能已更改的设置中返回),因为“当您的活动重新启动时,您将在onResume()
之前立即收到此调用。”。调用commit
将导致“onSaveInstanceState之后无法执行此操作”。片段状态仍然保留!请使用.commitAllowingStateLoss()相反!更好的方法是重构onCreateView。首先找到布局视图并将它们分配给字段,然后调用一个填充它们的委托方法。然后让刷新操作调用委托。你的init()方法似乎已经有了这个。刷新不能只调用它吗?我觉得这个方法很有用
getSupportFragmentManager()
.beginTransaction()
.detach(fragment)
.attach(fragment)
.commit();