簡體   English   中英

如何使用類名而不是索引來實例化片段類

[英]How to instantiate fragment class using class name instead of index

我有兩個名為SessionTabBillingTab片段類,我正在嘗試使用這些類創建實例

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

但有時這些類的索引會被反轉,然后它會導致ClassCastException

如何通過傳遞類名而不是索引來獲取這些片段類的實例,或者以任何方式確保這些類的索引每次都保持不變,因此它不會導致ClassCastException

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

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

更新:

如果未將適當的類轉換為彼此,則會調用ClassCastException 在您的情況下,您的FragmentManager返回與SessionTab不同的片段,因此拋出異常。

如果你使用findFragmentById()findFragmentByTag() ,那么它將完全返回你想要的片段,並且不會拋出異常。

為片段定義'標簽',同時添加它

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

雖然引用它使用

getFragmentManager().findFragmentByTag("your_tag");

在大多數情況下,您希望使用YourFragment.class.getSimpleName()作為標記。

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

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();
}

......

因此,在此之后,您可以檢查堆棧中是否存在Fragment並掛鈎此活動實例。 這是使用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();
}

....

歡迎!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM