2012-09-04 5 views
1

나는 모든 것을 시도했지만 제대로 작동하지 않습니다. 이 주제에 관한 모든 관련 게시물을 읽었지만 havent는 해결책을 찾았습니다!ActionBarSherlock tabbar 텍스트 크기를 변경할 수 없습니다.

ActionBarSherlock을 사용하여 탭 막대 크기를 변경하고 싶습니다. 나는 액션 바를 바꿀 수 있었지만 그 아래의 탭 텍스트 (또는 그 탭 자체)는 바꿀 수 없었다.

<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; 

그리고 설정 : styles.xml에서

나는 (많은 시도 중 하나)가

setTheme(THEME); 

편집

super.onCreate(savedInstanceState); 

전 :

그냥 당신이 탭 + 호출기를 사용하는 경우 사용자가 탭 4.0보기를하지 않는 것을 깨달았다! 그 이유는 내가 ActionBarSherlock 테마를 통해 탭을 사용자 정의 할 수없는 이유를 설명합니다. 나는 4.1 장치에서 노력하고있었습니다. ActionBarSherlock 데모 앱을 다운로드하고 같은 결과를 얻었습니다.

누구나 수정 방법을 알고 계십니까?

답변

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) { 

    } 


} 

}, 다른 대안이

좀 hackish의
0

나는 마침내 좀 해킹 된 방식으로 내 문제를 해결했습니다. 지원 작업 표시 줄과 일반 탭 호스트를 추가 한 다음 원래 탭 호스트를 숨기고 뷰 페이지 및 지원 작업 표시 줄을 통해 서로 응답합니다. 아무도 관심이 경우

여기 코드는 다음과 같습니다

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 

    } 

} 

}

+0

없다? – lemon

+0

예, 거기에 =) 나는 그 해결책에 만족하지 않았습니다. 아래 답변을보십시오. – Thoast83

관련 문제