2013-11-01 111 views
3

我用,設置動態佈局onCreateView()片段

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

      MyView myView = new MyView(getActivity()); 
      myView.addViews(getViews()); 
      return myView; 
     } 

我知道public void onActivityCreated (Bundle savedInstanceState){}被調用後onCreateView();

我需要上下文onCreateView()膨脹自定義佈局。我如何在onActivityCreated()之前一直獲得有效的上下文(使用getActivity())?

可能的解決方案:

View view; 
@Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 

       view = inflater.inflate(R.layout.fragment, container, false); //Contains empty RelativeLayout  
       return view; 
      } 


    //Now that we have activity, create custom views and add it to the empty container 
    public void onActivityCreated (Bundle savedInstanceState){ 
     RelativeLayout layout = (RelativeLayout)view.findViewById(R.id.layout); 
     MyView myView = new MyView(getActivity()); 
     layout.add(myView); 
    } 

但這種方法增加了額外的視圖層次。

+0

U可以創建構造函數,需要從上下文的活動 –

+0

我不會建議。順便說一下,所有碎片都需要有空的構造函數。如果你想將對象傳遞給Fragment,你可以使用靜態工廠方法。 –

+0

它不一定會添加額外的視圖層次結構。如果碎片中膨脹的佈局只包含您的自定義視圖,那麼不會有額外的開銷。我會編輯我的答案來澄清。 –

回答

1

這裏是生命週期的調用順序:

  • onAttach()
  • onCreate()
  • onCreateView()
  • onActivityCreated()
  • ...

緊接在onAttach()之後,getActivity()方法返回一個有效的上下文。您可以在onCreateView()方法中安全地使用它。

onAttach()onActivityCreated()之間的區別如下。 onAttach()活動已創建但尚未完全初始化。例如,如果該活動中有幾個片段,則它們尚未初始化。在onActivityCreated()之後,活動被完全初始化並且其所有片段都被創建。此時您可以安全地執行片段間通信。

+1

是的,但有時當我點擊後退按鈕時,getActivity()在onCreate()返回null – dcanh121

+0

這樣做將永遠不可靠。看到我更新的答案。 –

+0

@ dcanh121看看谷歌官方的例子(搜索TitlesFragment)。他們在onActivityCreated()中調用getActivity(),這是絕對可靠的。完全是http://beveloper.android.com/reference/android/app/Fragment.html –

4

您可以使用與LayoutInflater相關的Context對象:

MyView myView = new MyView(inflater.getContext()); 
+2

爲什麼downvote? – Vaiden