使用PagerTabStrip更改ActionBar的标题

时间:2014-07-23 07:57:40

标签: android android-fragments

我在项目中实现了一个自定义Actionbar,我在其中使用了Tabs导航。此自定义操作栏在右侧显示产品徽标,在左侧显示片段选项卡标题。因此,每次我选择一个选项卡以更改为另一个片段时,Actionbar的标题也会更改。

这种方法工作正常,但现在我已修改它以实现PagerTabStrip。为了得到这个,我已经包含了PagerTabStrip的相关代码,并在ActionBar上使用Tabs导航退出。

事情是,我现在不能改变动作棒的标题。

这是我现在在主Activity中使用PagerTabStrip实现Actionbar的方式:

MainActivity.java

/*Inflate your custom actionBar layout*/
final ViewGroup actionBarLayout = (ViewGroup) getLayoutInflater().inflate(R.layout.custom_actionbar, null);

abTitle = (TextView) actionBarLayout.findViewById(R.id.abtitle);

actionBar = getSupportActionBar();
/*Hide default icon*/
actionBar.setDisplayShowHomeEnabled(false);
/*Hide default title*/
actionBar.setDisplayShowTitleEnabled(false);
/*Enable custom view*/
actionBar.setDisplayShowCustomEnabled(true);
actionBar.setCustomView(actionBarLayout);

ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
viewPager.setAdapter(new ViewPagerAdapter(getSupportFragmentManager()));

ViewPagerAdapter.java

public class ViewPagerAdapter extends FragmentPagerAdapter {

    final int PAGE_COUNT = 2;
    /*Tab Titles*/
    private final String tabtitles[] = new String[] { "TEST", "SETTINGS"};
    Context context;


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


    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                Fragment1 fragmenttab1 = new Fragment1();
                return fragmenttab1;
            case 1:
                Fragment2 fragmenttab2 = new Fragment2();
                return fragmenttab2;
        }
        return null;
    }

    @Override
    public int getCount() {
        return PAGE_COUNT;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return tabtitles[position];
    }
}

这就是我在使用制表符时改变Actionbar标题的方式,而这似乎与PagerTabStrip无关。

片段:

((MainActivity)getActivity()).setActionBarTitle(getString(R.string.test_title));

在MainActivity中:

public void setActionBarTitle(String title) {
    abTitle.setText(title);
}

所以问题是,如何使用PagerTabStrip以动态方式更改Actionbar的标题?为什么这种方法无法使用呢? PagerTabStrip是否以不同的方式管理片段?

1 个答案:

答案 0 :(得分:1)

您需要在适配器上保留一个引用,以便您可以获得所需的每个片段标题

ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
final ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager())
viewPager.setAdapter(adapter);

此外,每次选择新页面时,您都必须设置操作栏的标题。像这样在ViewPager添加一个监听器:

 viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {


                    @Override
                    public void onPageScrollStateChanged(int state) {

                    }

                    @Override
                    public void onPageScrolled(int position,
                            float positionOffset, int positionOffsetPixels) {
                        }

                    @Override
                    public void onPageSelected(int position) {
                    //A new page has been selected. Change the title here
                    String title = adapter.getPageTitle(position);
                    (MainActivity)getActivity()).setActionBarTitle(title);

                    }

      }

查看onPageSelected方法。这是您需要覆盖的回调并将setTitle调用放在那里。

编辑:为了确保在从背景创建/重新创建/恢复活动时设置正确的标题,请执行以下操作:

@Override
void onResume(){
    int pos = viewPager.getCurrentPosition();
    String title = adapter.getPageTitle(position);
    setActionBarTitle(title);
}

你必须在onCreate()调用之外设置ViewPager的引用,但我相信你会弄明白的;)