[英]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.