[英]How to instantiate fragment class using class name instead of index
我有兩個名為SessionTab
和BillingTab
片段類,我正在嘗試使用這些類創建實例
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.