Можно ли вручную вызвать onCreateView в фрагменте?
Можно ли вручную вызвать метод onCreateView
в Fragment
или, если нет, можно ли каким-то образом смоделировать этот вызов?
У меня есть 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);
}
Ответы
Ответ 1
Я решил свой вопрос. Я заменяю текущий фрагмент на себя, но до того, как я сохранил ссылку текущего фрагмента, а затем я закрою жизненный цикл текущего фрагмента, вызывающего 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;
}
Ответ 2
Иногда я обнаружил, что FragmentTransaction replace не будет работать для замены фрагмента на себя, что работает для меня, используя detach и attach:
getSupportFragmentManager()
.beginTransaction()
.detach(fragment)
.attach(fragment)
.commit();
См. этот вопрос для разницы между удалением и отсоединением
Ответ 3
Вы можете просто заменить кнопку замены на текущий макет новым экземпляром фрагмента.
// onButtonClick
SomeFragment fragment = new SomeFragment();
getFragmentManager().beginTransaction().replace(R.id.current_layout, fragment).commit();