我希望能够在满足某些条件时不允许在我的自定义FragmentPagerAdapter中切换到我的3个片段之一。不幸的是我找不到任何帮助。
我不想删除并重新添加片段(第0项),因为此标准可以随时在FragmentActivity中更改,我需要片段能够接收和处理消息。
有什么建议吗?请问一些事情是否不清楚。
编辑:分享一些代码
主要活动:
@Override
protected void onResume() {
super.onResume();
...
_sectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager(), this, cardnumber, pin);
_viewPager = (ViewPager) findViewById(R.id.pager);
_viewPager.setAdapter(_sectionsPagerAdapter);
_viewPager.setOnPageChangeListener(_sectionsPagerAdapter);
_viewPager.setCurrentItem(1);
_viewPager.setOffscreenPageLimit(2);
这看起来有点粗鲁,但它有效
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
Bundle args = new Bundle();
switch (position) {
case CUSTOMER_DETAILS_PAGE:
// fragment = _fragments.get(TRLIST_PAGE);
fragment = new UserDetailFragment();
args.putString("TAG", "details");
break;
case BALANCE_PAGE:
// fragment = _fragments.get(BALANCE_PAGE);
fragment = new BalanceFragment();
args.putString("TAG", "balance");
break;
case TRLIST_PAGE:
// fragment = _fragments.get(TRLIST_PAGE);
fragment = new TrListFragment();
args.putString("TAG", "trlist");
break;
default:
break;
}
_listeners.put(position, (MyTabSelectedListener) fragment);
// fragment = (Fragment) _listeners.get(position);
args.putString("cardnumber", _cardnumber);
args.putString("pin", _pin);
fragment.setArguments(args);
return fragment;
}
我想限制对CUSTOMER_DETAILS_PAGE的访问,无论如何它都是空的。
答案 0 :(得分:0)
在这里阅读corsair992-s答案https://stackoverflow.com/a/23967701/3153792并在此处查看CWAC-Pager源代码https://github.com/commonsguy/cwac-pager我找到了我想要的内容。
关键是要更改getItemPosition
函数(之前我甚至没有使用过)来获取 TAG 参数(在getItem
中设置)碎片并以这种方式识别它们:
@Override
public int getItemPosition(Object item) {
Fragment fragment = (Fragment) item;
String title = fragment.getArguments().getString("TAG");
int position = tabs.indexOf(title);
if (position >= 0) {
return position;
} else {
return POSITION_NONE;
}
首先,我为每个标签定义标签,并按照外观的顺序列出一个列表:
public static final String CUSTOMER_DETAILS_PAGE = "detail";
public static final String BALANCE_PAGE = "balance";
public static final String TRLIST_PAGE = "trlist";
List<String> tabs = new ArrayList<String>();
然后,我按照原始顺序在构造函数中添加它们:
tabs.add(CUSTOMER_DETAILS_PAGE);
tabs.add(BALANCE_PAGE);
tabs.add(TRLIST_PAGE);
当我需要隐藏选项卡时,我只是将其从列表中删除并通知适配器:
public void disableUserDetail() {
tabs.remove(tabs.indexOf(CUSTOMER_DETAILS_PAGE));
notifyDataSetChanged();
}
我的片段专门转到左侧(开头),但很容易改变:
public void enableUserDetail() {
tabs.add(0, CUSTOMER_DETAILS_PAGE);
notifyDataSetChanged();
}
我必须更改getItem
和getPageTitle
以使用标签列表和 TAG 常量作为标识符(我还将其包含为参数 getItemPosition
):
@Override
public Fragment getItem(int position) {
String id = tabs.get(position);
Fragment fragment = null;
Bundle args = new Bundle();
if (id.equals(CUSTOMER_DETAILS_PAGE)) {
fragment = new UserDetailFragment();
args.putString("TAG", CUSTOMER_DETAILS_PAGE);
...
@Override
public CharSequence getPageTitle(int position) {
Locale l = Locale.getDefault();
String id = tabs.get(position);
if (id.equals(CUSTOMER_DETAILS_PAGE)) {
return _ctx.getString(R.string.title_section1).toUpperCase(l);
...