2013-06-20 3 views
16

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

} 
+0

Лучшим подходом было бы реорганизовать ваш onCreateView. Сначала найдите представления макета и назначьте их полям, затем вызовите метод делегата, который заполняет их. Затем активируйте действие для делегата. У вас уже есть это с помощью метода init(). Не удается обновить, просто позвоните? – k2col

+0

Я нахожу этот подход полезным http://stackoverflow.com/a/41888950/3496570 – Nepster

ответ

8

Я решил свой вопрос. Я заменяю текущий фрагмент на себя, но до того, как я сохранил ссылку текущего фрагмента, а затем я закрою жизненный цикл текущего фрагмента, вызывающего 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; }

+5

Методы жизненного цикла вручную никогда не будут правильным решением. Также вам не нужна переменная 'newFragment'; вы могли бы просто использовать 'this' еще раз. – Karu

+0

Как говорит @Karu, методы вызова с помощью вызова вручную не являются хорошим подходом. – jwir3

3

Вы можете просто ваша кнопка заменить заменить текущую схему с новым экземпляром фрагмента.

// onButtonClick 
SomeFragment fragment = new SomeFragment(); 
getFragmentManager().beginTransaction().replace(R.id.current_layout, fragment).commit(); 
+7

Не существует ли 'commit'? – TWiStErRob

26

Иногда я нашел FragmentTransaction Заменим не будет работать для замены фрагмента с самим собой, что делает работу для меня с помощью отсоединения и присоединения:

getSupportFragmentManager() 
    .beginTransaction() 
    .detach(fragment) 
    .attach(fragment) 
    .commit(); 

См this question разницу между удалением и отсоединением

+0

Я использовал его в 'onActivityResult' (вернусь из настроек, в которых параметры изменения макета могли быть изменены), где мне понадобилось' commitAllowingStateLoss', потому что «вы получите этот вызов непосредственно перед' onResume() ', когда ваша активность перезапускается. ». Вызов 'commit' вызовет« Невозможно выполнить это действие после onSaveInstanceState ». ** Состояние фрагмента все еще сохранено! ** – TWiStErRob

+0

Используйте .commitAllowingStateLoss() вместо этого! – Flyview

Смежные вопросы