【问题标题】:Pass fragment as parameter?将片段作为参数传递?
【发布时间】:2015-01-02 12:56:36
【问题描述】:

我有一个简单的方法,我想将片段名称作为参数传递。 我有几个片段像

1) 添加新日期片段

2) AskFragment

3) 免责声明片段

我有下面的代码可以正常工作

FragmentManager fragmentManager = activity.getSupportFragmentManager();
    for (int entry = 0; entry < fragmentManager.getBackStackEntryCount();     entry++) {
    Fragment fragment = (Fragment)    fragmentManager.getBackStackEntryAt(entry);
        if (fragment instanceof AddNewDatesFragment) {
            Log.i("TAG", " Expected Fragment Found");
        }
    }

我想在方法中编写一些代码,我可以调用这样的方法

        isExistFragment(AddNewDatesFragment);
        isExistFragment(AskFragment);
        isExistFragment(DisclaimerFragment);

等等……

我尝试过这样的代码,但在 if 条件下不工作会导致编译时错误。

    private boolean isExistFragment(Class<Fragment> expectedFragment) {
    FragmentManager fragmentManager = activity.getSupportFragmentManager();
    for (int entry = 0; entry < fragmentManager.getBackStackEntryCount(); entry++) {
        Fragment fragment = (Fragment) fragmentManager.getBackStackEntryAt(entry);
        if (fragment instanceof expectedFragment) {
            Log.i("TAG", " Expected Fragment Found");
            return true;
        }
    }
    return false;
}

我很好奇实现这样的方法。 谢谢,

【问题讨论】:

  • 在流动代码的哪一行出现编译时错误..
  • at if condition as : 此行有多个标记 - 无法将预期片段解析为类型 - 不兼容的条件操作数类型片段和预期片段
  • Fragment Return null : 在这一行中: Fragment fragment = (Fragment) fragmentManager .findFragmentById(fragmentManager.getBackStackEntryAt(entry) .getId());

标签: java android generics android-fragments


【解决方案1】:
getBackStackEntryAt(index) 

不返回 Fragment 本身,它返回受尊重的 Fragment 的 BackStackEntry 对象。

请看http://developer.android.com/reference/android/app/FragmentManager.html#getBackStackEntryAt(int)

使用下面的 sn-p 从堆栈中检索 Fragment:

   Fragment fragment = (Fragment) fragmentManager
            .findFragmentById(fragmentManager.getBackStackEntryAt(entry)
                    .getId());

在这里,首先您会获得受尊敬的 Fragment 的 BackStackEntry,通过它您将获得特定位置的 Fragment 的 Fragment id。 然后通过 id 可以轻松检索 Fragment。

【讨论】:

【解决方案2】:

我不知道这是否是最好的方法。但我会出于类似目的使用 tag 功能。

当你添加一个片段时,设置一个标签以供以后识别:

fragmentManager.beginTransaction()
               .replace(R.id.container, newlyAddFragment, TAG_FOR_THE_FRAGMENT)
               .commit();

并像这样实现 isExistFragment

boolean isExistFragment(String tag) {
    Fragment targetFragment = fragmentManager.findFragmentByTag(tag);
    return targetFragment != null;
}

【讨论】:

  • 是的,它对我也有用,最后我用同样的策略解决了这个问题。
【解决方案3】:

你可以使用:

expectedFragment.isAssignableFVrom(fragment.getClass())

如果exceptedFragment 类是fragment 类的接口或超类,这将是true(请参阅doc)。

(PS:你不能在exceptedFragment上使用fragment instanceof expectedFragment,因为它是一个类而不是一个对象。)

【讨论】:

    【解决方案4】:

    我认为类中的 import 语句的问题扩展了您导入 supportv4 的 FragmentActivity,并且在该 expectedFragment 中您在检查 import 语句后导入了“import android.app.Fragment”。

    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentActivity;
    

    或 导入android.app.Fragment;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      相关资源
      最近更新 更多