将片段作为参数传递?
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;
}
我有一个简单的方法,我想将片段名称作为参数传递。 我有几个像
这样的片段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;
}