2012-06-05 143 views
86

我在Android Fragments Dev Guide中看到,「活動可以通過使用findFragmentById()findFragmentByTag()獲取對來自FragmentManager的片段的引用來調用片段中的方法。」從父活動調用片段方法

下面的示例顯示如何獲取片段引用,但不知道如何調用片段中的特定方法。

任何人都可以舉例說明如何做到這一點?我想從父活動的Fragment中調用特定的方法。謝謝。

回答

159

不了的問題,正是因爲它太簡單了:如果您使用的是支持庫

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.<specific_function_name>(); 
+9

好吧,這很容易,謝謝(我是碎片新品)。現在最難的部分是我似乎無法首先獲得對片段的引用。它沒有在XML佈局中定義,所以我不能使用findFragmentById()。從我遵循的代碼(參見上文)中我不清楚該片斷甚至創建的方式/位置。如果是我可以只添加一個標籤並使用findFragmentByTag()。該示例的AccountListActivity部分確實有對beginTransaction()。add()的調用,但根據我的跟蹤,它從未被調用過。這是我撓頭的地方。我很欣賞任何建議。 – gcl1

+0

對不起,我遺漏了參考。我所遵循的代碼模式是[FragmentTabsPager](http://developer.android.com/resources/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabsPager.html)。謝謝。 – gcl1

+0

當你既沒有ID也沒有與片段相關的TAG時,情況將會不同。 –

8

,你會想要做這樣的事情:

FragmentManager manager = getSupportFragmentManager(); 
Fragment fragment = manager.findFragmentById(R.id.my_fragment); 
fragment.myMethod(); 
66

如果您使用「進口android.app.Fragment;」 然後使用:

1)

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.specific_function_name(); 

其中R.id.example_fragment最有可能是xml佈局中的FrameLayout id。 OR

2)

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentByTag(「FragTagName」); 
fragment.specific_function_name(); 

哪裏FragTagName是當ü沒有ü指定的名稱:

TabHost mTabHost.newTabSpec(「FragTagName」) 

如果您正在使用「導入android.support.v4.app。片段;「 然後使用:

1)

ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.specific_function_name(); 

OR

2)

ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentByTag(「FragTagName」); 
fragment.specific_function_name(); 
+1

我有一個ID爲R.id.example_fragment的CoordinatorLayout,它的返回值爲null。我正在使用導入android.support.v4.app.Fragment;該怎麼辦? – Kishore

+0

我建議你發佈這個作爲一個新的問題,幷包括你的示例代碼。沒有看到實際的代碼很難說出問題的根源。 – Gene

3
  1. 如果你不使用一個支持庫片段,然後執行以下操作:

((FragmentName) getFragmentManager().findFragmentById(R.id.fragment_id)).methodName();


2.如果您使用的是支持庫片段,然後執行以下操作:

((FragmentName) getSupportFragmentManager().findFragmentById(R.id.fragment_id)).methodName();

3

我認爲最好是檢查片段在片段調用方法前加入。做這樣的事情來避免null異常。

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); 
if(fragment.isAdded()){ 
    fragment.<specific_function_name>(); 
}