我的视图页纸中每个片段的不同标题

我正在使用视图页“选项卡+滑动”,我想在actionBar中为每个片段设置不同的标题,以便在切换时,标题会发生变化。

我尝试了几件事都没有成功,只显示了最后一个标题......当我切换时,不会再改变...


答案 1

首先,让你的活动实现一个 OnPageChangeListener

然后,在创建 时,可以使用 mViewPager.setOnPageChangeListener(this),以便您的活动在页面更改时收到回调。ViewPager

最后,您需要实现回调。您的方法应如下所示:OnPageChangeListeneronPageSelected()

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

推荐