1

我已经尝试了一切,但我无法让它工作。我已阅读有关此主题的所有相关帖子,但尚未找到有效的解决方案!

我想使用 ActionBarSherlock 更改标签栏文本大小。我已经设法更改了操作栏,但没有更改下面的标签文本(或标签本身)。

在 styles.xml 我有(许多尝试之一):

<style name="ANM_Theme" parent="Theme.Sherlock">
<item name="actionBarTabTextStyle">@style/Theme_ActionBarText</item>
<item name="android:actionBarTabTextStyle">@style/Theme_ActionBarText</item>

<style name="Theme_ActionBarText" parent="Widget.Sherlock.ActionBar.TabText">
<item name="android:textColor">#fff</item>
<item name="android:textSize">6sp</item>

在我的活动中,我设置

public static int THEME = R.style.ANM_Theme;

接着

setTheme(THEME);

super.onCreate(savedInstanceState);

编辑:

刚刚意识到,当您使用 Tabs+Pager 时,您不会在选项卡上获得 4.0 外观!这说明了为什么我不能通过 ActionBarSherlock 主题自定义选项卡。我在 4.1 设备上尝试。下载了 ActionBarSherlock 演示应用程序并得到了相同的结果..

谁知道怎么修它?

4

2 回答 2

0
public class MainActivity extends SherlockFragmentActivity {
ViewPager  mViewPager;
TabsAdapter mTabsAdapter;

Button testButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ActionBar bar = getSupportActionBar();
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    mViewPager = (ViewPager)findViewById(R.id.pager);

    // Add the tabs
    mTabsAdapter = new TabsAdapter(this, bar, mViewPager);
    mTabsAdapter.addTab(bar.newTab().setText("First"),
            FragmentA.class, null);
    mTabsAdapter.addTab(bar.newTab().setText("Second"),
            FragmentB.class, null);
    mTabsAdapter.addTab(bar.newTab().setText("Third"),
            FragmentC.class, null);

    setTitle(R.string.app_name);

    if (savedInstanceState != null) {
        bar.setSelectedNavigationItem(savedInstanceState.getInt("tab"));
    }
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("tab", getSupportActionBar().getSelectedNavigationIndex());
}

@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {

    menu.add("Refresh")
        .setIcon(R.drawable.ic_action_refresh)
        .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

    SubMenu subMenu1 = menu.addSubMenu("Menu");
    subMenu1.add("Sample");
    subMenu1.add("Items");
    subMenu1.add("In menu");

    MenuItem subMenu1Item = (MenuItem) subMenu1.getItem();
    subMenu1Item.setIcon(R.drawable.ic_action_overflow);
    subMenu1Item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT);

    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(com.actionbarsherlock.view.MenuItem item) {
    String itemTitle  = (String) item.getTitle();

        if(!itemTitle.equals("Menu")){
            Toast toast = Toast.makeText(getApplicationContext(), itemTitle+" pressed", Toast.LENGTH_SHORT);
            toast.show();
        }


    if(item.getItemId() == android.R.id.home){
        getSupportFragmentManager().popBackStackImmediate();
    }
    return super.onOptionsItemSelected(item);

}



public static class TabsAdapter extends FragmentPagerAdapter
        implements ViewPager.OnPageChangeListener, ActionBar.TabListener {
    private final Context mContext;
    private final ActionBar mBar;
    private final ViewPager mViewPager;
    private FragmentActivity mActivity;
    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();

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

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

    public TabsAdapter(FragmentActivity activity, ActionBar bar, ViewPager pager) {
        super(activity.getSupportFragmentManager());
        mContext = activity;
        mActivity = activity;
        mBar = bar;
        mViewPager = pager;
        mViewPager.setAdapter(this);
        mViewPager.setOnPageChangeListener(this);

    }

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

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

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

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

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

    @Override
    public void onPageScrollStateChanged(int state) {
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        mActivity.getSupportFragmentManager().popBackStack();
        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) {

    }

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

    }


}

}

于 2012-12-01T12:53:21.250 回答
0

我终于以一种 hacky 的方式解决了我的问题。我添加了支持操作栏和常规标签主机,然后我隐藏了原始标签主机并让 viewpager 和支持操作栏相互响应。

如果有人感兴趣,这是代码:

