2012-04-01 85 views
1

我想從一個添加的Fragment我的活動得到一個微調視圖視圖,但似乎我無法獲得片段或視圖。查找活動的片段視圖。 Android的findFragmentByTag(字符串標籤)返回null

我有一個Activity將Fragment加到它的LinearLayout,該片段的佈局基於來自Activity意圖的'extra'。一切正常顯示,我可以看到片段的所有視圖,但由於某種原因,當我打電話給findFragmentByTag(String tag)它返回null,因此我無法調用getView()。

這裏是我如何加入片段代碼到我的活動:

...onCreate(){ 
    ... 
    FragmentManager fm = getFragmentManager(); 
    FragmentTransaction ft = fm.beginTransaction(); 

    Fragment fr = new Fragment(){ 
     @Override 
     public View onCreateView(LayoutInflater inflater, 
       ViewGroup container, Bundle savedInstanceState) { 
      return inflater.inflate(layoutID, container, false); 
     } 
    }; 
    ft.add(R.id.formsListActivity_Container, fr, "form_fragment_tag"); 

    ft.commit(); 
    ... 

}

然後我試圖讓這樣的片段,並得到了微調以添加字符串數組:

Fragment f = fm.findFragmentByTag("form_fragment_tag"); 
Spinner spinner = (Spinner) f.getView().findViewById(R.id.city_spinner); 
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, 
     R.array.city_list, android.R.layout.simple_spinner_item); 
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
spinner.setAdapter(adapter); 

但我得到一個空例外,因爲findFragmentByTag()返回null

我做錯了什麼?我已經驗證了幾次代碼並且標籤是相同的。 我也確保spinner的id正確地位於XML佈局文件中,並且片段正在加載正確的XML佈局,因爲我可以看到它(如果註釋從片段部分獲取視圖)。

+0

我知道這篇文章已經過時了,但是如果你將'Fragment'放在自己的類中,事情就會簡單得多。 – JDJ 2014-06-11 20:45:31

回答

7

我已經解決了這個問題,似乎基於活動和由findFragmentById()是在OnCreate()執行的片段一直沒有時間片段兩者的生命週期「實際創建',我通過在佈局中添加一個簡單的按鈕並製作一種方法來測試它,當點擊按鈕時,微調器將被填充數據。

但我當然不希望用戶點擊「加載」按鈕來填充微調框,而是在我的片段上實現了public void onActivityCreated()方法。

僅供參考,這裏是我的片段代碼:

Fragment fr = new Fragment(){ 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(layoutID, container, false); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     Spinner spinner = (Spinner) this.getView().findViewById(R.id.city_spinner); 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(context, R.array.city_list, android.R.layout.simple_spinner_item); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     spinner.setAdapter(adapter); 
    } 

}; 
+0

恭喜修復!如果可以,請確保將答案標記爲「已接受」,以便其他人可以從您的成功中學習。乾杯〜 – 2012-04-02 15:35:04

+0

鑑於如此多的生命週期方法可用於碎片,爲各種行動選擇正確的時機非常具有挑戰性。onActivityCreated似乎也適用於我 – rmirabelle 2012-10-26 03:18:10

0

嘗試更改falsetrue在您的充氣線。

return inflater.inflate(layoutID, container, true); 
+1

我改變了它,但仍然返回null,我讀了該方法的文檔,最後一個布爾值表示爲:'attachToRoot - 膨脹的層次結構是否應該附加到根參數?如果爲false,則root僅用於爲XML中的根視圖創建LayoutParams的正確子類。「我真的不明白它的含義。 – DanyBoricua 2012-04-01 23:27:41

+0

我猜你的容器是空的,所以片段永遠不會被添加。 – 2012-04-02 01:44:22

+0

感謝您的幫助,我能夠解決問題。 – DanyBoricua 2012-04-02 03:09:21

2

我有我通過調用

protected void onStart() 
{ 
} 

生命週期方法的findFragmentByTag()解決它同樣的問題。