Можно ли вручную вызвать onCreateView в фрагменте? - программирование
Подтвердить что ты не робот

Можно ли вручную вызвать 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);

}
4b9b3361

Ответ 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();