android在fragmentpager中禁用片段0

时间:2015-01-29 12:28:03

标签: java android android-fragments fragmentpageradapter

我希望能够在满足某些条件时不允许在我的自定义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的访问,无论如何它都是空的。

1 个答案:

答案 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();
}

我必须更改getItemgetPageTitle以使用标签列表和 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);
...