传递片段作为参数?

时间:2015-01-02 12:56:37

标签: java android generics android-fragments

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

这样的片段

1)AddNewDatesFragment

2)AskFragment

3)DisclaimerFragment

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

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

我很想实现这种方法。 谢谢,

4 个答案:

答案 0 :(得分:1)

getBackStackEntryAt(index) 

不返回Fragment本身,它返回BackStackEntry对象以获取受尊重的片段。

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

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

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

在这里,首先获得受尊重的Fragement的BackStackEntry,通过它可以在特定位置获得片段的片段ID。 然后通过id,您可以轻松地检索片段。

答案 1 :(得分:0)

您可以使用:

expectedFragment.isAssignableFVrom(fragment.getClass())

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

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

答案 2 :(得分:0)

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

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

或     import android.app.Fragment;

答案 3 :(得分:0)

我不知道这是否是最佳方式。但我会将 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;
}