2012-02-20 68 views

回答

100

您無法以編程方式設置片段ID

然而,你可以在FragmentTransaction中設置一個String tag,它可以用來唯一標識一個Fragment。

正如Aleksey指出的,您可以將ID傳遞給FragmentTransactionadd(int, Fragment)方法。但是,這沒有指定片段的ID。它指定將Fragment插入的ViewGroup的ID。這對於我期望的目的沒有用處,因爲它並不唯一確定Fragment s,而是ViewGroup s。這些ID是容器那一個或更多片段可以動態添加。使用這種方法來識別Fragment將需要您動態地將ViewGroup s添加到您插入的每個Fragment的佈局中。這將是非常麻煩的。

所以,如果你的問題是如何爲你動態添加片段的唯一標識符,答案是使用FragmentTransactionadd(int containerViewId, Fragment fragment, String tag)方法和FragmentManagerfindFragmentByTag(String)方法。

在我的一個應用程序中,我被迫動態地生成字符串。但無論如何,它與實際的FragmentTransaction相比並不算昂貴。

標記方法的另一個優點是它可以識別未添加到UI中的片段。請參閱FragmentTransaction的add(Fragment, String)方法。 Fragment s不需要有View s!它們也可以用來在配置更改之間保持短暫狀態!

+0

如果我使用的標籤,而不是ID的片段,會怎樣我使用需要一個片段資源ID的替換調用? – Namratha 2013-01-22 09:32:39

+0

@Namratha,你不能。 – 2013-01-22 10:22:41

+9

@TomDignan如何在ViewPager中添加一個片段?我怎樣才能設置他的標籤?在這種情況下我不能使用交易。 – GuilhE 2015-01-22 17:16:15

3

在大多數情況下,您可以使用片段標籤以及ID。
您可以在FragmentTransaction.add(Fragment fragment, String tag);中設置標籤值。 然後您可以使用命令FragmentManager.findFragmentByTag(String tab)來查找有問題的片段。

2

正如Tom和其他人已經提到的,有一些方法可以在片段上放置標籤並使用該標籤進行識別。我接觸到這些解決方案的後續問題是,片段在與活動(或實際上,FragmentManager)關聯之前不會獲得標籤。如果需要在標記片段之前識別片段,該怎麼辦?

到目前爲止,我的解決方案都依賴於世界上最古老的(Java)技巧:創建一個簡約的模板片段,它在其構造函數之一中提供一個id,並提供返回該id的getFragmentId()方法。然後我讓那些需要儘早識別的片段擴展該模板,瞧!問題解決了。

不幸的是,該解決方案可能需要一組模板片段,每個片段類型一個,需要早期識別的ListFragmentDialogFragment或普通舊Fragment(POFO ?!)。但考慮到提供的收益,我認爲這是可以控制的。

對不起,撕裂傷口癒合:-)

乾杯!

35

原來你可能不需要知道片段ID。

從文檔:

public abstract Fragment findFragmentById (int id) 

Finds a fragment that was identified by the given id either 
when inflated from XML or as the container ID when added in 
a transaction. 

重要的部分是「作爲一個事務添加當容器ID」。

這樣:

getSupportFragmentManager() 
    .beginTransaction() 
    .add(R.id.fragment_holder, new AwesomeFragment()) 
    .commit(); 

然後

AwesomeFragment awesome = (AwesomeFragment) 
    getSupportFragmentManager() 
      .findFragmentById(R.id.fragment_holder); 

將讓你任何(真棒)片段在R.id.fragment_holder舉行。

0

除了Tom的回答,replace方法還支持片段標籤,另外還有add方法。

1

使用以下命令:

要添加一個片段:

getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentToBeAdded, tag).commit(); 

查明現有片段:

getFragmentManager().findFragmentByTag(fragmentName);