2016-09-21 57 views
9

我有兩個片段類命名爲SessionTabBillingTab,我試圖用如何使用類名稱,而不是指數

SessionTab sessionTab = (SessionTab) getSupportFragmentManager().getFragments().get(1); 

但有時指數這些類反轉創建這些類的實例,實例化片段類然後它會導致ClassCastException

我怎樣才能通過傳遞,而不是指數或任何方式,以確保這些類的指數保持不變,每次所以它不會導致類名獲得這些片段類的實例ClassCastException

+0

如果您仍然需要幫助,請發佈其餘的代碼。 –

回答

6

使用以下方法之一:findFragmentById()findFragmentByTag()方法。

參考:https://developer.android.com/reference/android/app/FragmentManager.html#findFragmentById(int)

更新:

ClassCastException當你不投適當的類彼此調用。在你的情況下,你的FragmentManager返回與SessionTab不同的片段,所以拋出異常。

如果您使用findFragmentById()findFragmentByTag(),那麼它會正確返回您想要的片段,並且不會引發異常。

4

定義的片段的「標籤」,而像

getFragmentManager().beginTransaction().add(new Fragment(),"your_tag"); 

加入它,而引用它使用

getFragmentManager().findFragmentByTag("your_tag"); 

在大多數情況下,你想用YourFragment.class.getSimpleName()爲您的標籤。

+0

我不知道如何實現它。我無法使用這個 –

+0

實例化我的課程我認爲這是實現它的最好和最乾淨的方式。 @AkashKumar你在哪裏卡住? – codewing

+0

@ZrawarSachdev YourFragment.class。getSimpleName()'給出片段父級活動類名稱不是當前片段類名稱 –

1

首先,如果您應該理解可以從Java class api獲取的任何Fragment的實例。如下所示:

Class<?> class = Class.forName("example.package.BillingFragment"); 
Constructor<?> cons = class.getConstructor(BillingFragment.class); 
BillingFragment object = (BillingFragment) cons.newInstance(); 

代碼示例顯示,如何從Java中的任何類中獲取實例。但是你在談論其他一些事情。如果我理解正確,你想從FragmentManager中獲得Fragment。

你可以做到這一點,萬一你已經在之前定義過Fragment!例如,你有基本的應用程序流程,然後你想添加Fragment。如果堆棧中有碎片,你可以檢查FragmentManager。但在空棧的情況下,你應該手動添加:

String billingFragmentTag = BillingFragment.class.getSimpleName(); 

...... 

if (getFragmentManager.findFragmentByTag(billingFragmentTag) == null) { 
    BillingFragment fragment = new BillingFragment(); 
    String billingFragmentTag = BillingFragment.class.getSimpleName(); 

    FragmentTransaction fragTrans = getFragmentManager().beginTransaction(); 
      fragTrans.add(fragment, billingFragmentTag).commit(); 
} 

...... 

所以在此之後,您可以檢查是否有您的堆棧片段和掛鉤這一活動的實例。這是使用Fragments的正確和標準流程。

...... 

if (getFragmentManager.findFragmentByTag(billingFragmentTag) != null) { 
    BillingFragment fragment = getFragmentManager.findFragmentByTag(billingFragmentTag); 
    String billingFragmentTag = BillingFragment.class.getSimpleName(); 

    FragmentTransaction fragTrans = getFragmentManager().beginTransaction(); 
      fragTrans.add(fragment, billingFragmentTag).commit(); 
} 

.... 

歡迎!

+0

爲什麼不只是做 BillingFragment object = new BillingFragment(); – codewing

相關問題