2016-09-21 19 views
9

我有两个片段类命名为SessionTabBillingTab,我试图用如何使用类名称,而不是指数

SessionTab sessionTab = (SessionTab) getSupportFragmentManager().getFragments().get(1); 

但有时指数这些类反转创建这些类的实例,实例化片段类然后它会导致ClassCastException

我怎样才能通过传递,而不是指数或任何方式,以确保这些类的指数保持不变,每次所以它不会导致类名获得这些片段类的实例ClassCastException

+0

如果您仍然需要帮助,请发布其余的代码。 –

回答

6

使用以下方法之一:findFragmentById()findFragmentByTag()方法。

参考:https://developer.android.com/reference/android/app/FragmentManager.html#findFragmentById(int)

更新:

ClassCastException当你不投适当的类彼此调用。在你的情况下,你的FragmentManager返回与SessionTab不同的片段,所以抛出异常。

如果您使用findFragmentById()findFragmentByTag(),那么它会正确返回您想要的片段,并且不会引发异常。

4

定义的片段的“标签”,而像

getFragmentManager().beginTransaction().add(new Fragment(),"your_tag"); 

加入它,而引用它使用

getFragmentManager().findFragmentByTag("your_tag"); 

在大多数情况下,你想用YourFragment.class.getSimpleName()为您的标签。

+0

我不知道如何实现它。我无法使用这个 –

+0

实例化我的课程我认为这是实现它的最好和最干净的方式。 @AkashKumar你在哪里卡住? – codewing

+0

@ZrawarSachdev YourFragment.class。getSimpleName()'给出片段父级活动类名称不是当前片段类名称 –

1

首先,如果您应该理解可以从Java class api获取的任何Fragment的实例。如下所示:

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

...... 

所以在此之后,您可以检查是否有您的堆栈片段和挂钩这一活动的实例。这是使用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(); 
} 

.... 

欢迎!

+0

为什么不只是做 BillingFragment object = new BillingFragment(); – codewing

相关问题