Различные заголовки для каждого фрагмента в моем представлении
Я использую viewpager "tabs + swipe", и я хотел бы установить разные заголовки в actionBar для каждого фрагмента, чтобы при переключении менялось название.
Я пробовал несколько вещей без успеха, только последний заголовок отображает... и больше не меняется при переключении...
Ответы
Ответ 1
Сначала сделайте свою деятельность OnPageChangeListener
.
Затем, когда вы создаете свой ViewPager
, вы можете использовать mViewPager.setOnPageChangeListener(this)
, чтобы ваша активность получала обратные вызовы при изменении страницы.
Наконец, вам нужно реализовать обратные вызовы OnPageChangeListener
. Ваш метод onPageSelected()
должен быть примерно таким:
@Override
public abstract void onPageSelected(int position) {
setTitle(getTitleFromPosition(position));
}
Два других обратных вызова могут быть пустыми.
Ответ 2
Хотя вопрос немного устарел, я бы предложил свое решение. Сценарий: вкладки + салфетки, а на каждой вкладке есть стек навигации фрагмента. Таким образом, заголовок панели действий можно изменить не только путем переключения и выбора вкладок, но и навигации на каждой вкладке. Чтобы предоставить заголовок на фрагмент, я объявил TitleProvider
интерфейс, поэтому, если у фрагмента есть пользовательский заголовок, он должен реализовать этот интерфейс.
public interface TitleProvider {
CharSequence getTitle();
}
Ниже приведен пользовательский 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());
}
}
}
Ответ 3
@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);
}
Вы можете сделать это так: "легко ли?"