首页 文章

带有Fragments / ViewPager的ActionBar Headers - 显示错误片段的 Headers

提问于
浏览
0

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

我有一个使用4片段的应用程序,通常是FragmentPagerAdapter,TabLayout等 . 我正在使用普通的ActionBar并想要更新ActionBar的 Headers 以反映我当前所在的4个片段中的哪一个 .

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

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

有了上面的代码,由于一些我无法理解的奇怪的原因, Headers 总是从我当前的那个片段开始!因此,当我在“食物”碎片上时, Headers 会显示“照片”,这是它之后的下一个片段的 Headers . 我已经尝试将此代码放在我的onCreateView(),onActivityCreated()和onResume()中,每个片段,但结果是相同的 - Headers 不适用于正确的片段 .

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

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

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 class:

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);
    }
}

有任何想法吗?非常感谢你的帮助!

1 回答

  • 1

    你可以试试这个 .

    1.use setupWithViewPager method

    2.you must use setIcon method after setupWithViewPager method

    3.set default ActionBar title

    4.set ActionBar title when tab is selected

    5.remove ((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);
    }
    

相关问题