如何使用类名而不是索引来实例化片段类

时间:2016-09-21 16:33:57

标签: java android android-fragments

我有两个名为ssh -L 8002:localhost:8002 myusername@staging.example.comSessionTab的片段类,我正在尝试使用

创建这些类的实例
BillingTab

但有时这些类的索引会被反转,然后导致SessionTab sessionTab = (SessionTab) getSupportFragmentManager().getFragments().get(1);

如何通过传递类名而不是索引来获取这些片段类的实例,或者以任何方式确保这些类的索引每次都保持不变,因此它不会导致ClassCastException

3 个答案:

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

....

欢迎!