【问题标题】:How to instantiate fragment class using class name instead of index如何使用类名而不是索引来实例化片段类
【发布时间】:2016-09-21 16:33:57
【问题描述】:

我有两个名为 SessionTabBillingTab 的片段类,我正在尝试使用

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

但有时这些类的索引会反转,然后导致ClassCastException

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

【问题讨论】:

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

标签: java android android-fragments


【解决方案1】:

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

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

更新:

ClassCastException 在您没有将适当的类相互转换时调用。在您的情况下,您的FragmentManager 返回的片段与SessionTab 不同,因此会引发异常。

如果您使用 findFragmentById()findFragmentByTag() ,那么它将完全返回您想要的片段,并且不会抛出异常。

【讨论】:

    【解决方案2】:

    在添加片段时为片段定义一个“标签”

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

    在引用它时使用

    getFragmentManager().findFragmentByTag("your_tag");
    

    在大多数情况下,您希望使用YourFragment.class.getSimpleName() 作为您的标签。

    【讨论】:

    • 我不确定如何实现它。我无法使用这个实例化我的类
    • 我认为这是最好和最干净的方式。 @AkashKumar 你被困在哪里了?
    • @ZorawarSachdev YourFragment.class.getSimpleName() 给片段父活动类名而不是当前片段类名
    【解决方案3】:

    首先,如果您应该了解可以从 Java 类 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。如果堆栈中有 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();
    }
    
    ....
    

    欢迎!

    【讨论】:

    • 为什么不直接做 BillingFragment object = new BillingFragment();
    猜你喜欢
    • 2017-08-18
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 2017-04-03
    • 2011-10-11
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多