在Android中每次切换选项卡时更改操作栏标题

8

我使用ActionBarSherlock和Fragments设置了带有滑动选项卡的操作栏。

我想要每个选项卡都有不同的操作栏标题。如果我可以设置图像而不是标题,那就太好了,这样每个选项卡都会有不同的操作栏图像标题。

我会感激任何建议和教程链接!谢谢:)

以下是我的代码:

TabActivity.java

package com.tptabs;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockFragmentActivity;

import android.support.v4.view.ViewPager;

public class TabActivity extends SherlockFragmentActivity {

    private ViewPager mViewPager;
    private TabAdapter mTabsAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mViewPager = new ViewPager(this);
        mViewPager.setId(R.id.pager);
        setContentView(mViewPager);

        final ActionBar bar = getSupportActionBar();
        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        mTabsAdapter = new TabAdapter(this, mViewPager);
        mTabsAdapter.addTab(bar.newTab().setText("").setIcon(getResources().getDrawable(R.drawable.social_group)), JoinFragment.class, null);
        mTabsAdapter.addTab(bar.newTab().setText("").setIcon(getResources().getDrawable(R.drawable.content_edit)), CreateFragment.class, null);
        mTabsAdapter.addTab(bar.newTab().setText("").setIcon(getResources().getDrawable(R.drawable.location_web_site)), PlayFragment.class, null);
        mTabsAdapter.addTab(bar.newTab().setText("").setIcon(getResources().getDrawable(R.drawable.collections_collection)), ResultFragment.class, null);
        mTabsAdapter.addTab(bar.newTab().setText("").setIcon(getResources().getDrawable(R.drawable.device_access_accounts)), StoreFragment.class, null);
    }
}

TabAdapter.java

package com.tptabs;
import java.util.ArrayList;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.widget.Toast;

import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.ActionBar.Tab;
import com.actionbarsherlock.app.SherlockFragmentActivity;

public class TabAdapter extends FragmentPagerAdapter implements ActionBar.TabListener , ViewPager.OnPageChangeListener{
    private final Context mContext;
    private final ActionBar mActionBar;
    private final ViewPager mViewPager;
    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
    private final String TAG = "21st Polling:";

    static final class TabInfo{
        private final Class<?> clss;
        private final Bundle args;

        TabInfo(Class<?> _class, Bundle _args){
            clss = _class;
            args = _args;
        }
    }

    public TabAdapter(SherlockFragmentActivity fa, ViewPager pager) {
        super(fa.getSupportFragmentManager());
        mContext = fa;
        mActionBar = fa.getSupportActionBar();
        mViewPager = pager;
        mViewPager.setAdapter(this);
        mViewPager.setOnPageChangeListener(this);
    }

    public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args){
        TabInfo info = new TabInfo(clss, args);
        tab.setTag(info);
        tab.setTabListener(this);
        mTabs.add(info);
        mActionBar.addTab(tab);
        notifyDataSetChanged();
    }

    @Override
    public void onPageScrollStateChanged(int state) {


    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {


    }

    @Override
    public void onPageSelected(int position) {
        mActionBar.setSelectedNavigationItem(position);
                }

    @Override
    public  void onTabSelected(Tab tab, FragmentTransaction ft) {
        mViewPager.setCurrentItem(tab.getPosition());
        Log.v(TAG, "clicked");
        Object tag = tab.getTag();
        for (int i = 0; i<mTabs.size(); i++){
            if (mTabs.get(i) == tag){
                mViewPager.setCurrentItem(i);
            }
        }

    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        //Toast.makeText(mContext, "You've deselected a tab", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {

    }

    @Override
    public Fragment getItem(int position) {
        TabInfo info = mTabs.get(position);
        return Fragment.instantiate(mContext, info.clss.getName(), info.args);
    }

    @Override
    public int getCount() {
        return mTabs.size();
    }

}

1
谢谢,它可以工作了。但是当我启动应用程序时,它首先设置旧标题,在滑动到任何选项卡时,它会更改为“您当前的选项卡标题”,并保持不变。我将其放在了TabAdapter.java中的onPageSelected中。我应该将其放在片段本身内吗? - user1810991
我还没有创建任何字符串,事实上我想使用一张图片而不是字符串,在onPageSelected内访问它应该是可能的。 - user1810991
它可以工作,但我如何删除标题,以便只获取图标? - user1810991
当您的应用程序启动时,请调用mActionBar.setIcon并传递正确的值。它工作了吗? - Blackbelt
谢谢,现在我感觉很蠢))) 它起作用了 但是我如何为其余的选项卡设置图像? - user1810991
显示剩余14条评论
3个回答

7
您需要像这样将addOnPageChangeListener设置到您的视图页面中:
 pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            if (position == 1) {
               setTitle("Page 1");
            } else if (position == 2)
            {
                setTitle("Page 2");
            }
            else
            {
                setTitle("Page 3");
            }


        }

请详细解释一下你的答案。 - Alex
将此监听器设置为您的视图页,即在设置适配器的位置。 - Alfred Wright
我已经审查了你的回答。你应该支持你的答案。 - Alex
抱歉,我该怎么做呢?我是 Stack Overflow 的新手。 - Alfred Wright
你可以编辑你的答案并添加细节。现在没问题,请下次这样做。 - Alex
@Alex 你还记得这个 setTitle() 是什么吗? - suv

4
public class TabAdapter extends FragmentPagerAdapter implements ActionBar.TabListener , ViewPager.OnPageChangeListener{
   int resId = {R.drawable.position0, R.drawable.position1, R.drawable.position2, R.drawable.position3, R.drawable.position4};

 @Override
public void onPageSelected(int position) {
    mActionBar.setSelectedNavigationItem(position);
    int resIdLenght = resId.length;
    if (position < 0 || position >= resIdLenght)
            return;
    int drawableId = resId[position];
    mActionBar.setIcon(drawableId);  
}


}

0
@Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        // When the given tab is selected, switch to the corresponding page in
        // the ViewPager.
        mViewPager.setCurrentItem(tab.getPosition());
        getActionBar().setTitle(tab.getText());//to change titile as per the current tab
        getActionBar().setIcon(tab.getIcon());//to change icon as per the current tab

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接