我有两个名为ssh -L 8002:localhost:8002 myusername@staging.example.com
和SessionTab
的片段类,我正在尝试使用
BillingTab
但有时这些类的索引会被反转,然后导致SessionTab sessionTab = (SessionTab) getSupportFragmentManager().getFragments().get(1);
如何通过传递类名而不是索引来获取这些片段类的实例,或者以任何方式确保这些类的索引每次都保持不变,因此它不会导致ClassCastException
答案 0 :(得分:6)
使用以下方法之一:findFragmentById()
和findFragmentByTag()
方法。
参考:https://developer.android.com/reference/android/app/FragmentManager.html#findFragmentById(int)
更新:
如果未将适当的类转换为彼此,则会调用 ClassCastException
。在您的情况下,您的FragmentManager
返回的片段不同于SessionTab
,因此会抛出异常。
如果您使用findFragmentById()
或findFragmentByTag()
,那么它将完全返回您想要的片段,并且不会抛出异常。
答案 1 :(得分:5)
定义'标记'对于片段,同时添加它像
getFragmentManager().beginTransaction().add(new Fragment(),"your_tag");
在引用它时使用
getFragmentManager().findFragmentByTag("your_tag");
在大多数情况下,您希望使用YourFragment.class.getSimpleName()
作为标记。
答案 2 :(得分:2)
首先,如果您应该了解任何Fragment的实例,您可以从Java class api中获取。如下所示:
Class<?> class = Class.forName("example.package.BillingFragment");
Constructor<?> cons = class.getConstructor(BillingFragment.class);
BillingFragment object = (BillingFragment) cons.newInstance();
代码示例show,如何从Java中的任何类获取实例。但是你在谈论其他一些事情。如果我理解正确,你想从FragmentManager获得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();
}
....
欢迎!