【问题标题】:ActionBar Title with Fragments/ViewPager - Title shown for wrong Fragment带有 Fragments/ViewPager 的 ActionBar 标题 - 显示错误 Fragment 的标题
【发布时间】:2017-11-25 00:44:36
【问题描述】:

我已经环顾了几天试图解决这个问题,但我似乎无法将其缩小到我的具体问题。

我有一个使用 4 个 Fragment 的应用程序,通常是 FragmentPagerAdapter、TabLayout 等。我正在使用普通的 ActionBar 并希望更新 ActionBar 的标题以反映我当前使用的 4 个 Fragment 中的哪一个.

我已经实现了某人的解决方案来更改标题,但它并没有真正起作用:

((MainActivity) getActivity()).setActionBarTitle("Locations");

使用上面的代码,出于某种我无法理解的奇怪原因,标题总是针对我当前所在的下一个片段的下一个片段!所以当我在“食物”片段上时,标题说“照片”,这是它后面的下一个片段的标题。我已经尝试将此代码放在我的 onCreateView()、onActivityCreated() 和 onResume() 中,用于每个 Fragment,但结果是相同的 - 标题不是正确的 Fragment。

我将我当前的代码,以便可以发现任何问题...

注意:我不想更改 TabLayout 中每个选项卡的标题,因为我为这些设置了图标,我只想更改与当前显示的 Fragment 相关的 ActionBar 的标题。 :)

FragmentPagerAdapter:

public class CategoryAdapter extends FragmentPagerAdapter {

    private Context mContext;

    public CategoryAdapter(Context context, FragmentManager fm) {
        super(fm);
        mContext = context;
    }

    @Override
    public Fragment getItem(int position) {
        if (position == 0) {
            return new Locations();
        } else if (position == 1) {
            return new Food();
        } else if (position == 2) {
            return new Photos();
        } else {
            return new History();
        }
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        return null;
    }
}

MainActivity 类:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);


        CategoryAdapter adapter = new CategoryAdapter(this, getSupportFragmentManager());

        viewPager.setAdapter(adapter);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);

        int[] imageResId = {
                R.drawable.ic_place_white_48dp,
                R.drawable.ic_restaurant_white_48dp,
                R.drawable.ic_wallpaper_white_48dp,
                R.drawable.ic_account_balance_white_48dp};

        for (int i = 0; i < tabLayout.getTabCount(); i++) {
            tabLayout.getTabAt(i).setIcon(imageResId[i]);
        }
    }

    public void setActionBarTitle(String title) {
        getSupportActionBar().setTitle(title);
    }
}

有什么想法吗?非常感谢您的帮助!

【问题讨论】:

  • 能否提供分片代码?
  • 你好 Zainal,我现在有时间看我的帖子的答案,客流月完美地回答了我的问题。不过,感谢您的关注!

标签: android android-fragments android-viewpager android-actionbar fragmentpageradapter


【解决方案1】:

你可以试试这个。

1.使用setupWithViewPager方法

2.setupWithViewPager方法后必须使用setIcon方法

3.设置默认ActionBar标题

4.选择标签时设置ActionBar标题

5.删除 ((MainActivity) getActivity()).setActionBarTitle("Locations"); in fragment

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);

    CategoryAdapter adapter = new CategoryAdapter(this, getSupportFragmentManager());

    viewPager.setAdapter(adapter);

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);

    int[] imageResId = {
            R.drawable.ic_place_white_48dp,
            R.drawable.ic_restaurant_white_48dp,
            R.drawable.ic_wallpaper_white_48dp,
            R.drawable.ic_account_balance_white_48dp};
    // title
    final String[] mTitleNames = {"location", "food", "photos", "history"};
    // setupWithViewPager
    tabLayout.setupWithViewPager(viewPager);
    // you must setIcon after setupWithViewPager method
    for (int i = 0; i < imageResId.length; i++) {
        tabLayout.getTabAt(i).setIcon(imageResId[i]);
    }
    // set default actionbar title
    setActionBarTitle(mTitleNames[0]);
    // set actionbar title when tab is selected
    tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            int pos = tab.getPosition();
            setActionBarTitle(mTitleNames[pos]);
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
}

public void setActionBarTitle(String title) {
    getSupportActionBar().setTitle(title);
}

【讨论】:

  • 哇,就是这样!完美运行,非常感谢 KeLiuyue。 :) 看起来我在粘贴原始帖子中的代码时不小心删除了我的tabLayout.setupWithViewPager(viewPager);(我删除了很多 cmets,我不得不让事情变得更清晰,哈哈)。无论如何,这段代码完全符合我的要求 - 再次感谢。
  • 祝你好运。@Stephend
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
相关资源
最近更新 更多