2017-07-25 47 views
0

我用下面的代碼添加了一個活動中的一個片段參考:如何獲得由FragmentTransaction.replace方法創建的片段

FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); 
ft.replace(R.id.parent_fragment_container, new FolderStructureFragment()); 
ft.commit(); 

我的問題是如何獲得增加的片段的引用。我搜索了很多關於fragment和FragmentTransaction的關鍵詞,但沒有發現任何接近我的要求的東西,我認爲這是一個非常基本的功能,應該提供給我們。任何幫助深表感謝!

+0

可能的複製[獲取當前片段對象](https://stackoverflow.com/questions/6750069/get-the-current-fragment-object) –

回答

2

有兩大possiblities:

  • 您可以通過ID記得自己
  • 參考由標籤
  • 通過ID

例如(幾乎是相同的):

ft.replace(R.id.fragment_container, fragment, tagOfFragment); 
getSupportFragmentManager().findFragmentByTag(tagOfFragment); 
+0

這對我不起作用。這可能是因爲我在另一個片段中創建和操作片段,而不是一個活動。 – user1870797

+0

無論你在哪裏創建它,你都應該能夠找到可能性2和3的片段。只需從SupportFragmentManager調用findFragmentByTag即可。 – MPhil

+0

我總是通過調用getSupportFragmentManager()函數返回null。findFragmentByTag(tagOfFragment)或findFragmentByID(IDOfFragment);我甚至嘗試過getChildFragmentManager,但仍然沒有什麼不同。 – user1870797

0
FolderStructureFragment folderStructureFragment = new FolderStructureFragment(); 
    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.parent_fragment_container, folderStructureFragment); 
    ft.commit(); 

這裏,folderStructureFragment是新添加片段的參考。

+0

在我的情況下,folderStructureFragment沒有使用活動資源進行初始化。它只是一個簡單的新班,而不是其父母活動的一部分。 – user1870797

+0

好吧,如果它是一個類,它可以通過這種方式進行初始化,然後可以在當前活動的任何地方使用'folderStructureFragment'作爲對'FolderStructureFragment'類的引用。試一下。 –

+1

這聽起來有可能解決。但我發現我現在可以通過調用findFragmentByID來獲取片段。我可以在onClick事件中做到這一點。所以我猜我之前失敗的原因是需要一點時間在父ViewGroup中創建並插入片段,因此在FragmentTransaction.commit之後立即調用findFragmentByID無法找到任何內容。 – user1870797

1

嘗試使用下面的代碼。

FolderStructureFragment folderStructureFragment = (FolderStructureFragment)getActivity().getSupportFragmentManager().findFragmentById(R.id.parent_fragment_container); 
+0

它不適合我。 – user1870797

+1

嘗試使用'getChildFragmentManager()'添加或替換片段而不是'getActivity()。getSupportFragmentManager()' – codeWorm

+0

我試過了。它仍然是一樣的。 – user1870797

0

有一種簡單的方法可以在任何需要的時候獲取對片段的引用,也就是使用TAG。每當你添加一個片段時,你可以給它一個特定的標籤,並且你可以隨時用相同的TAG檢索它。

這是你如何添加它:在您需要的參考這個片段代碼

FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
MyFragment myFragment = new MyFragment(); 
fragmentTransaction.add(R.id.fragment_container, myFragment,"myFragmentTag").commit(); 

現在讓我們假設,某個地方,你只需要調用下面

MyFragment myFragment = (MyFragment)getSupportFragmentManager().findFragmentByTag("myFragmentTag"); 
if(myFragment != null && myFragment.isAdded()){ //you should always do this check when you retrieve fragment instances 
    //do whatever you need with it 
} 
+0

對我來說不是運氣。可能是我在另一個片段內創建並操作片段,但是是一個活動。 – user1870797

+0

如果您從活動中調用片段管理器,那麼這沒什麼區別,即:getActivity()。getSupportFragmentManager()' – Ricardo

+0

這聽起來有可能解決。但我發現我現在可以通過調用findFragmentByID來獲取片段。我可以在onClick事件中做到這一點。所以我猜我之前失敗的原因是需要一點時間在父ViewGroup中創建並插入片段,因此在FragmentTransaction.commit之後立即調用findFragmentByID無法找到任何內容。 – user1870797

相關問題