将片段作为参数传递?

Pass fragment as parameter?

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

这样的片段

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

我对实现这种方法很好奇。 谢谢,

getBackStackEntryAt(index) 

不 return 片段本身,它 return 受尊重片段的 BackStackEntry 对象。

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

使用下面的代码片段从堆栈中检索片段:

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

在这里,首先你得到了受人尊敬的片段的BackStackEntry,通过它你可以得到片段在特定位置的片段id。 然后通过 id 你可以很容易地检索 Fragment.

你也许可以使用:

expectedFragment.isAssignableFVrom(fragment.getClass())

如果 exceptedFragment class 是 fragment class 的接口或超 class,则这将是 true(参见 doc).

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

我认为 class extends FragmentActivity 中的导入语句存在问题,您导入了 supportv4 并且在您导入的 expectedFragment 中 "import android.app.Fragment" 一旦检查了导入语句。

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

或 导入 android.app.Fragment;

不知道是不是最好的方法。但我会出于类似目的使用 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;
}