2013-06-20 67 views
16

是否有可能手動調用Fragment中的方法onCreateView,或者如果沒有,有什麼辦法可以模擬此調用?是否可以在片段中手動調用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

正如@卡魯所說,手動調用生命週期方法並不是一個好方法。 – 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'中使用它(從佈局影響選項可能已更改的設置返回),因爲「您將在onResume()'之前立即接收到此調用,因爲您的活動重新啓動時需要'commitAllowingStateLoss'。 」。調用'commit'會導致「onSaveInstanceState後無法執行此操作」。 **片段狀態仍然保留!** – TWiStErRob

+0

請改用.commitAllowingStateLoss()! – Flyview

相關問題