问题
My ViewPager consists of many fragments .I am displaying title of fragment inside actionBar and i am using below code to set title .Since the ViewPager also initiates adjacent fragments I see in actionbar the title of next fragment.What should be the correct way to proceed in setting the title in actionbar of viewpager?
private class MyPagerAdapter extends FragmentPagerAdapter {
private String[] titles = {
"Titleme", "Titletos", "Titleos", "Titles", "MeTitle5", "Title6",
"Title7", "Title8"
};
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public CharSequence getPageTitle(int position) {
return titles[position];
}
@Override
public android.support.v4.app.Fragment getItem(int pos) {
Bundle args = new Bundle();
switch (pos) {
case 0:
currentFragment = new HomeFragment();
getSupportActionBar().setTitle("HomeFragment");
break;
case 1:
currentFragment = new HomeFragment5();
getSupportActionBar().setTitle("HomeFragment5");
break;
case 2:
currentFragment = new HomeFragment4();
getSupportActionBar().setTitle("HomeFragment4");
break;
case 3:
currentFragment = new HomeFragment3();
getSupportActionBar().setTitle("HomeFragment3");
break;
case 4:
currentFragment = new HomeFragment4();
getSupportActionBar().setTitle("HomeFragment4");
break;
case 5:
currentFragment = new ChlHome();
getSupportActionBar().setTitle("ChlHome");
break;
case 6:
currentFragment = new GiFragment();
getSupportActionBar().setTitle("GiFragment");
break;
case 7:
currentFragment = new FlList();
getSupportActionBar().setTitle(" FlList");
break;
default:
}
return currentFragment;
}
@Override
public int getCount() {
return 8;
}
}
Updated according to shkschneider answer
final ViewPager pager = (ViewPager) findViewById(R.id.viewPager);
pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
PagerSlidingTabStrip tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);
tabs.setViewPager(pager);
pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
pager.setCurrentItem(position);
switch(position) {
case 0:
getSupportActionBar().setTitle("H");
break;
case 1:
getSupportActionBar().setTitle("P");
break;
case 2:
getSupportActionBar().setTitle("A");
break;
case 3:
getSupportActionBar().setTitle("V");
break;
case 4:
getSupportActionBar().setTitle("M");
break;
case 5:
getSupportActionBar().setTitle("C");
break;
case 6:
getSupportActionBar().setTitle("G");
break;
case 7:
getSupportActionBar().setTitle("F");
break;
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
private class MyPagerAdapter extends FragmentPagerAdapter {
private String[] titles = {
"Titleme", "Titletos", "Titleos", "Titles", "MeTitle5", "Title6",
"Title7", "Title8"
};
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public CharSequence getPageTitle(int position) {
return titles[position];
}
@Override
public android.support.v4.app.Fragment getItem(int pos) {
Bundle args = new Bundle();
switch (pos) {
case 0:
currentFragment = new HomeFragment();
break;
case 1:
currentFragment = new HomeFragment5();
break;
case 2:
currentFragment = new HomeFragment4();
break;
case 3:
currentFragment = new HomeFragment3();
break;
case 4:
currentFragment = new HomeFragment4();
break;
case 5:
currentFragment = new ChlHome();
break;
case 6:
currentFragment = new GiFragment();
break;
case 7:
currentFragment = new FlList();
break;
default:
}
return currentFragment;
}
@Override
public int getCount() {
return 8;
}
}
}
回答1:
Try this one .....
final ViewPager pager = (ViewPager) findViewById(R.id.viewPager);
pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
PagerSlidingTabStrip tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);
tabs.setViewPager(pager);
//Use tabs for setting listener
tabs
.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// TODO Auto-generated method stub
tabs.setNextFocusRightId(position);
actionBar.setTitle(titles[pos]);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int pos) {
// TODO Auto-generated method stub
}
});
回答2:
Try this code:
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int pos) {
actionBar.setSelectedNavigationItem(pos);
actionBar.setTitle(titles[pos]);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
回答3:
You can make array of titles string then set page listener on view pager and inside onPageScrolled do like this:
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
getSupportActionBar().setTitle(titles[position]);
}
回答4:
getItem() is called everytime your app wants to render a Fragment, so of course the title displays the next one.
Instead you should use ViewPager.OnPageChangeListener:
@Override
public void onPageSelected(final int position) {
switch (position) {
case 0:
getSupportActionBar().setTitle("HomeFragment");
break ;
// ...
}
}
回答5:
remove line from all places
getSupportActionBar().setTitle("XYZ");
from you source.
return title from getPageTitle method only.
来源:https://stackoverflow.com/questions/29847194/setting-action-bar-title-in-viewpager