java 我的 viewpager 中每个片段的不同标题
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/12715815/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Different titles for each fragment in my viewpager
提问by lost17
I am using a viewpager "tabs + swipe" and I would like to set different titles in the actionBar for each fragment so that when I switch, title changes.
我正在使用 viewpager “tabs + swipe”,我想在 actionBar 中为每个片段设置不同的标题,这样当我切换时,标题会发生变化。
I tried several things without success, only the last title displays... and does not change anymore when I switch...
我尝试了几件事都没有成功,只显示最后一个标题......并且当我切换时不再改变......
回答by UgglyNoodle
First, make your activity implement an OnPageChangeListener
.
首先,让您的活动实现一个OnPageChangeListener
.
Then, when you create your ViewPager
, you can use mViewPager.setOnPageChangeListener(this)
so that your activity will receive callbacks when the page changes.
然后,当您创建您的 时ViewPager
,您可以使用,mViewPager.setOnPageChangeListener(this)
以便您的 Activity 在页面更改时接收回调。
Finally, you need to implement the OnPageChangeListener
callbacks. Your onPageSelected()
method should be something like this:
最后,您需要实现OnPageChangeListener
回调。你的onPageSelected()
方法应该是这样的:
@Override
public abstract void onPageSelected(int position) {
setTitle(getTitleFromPosition(position));
}
The other two callbacks can be empty.
另外两个回调可以为空。
回答by mixel
Though the question is a bit outdated I would suggest my solution. Scenario: tabs+swipe and every tab have fragment navigation stack. So action bar title can be changed not only through switching and swiping tabs but with navigation in every tab. To provide title per fragment I declared TitleProvider
interface, so if fragment has custom title it must implement this interface.
虽然这个问题有点过时,但我会建议我的解决方案。场景:标签+滑动,每个标签都有片段导航堆栈。因此,操作栏标题不仅可以通过切换和滑动选项卡来更改,还可以通过在每个选项卡中进行导航来更改。为了为每个片段提供标题,我声明了TitleProvider
接口,所以如果片段有自定义标题,它必须实现这个接口。
public interface TitleProvider {
CharSequence getTitle();
}
Below there is custom FragmentPagerAdapter
, that handles switching, swiping, navigation and title update:
下面是 custom FragmentPagerAdapter
,它处理切换、滑动、导航和标题更新:
public class TabsAdapter extends FragmentPagerAdapter implements
TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener {
private final FragmentActivity activity;
private final TabHost tabHost;
private final ViewPager viewPager;
private final ArrayList<Fragment> fragments = new ArrayList<Fragment>();
private final Hashtable<Fragment, Stack<Class<?>>> fragmentBackstack = new Hashtable<Fragment, Stack<Class<?>>>();
static class DummyTabFactory implements TabHost.TabContentFactory {
private final Context context;
public DummyTabFactory(Context context) {
this.context = context;
}
@Override
public View createTabContent(String tag) {
View v = new View(context);
v.setMinimumWidth(0);
v.setMinimumHeight(0);
return v;
}
}
public TabsAdapter(FragmentActivity activity, TabHost tabHost,
ViewPager pager) {
super(activity.getSupportFragmentManager());
this.activity = activity;
this.tabHost = tabHost;
viewPager = pager;
tabHost.setOnTabChangedListener(this);
viewPager.setAdapter(this);
viewPager.setOnPageChangeListener(this);
}
public void addTab(String tag, int drawableId, Fragment fragment,
int tabIndicatorId) {
TabSpec tabSpec = tabHost.newTabSpec(tag);
tabSpec.setContent(new DummyTabFactory(activity.getApplicationContext()));
View tabIndicator = LayoutInflater.from(
activity.getApplicationContext()).inflate(tabIndicatorId,
tabHost.getTabWidget(), false);
TextView title = (TextView) tabIndicator.findViewById(R.id.tab_title);
if (fragment instanceof TitleProvider) {
title.setText(((TitleProvider) fragment).getTitle());
}
ImageView icon = (ImageView) tabIndicator.findViewById(R.id.tab_icon);
icon.setImageResource(drawableId);
tabSpec.setIndicator(tabIndicator);
fragments.add(fragment);
tabHost.addTab(tabSpec);
notifyDataSetChanged();
}
@Override
public int getCount() {
return fragments.size();
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getItemPosition(Object object) {
int returnCode;
if (fragments.contains(object)) {
returnCode = POSITION_UNCHANGED;
} else {
returnCode = POSITION_NONE;
}
return returnCode;
}
@Override
public void onTabChanged(String tabId) {
int position = tabHost.getCurrentTab();
viewPager.setCurrentItem(position);
updateTitle();
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
// Unfortunately when TabHost changes the current tab, it kindly
// also takes care of putting focus on it when not in touch mode.
// The jerk.
// This hack tries to prevent this from pulling focus out of our
// ViewPager.
TabWidget widget = tabHost.getTabWidget();
int oldFocusability = widget.getDescendantFocusability();
widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
tabHost.setCurrentTab(position);
widget.setDescendantFocusability(oldFocusability);
}
@Override
public void onPageScrollStateChanged(int state) {
}
public void navigate(Fragment fromFragment, Fragment toFragment) {
startUpdate(viewPager);
FragmentTransaction transaction = activity.getSupportFragmentManager()
.beginTransaction();
transaction.remove(fromFragment);
transaction.commit();
Stack<Class<?>> backstack;
if (fragmentBackstack.containsKey(fromFragment)) {
backstack = fragmentBackstack.get(fromFragment);
fragmentBackstack.remove(fromFragment);
} else {
backstack = new Stack<Class<?>>();
}
backstack.push(fromFragment.getClass());
fragmentBackstack.put(toFragment, backstack);
fragments.set(fragments.indexOf(fromFragment), toFragment);
finishUpdate(viewPager);
notifyDataSetChanged();
updateTitle();
}
public Boolean navigateBack() {
startUpdate(viewPager);
Fragment fromFragment = fragments.get(viewPager.getCurrentItem());
if (!fragmentBackstack.containsKey(fromFragment))
return false;
Stack<Class<?>> backstack = fragmentBackstack.get(fromFragment);
if (backstack.isEmpty())
return false;
fragmentBackstack.remove(fromFragment);
Fragment toFragment = Fragment.instantiate(activity, backstack.pop()
.getName());
fragmentBackstack.put(toFragment, backstack);
fragments.set(fragments.indexOf(fromFragment), toFragment);
FragmentTransaction transaction = activity.getSupportFragmentManager()
.beginTransaction();
transaction.remove(fromFragment);
transaction.commit();
finishUpdate(viewPager);
notifyDataSetChanged();
updateTitle();
return true;
}
protected Fragment getCurrentFragment() {
return fragments.get(viewPager.getCurrentItem());
}
protected void updateTitle() {
Fragment fragment = getCurrentFragment();
if (fragment instanceof TitleProvider) {
activity.setTitle(((TitleProvider) fragment).getTitle());
}
}
}
回答by Malek Libya
@Override
public void onPageSelected(int position) {
tabHost.setSelectedNavigationItem(position);
if (position == 0){
setTitle(R.string.where_is_the_bus);
}
else if (position == 1){
setTitle(R.string.bus_card);
}
else if (position == 2){
setTitle(R.string.favo);
}
You can make it like this "it's easy right?"
你可以让它像这样“这很容易吧?”