繁体   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