onCreateView
内のメソッドFragment
を手動で呼び出すことは可能ですか?そうでない場合、この呼び出しをシミュレートする方法はありますか?
TabHostにはFragmentActivity
があります。各タブには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);
}
質問を解決しました。現在のフラグメントをそれ自体で置き換えますが、現在のフラグメントの参照を保存する前に、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;
}
FragmentTransactionのreplaceがフラグメントをそれ自体で置き換えると機能しないことが時々ありました。デタッチとアタッチを使用すると効果的です。
getSupportFragmentManager()
.beginTransaction()
.detach(fragment)
.attach(fragment)
.commit();
Removeとdetachの違いについては この質問 をご覧ください
置換ボタンを使用して、現在のレイアウトをフラグメントの新しいインスタンスに置き換えることができます。
// onButtonClick
SomeFragment fragment = new SomeFragment();
getFragmentManager().beginTransaction().replace(R.id.current_layout, fragment).commit();