public class MainActivity extends SherlockFragmentActivity {
TabHost mTabHost;
ViewPager  mViewPager;
TabsAdapter mTabsAdapter;
static ActionBar bar;
//public static int THEME = R.style.Theme_app;
@Override
protected void onCreate(Bundle savedInstanceState) {
    //setTheme(THEME); //Used for theme switching in samples
    super.onCreate(savedInstanceState);

    setContentView(R.layout.fragment_tabs_pager);


    mTabHost = (TabHost)findViewById(android.R.id.tabhost);
    mTabHost.setup();

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

    ActionBar.Tab tab1 = bar.newTab();
    ActionBar.Tab tab2 = bar.newTab();
    ActionBar.Tab tab3 = bar.newTab();
    ActionBar.Tab tab4 = bar.newTab();
    ActionBar.Tab tab5 = bar.newTab();


    tab1.setText("Home");
    tab2.setText("Learn");
    tab3.setText("Media");
    tab4.setText("Connect");
    tab5.setText("The Book");

    tab1.setTabListener(new MyTabListener());
    tab2.setTabListener(new MyTabListener());
    tab3.setTabListener(new MyTabListener());
    tab4.setTabListener(new MyTabListener());
    tab5.setTabListener(new MyTabListener());

    bar.addTab(tab1);
    bar.addTab(tab2);
    bar.addTab(tab3);
    bar.addTab(tab4);
    bar.addTab(tab5);

    mViewPager = (ViewPager)findViewById(R.id.pager);

    mTabsAdapter = new TabsAdapter(this, mTabHost, mViewPager);

    mTabsAdapter.addTab(mTabHost.newTabSpec("Home").setIndicator("Home"),
            FragmentStackSupport.CountingFragment.class, null);
    mTabsAdapter.addTab(mTabHost.newTabSpec("Learn").setIndicator("Learn"),
            FragB.FragBList.class, null);
    mTabsAdapter.addTab(mTabHost.newTabSpec("Media").setIndicator("Media"),
            FragC.FragCList.class, null);
    mTabsAdapter.addTab(mTabHost.newTabSpec("Connect").setIndicator("Connect"),
            FragD.FragDList.class, null);
    mTabsAdapter.addTab(mTabHost.newTabSpec("The Book").setIndicator("The Book"),
            FragE.FragEList.class, null);

    if (savedInstanceState != null) {
        mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
    }
    mTabHost.getTabWidget().getChildAt(0).setVisibility(View.GONE);
    mTabHost.getTabWidget().getChildAt(1).setVisibility(View.GONE);
    mTabHost.getTabWidget().getChildAt(2).setVisibility(View.GONE);
    mTabHost.getTabWidget().getChildAt(3).setVisibility(View.GONE);
    mTabHost.getTabWidget().getChildAt(4).setVisibility(View.GONE);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("tab", mTabHost.getCurrentTabTag());
}

/**
 * This is a helper class that implements the management of tabs and all
 * details of connecting a ViewPager with associated TabHost.  It relies on a
 * trick.  Normally a tab host has a simple API for supplying a View or
 * Intent that each tab will show.  This is not sufficient for switching
 * between pages.  So instead we make the content part of the tab host
 * 0dp high (it is not shown) and the TabsAdapter supplies its own dummy
 * view to show as the tab content.  It listens to changes in tabs, and takes
 * care of switch to the correct paged in the ViewPager whenever the selected
 * tab changes.
 */
public static class TabsAdapter extends FragmentPagerAdapter
        implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener {
    private final Context mContext;
    private final TabHost mTabHost;
    private final ViewPager mViewPager;
    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
    public static int tabPosition;

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

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

    static class DummyTabFactory implements TabHost.TabContentFactory {
        private final Context mContext;

        public DummyTabFactory(Context context) {
            mContext = context;
        }

        @Override
        public View createTabContent(String tag) {
            View v = new View(mContext);
            v.setMinimumWidth(0);
            v.setMinimumHeight(0);
            return v;
        }
    }

    public TabsAdapter(FragmentActivity activity, TabHost tabHost, ViewPager pager) {
        super(activity.getSupportFragmentManager());
        mContext = activity;
        mTabHost = tabHost;
        mViewPager = pager;
        mTabHost.setOnTabChangedListener(this);
        mViewPager.setAdapter(this);
        mViewPager.setOnPageChangeListener(this);
    }

    public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args) {
        tabSpec.setContent(new DummyTabFactory(mContext));
        String tag = tabSpec.getTag();

        TabInfo info = new TabInfo(tag, clss, args);
        mTabs.add(info);
        mTabHost.addTab(tabSpec);
        notifyDataSetChanged();
    }

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

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

    @Override
    public void onTabChanged(String tabId) {
        int position = mTabHost.getCurrentTab();
        mViewPager.setCurrentItem(position);
    }

    @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 = mTabHost.getTabWidget();

        widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
        mTabHost.setCurrentTab(position);
        bar.setSelectedNavigationItem(position);
        //widget.setDescendantFocusability(oldFocusability);
    }

    @Override
    public void onPageScrollStateChanged(int state) {
    }
}

private class MyTabListener implements ActionBar.TabListener
{

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        try {
            mViewPager.setCurrentItem(tab.getPosition());
        } catch (Exception e) {
            // TODO: handle exception
        }
        //
        // TODO Auto-generated method stub

    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

}

}

于 2012-09-05T07:45:31.737 回答