android 在 fragmentpager 中禁用片段 0

android disable fragment 0 in fragmentpager

我希望能够在满足某些条件时不允许切换到自定义 FragmentPagerAdapter 中的 3 个片段之一。不幸的是我没有找到任何帮助。

我宁愿不删除并重新添加片段(第 0 项),因为此条件可以随时在 FragmentActivity 内更改,并且我需要片段能够接收和处理消息。

有什么建议吗?有什么不明白的请追问。

编辑:分享一些代码

主要activity:

@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 的访问,因为无论如何它都是空的。

在阅读了 corsair992-s 的回答后 and looking at the CWAC-Pager source code here 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();
}

我不得不更改 getItemgetPageTitle 以使用选项卡列表和 TAG 常量作为标识符(我还包括 arguments for 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);
...