Различные заголовки для каждого фрагмента в моем представлении

Я использую 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);
            }

Вы можете сделать это так: "легко ли?"