如何不在标签式活动上显示一些标签?

时间:2015-09-21 18:59:46

标签: android android-fragments tabs android-design-library

我有以下活动,显示不同的标签。

public class BagContent extends FragmentActivity implements ActionBar.TabListener, CosmeListener {

String[] profileTypes;

SectionsPagerAdapter mSectionsPagerAdapter;
ViewPager mViewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {

    setContentView(R.layout.activity_bag_content);
    mViewPager = (ViewPager) findViewById(R.id.pager);
    final ActionBar actionBar = getActionBar();
    actionBar.setTitle(getString(R.string.title_activity_bag_content) + " [" + bagName + "]");
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager());
    mViewPager.setAdapter(mSectionsPagerAdapter);
    mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            actionBar.setSelectedNavigationItem(position);
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

    for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
        actionBar.addTab(actionBar.newTab().setText(mSectionsPagerAdapter.getPageTitle(i)).setTabListener(this));
    }
}

@Override
protected void onResume() {
    super.onResume();
    // TODO Auto-generated method stub
}

@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    // When the given tab is selected, switch to the corresponding page in
    // the ViewPager.
    mViewPager.setCurrentItem(tab.getPosition());
}

@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}

@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}

/**
 * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
 * one of the sections/tabs/pages.
 */
public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
        case 0:
            return new FormatShortFragment();
        case 1:
            return new FormatLongFragment();
        case 2:
            return new FormatPlantFragment();
        }

        return null;
    }

    @Override
    public int getCount() {
        // Show 3 total pages.
        return 3;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        Locale l = Locale.getDefault();
        switch (position) {
        case 0:
            return getString(R.string.title_bag_content_format_short).toUpperCase(l);
        case 1:
            return getString(R.string.title_bag_content_format_long).toUpperCase(l);
        case 2:
            return getString(R.string.title_bag_content_format_plant).toUpperCase(l);
        }
        return null;
    }
}

我有和不同的配置文件类型的数组,根据每种类型我必须显示一些标签或其他。

实际上,每个配置文件类型都显示了所有标签。我尝试手动插入操作栏上的选项卡,但随后选项卡未正确显示片段。其他问题是当我转到右边缘不存在的标签时导航中断。

我需要帮助,如何为特定的个人资料类型选择1个标签?

例如,我如何只展示title_bag_content_format_long及其profileTypes [1]的片段?

任何步行都可以很好,例如从某些配置文件类型或任何其他东西中删除一些标签。

非常感谢,我真的需要帮助。

EDITED

我做了一些修改:

为SectionsPagerAdapter构造函数添加了一个配置文件类型参数:

private String profileType;
public SectionsPagerAdapter(FragmentManager fm, String profileType) {
    super(fm);
    this.profileType = profileType;
}

然后我修改了其他方法来控制配置文件类型:

    @Override
    public Fragment getItem(int position) {
        if (this.profileType.equals(profileTypes[1])){
            switch (position) {
            case 0:
                return new FormatPlantFragment();
            }
        } else {
            switch (position) {
            case 0:
                return new FormatShortFragment();
            case 1:
                return new FormatLongFragment();
            case 2:
                return new FormatPlantFragment();
            }
        }

        return null;
    }

    @Override
    public int getCount() {
        if (this.profileType.equals(profileTypes[1])){
            return 1;
        }
        return 3;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        Locale l = Locale.getDefault();
        if (this.profileType.equals(profileTypes[1])){
            switch (position) {
                case 0:
                    return getString(R.string.title_bag_content_format_plant).toUpperCase(l);
            }
        } else {
            switch (position) {
            case 0:
                return getString(R.string.title_bag_content_format_short).toUpperCase(l);
            case 1:
                return getString(R.string.title_bag_content_format_long).toUpperCase(l);
            case 2:
                return getString(R.string.title_bag_content_format_plant).toUpperCase(l);
            }
        }
        return null;
    }

这是正常工作,并按配置文件类型进行过滤更多功能。 感谢Filpe.costa01给了我所需的推动力。

1 个答案:

答案 0 :(得分:2)

您正在返回所有标签,因为您的方法

@Override
public int getCount() {
    // Show 3 total pages.
    return 3;
}

返回3个标签。也许你可以使用SectionsPagerAdapter构造函数来根据你想要的每个配置文件包含你喜欢的标签数量。

这样的事情:

private mNumOfTabs;
public SectionsPagerAdapter(FragmentManager fm, int numberOfTabs) {
    super(fm);
    mNumOfTabs = numberOfTabs;
}

你应该为这个替换你的getCount()方法:

@Override
public int getCount() {
    // Show 3 total pages.
    return mNumOfTabs;
}

以方兴未艾的方式组织您的个人资料(低调=少量标签),您可以像现在这样使用此方法

@Override
public Fragment getItem(int position) {
    switch (position) {
    case 0:
        return new FormatShortFragment();
    case 1:
        return new FormatLongFragment();
    case 2:
        return new FormatPlantFragment();
    }

    return null;
}

否则,您应该考虑配置文件并实现新逻辑以检索每个配置文件的正确选项卡。