9

, ben şöyle benim Tab düzeni içine bir HorizontalScrollView gömme ediyorum ucunda fazladan yer ekleyerekTabHost içinde HorizontalScrollView kolayca parçalara arasında geçiş yapmak amacıyla

Before scrolling

kaydırma önce:) orada aniden HorizontalScrollView sonunda bazı ekstra boşluk gösterir

After scrolling

kaydırma sonra kod oldukça karmaşıktır ama önemli bölümlerini göstermeye çalışırız.

{ 
    mTabHost = (TabHost) childLayout.findViewById(android.R.id.tabhost); 
    mTabHost.setup(); 
    FrameLayout tabsFL = (FrameLayout) childLayout.findViewById(android.R.id.tabcontent); 
    tabsFL.setId(TABS_FRAME_ID); 

    for (int i = 0; i < list.size(); i++) { 
     mTabHost.addTab(newTab(String.valueOf(i), list.get(i).getTitle(), tabsFL.getId())); 
    } 

    mTabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() { 
     @Override 
     public void onTabChanged(String tabId) { 
     updateTab(tabId, Integer.parseInt(tabId), list); 
     } 
    }); 

    //manually load first fragment 
    mTabHost.setCurrentTab(mCurrentTab); 
    updateTab(String.valueOf(mCurrentTab), mCurrentTab, list); 
} 


private TabSpec newTab(String tag, String tabLabel, int tabContentId) { 
    int count = Integer.parseInt(tag); 
    count +=1; 

    View indicator = inflater.inflate(R.layout.details_tab, 
     (ViewGroup) childLayout.findViewById(android.R.id.tabs), false); 
    ((TextView) indicator.findViewById(R.id.text)).setText(count + ". " + tabLabel); 

    TabSpec tabSpec = mTabHost.newTabSpec(tag); 
    tabSpec.setIndicator(indicator); 
    tabSpec.setContent(tabContentId); 
    return tabSpec; 
} 

private void updateTab(String tabId, int id, ArrayList<CustomObject> frags) { 
    mCurrentTab = id; 

    FragmentManager fm = activity.getSupportFragmentManager(); 
    fm.beginTransaction() 
     .replace(TABS_FRAME_ID, DetailsFragment.newInstance(frags.get(id)), tabId) 
     .commitAllowingStateLoss(); 
} 
Ayrıca

ilgisiz, ama aynı zamanda ilk sekme elle yüklemez bir sorun var (sekmeleri tıklayarak sadece çok ilki nedense yüklemez, mükemmel Fragments yükler).

+0

: fillViewport =' 'HorizontalScrollView' içinde, bir örneği için çıkarmak için "doğru" denemek ve bunun işe yaradığını gör. Hem 'HorizontalScrollView' hem de 'TabWidget' 'android: layout_height = "wrap_content" ', yani' fillViewport 'nedeni olabilir. – g00dy

+0

Maalesef bunu denedim ve farketmedi. Belki de yanlışlıkla ek (görünmez?) Bir sekme eklediğimi düşündüm, ancak bunun log deyimleriyle nerede olabileceğini bulamıyorum. –

+0

Belki de içinde 'tabsFL' var? Bilmiyorum, ama belki de belki de son Sekme yarısı görünmez, çeneni de o kadar :) – g00dy

cevap

0

ben bu kodda

@SuppressLint("ResourceAsColor") 
public class MainActivity extends FragmentActivity implements 
    OnTabChangeListener, OnPageChangeListener { 

MyPageAdapter pageAdapter; 
private ViewPager mViewPager; 
private TabHost mTabHost; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

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

    // Tab Initialization 
    initialiseTabHost(); 

    // Fragments and ViewPager Initialization 
    List<Fragment> fragments = getFragments(); 
    pageAdapter = new MyPageAdapter(getSupportFragmentManager(), fragments); 
    mViewPager.setAdapter(pageAdapter); 
    mViewPager.setOnPageChangeListener(MainActivity.this); 
} 

// Method to add a TabHost 
private static void AddTab(MainActivity activity, TabHost tabHost, 
     TabHost.TabSpec tabSpec) { 
    tabSpec.setContent(new MyTabFactory(activity)); 
    tabHost.addTab(tabSpec); 
} 

// Manages the Tab changes, synchronizing it with Pages 
public void onTabChanged(String tag) { 
    int pos = this.mTabHost.getCurrentTab(); 
    this.mViewPager.setCurrentItem(pos); 
    // mTabHost.getTabWidget().setDividerDrawable(null); 
    setSelectedTabColor(); 
} 

@Override 
public void onPageScrollStateChanged(int arg0) { 
} 

// Manages the Page changes, synchronizing it with Tabs 
@Override 
public void onPageScrolled(int arg0, float arg1, int arg2) { 
    int pos = this.mViewPager.getCurrentItem(); 
    this.mTabHost.setCurrentTab(pos); 
    // mTabHost.getTabWidget().setDividerDrawable(null); 
} 

@Override 
public void onPageSelected(int arg0) { 
} 

@SuppressLint("ResourceAsColor") 
private void setSelectedTabColor() { 
    for (int i = 0; i < mTabHost.getTabWidget().getChildCount(); i++) { 
     mTabHost.getTabWidget().setDividerDrawable(
       android.R.color.transparent); 
     TextView tv = (TextView) mTabHost.getTabWidget().getChildAt(i) 
       .findViewById(android.R.id.title); 
     tv.setTextColor(getResources().getColor(R.color.white)); 
     mTabHost.getTabWidget() 
       .setShowDividers(TabWidget.SHOW_DIVIDER_NONE); 
     mTabHost.getTabWidget().getChildAt(i) 
       .setBackgroundColor(R.drawable.bottom_home_back); 
     // mTabHost.getTabWidget().getChildAt(0).getLayoutParams().width = 
     // 50; 
    } 
    mTabHost.getTabWidget().getChildAt(mTabHost.getCurrentTab()) 
      .setBackgroundResource(R.drawable.btn_selected); 
    // mTabHost.getTabWidget().getChildAt(0).getLayoutParams().width = 50; 
} 

private List<Fragment> getFragments() { 
    List<Fragment> fList = new ArrayList<Fragment>(); 

    // TODO Put here your Fragments 
    // DealTab f1 = DealTab.newInstance(); 
    DealTab_New f1 = DealTab_New.newInstance(); 
    EventTab f2 = EventTab.newInstance(); 

    MyAccountFragment f3 = MyAccountFragment.newInstance(); 
    MessageFragment f4 = MessageFragment.newInstance(); 
    MoreFragment f5 = MoreFragment.newInstance(); 
    QrCodeFragment f6 = QrCodeFragment.newInstance(); 

    // fList.add(f1); 
    fList.add(f1); 
    fList.add(f2); 
    fList.add(f3); 
    fList.add(f4); 
    fList.add(f5); 
    fList.add(f6); 

    return fList; 
} 

// Tabs Creation 
@SuppressLint("ResourceAsColor") 
private void initialiseTabHost() { 
    mTabHost = (TabHost) findViewById(android.R.id.tabhost); 
    mTabHost.setup(); 

    // TODO Put here your Tabs 
    MainActivity.AddTab(
      this, 
      this.mTabHost, 
      this.mTabHost.newTabSpec("Tab1").setIndicator(
        "", 
        getApplicationContext().getResources().getDrawable(
          R.drawable.btn_deals))); 


    MainActivity.AddTab(
      this, 
      this.mTabHost, 
      this.mTabHost.newTabSpec("Tab2").setIndicator(
        "", 
        getApplicationContext().getResources().getDrawable(
          R.drawable.btn_event))); 
    MainActivity.AddTab(
      this, 
      this.mTabHost, 
      this.mTabHost.newTabSpec("Tab3").setIndicator(
        "", 
        getApplicationContext().getResources().getDrawable(
          R.drawable.btn_my_account))); 
    MainActivity.AddTab(
      this, 
      this.mTabHost, 
      this.mTabHost.newTabSpec("Tab4").setIndicator(
        "", 
        getApplicationContext().getResources().getDrawable(
          R.drawable.btn_message))); 
    MainActivity.AddTab(
      this, 
      this.mTabHost, 
      this.mTabHost.newTabSpec("Tab5").setIndicator(
        "", 
        getApplicationContext().getResources().getDrawable(
          R.drawable.btn_more))); 

    mTabHost.setOnTabChangedListener(this); 

    setSelectedTabColor(); 
} 
} 

i fragmanı üzerinde elle ve yüke sekme düğmesi eklemek .. sizin gibi TabHost elle ekleyebilir düşünüyorum.

0

TabWidget, varsayılan olarak true değerine ayarlanmış olan measureWithLargestChild değerine sahiptir; bu, tabWidget'ın kendisini ölçtüğünde kullandığı dahili LinearLayout öğesinin toplam genişliğini hesaplamak için sekmelerinizin en genişini kullandığı anlamına gelir. Sekmeleriniz farklı uzunluklardaysa, bu, kısa çizgileri ve en geniş sekmesi arasındaki farktan dolayı biraz daha fazla alana sahip olan iç LinearLayout'a yol açacaktır. TabWidget düzeninize android:measureWithLargestChild="false" eklerseniz, sorununuzu çözmelidir.

tl; dr için düzeniniz TabWidget değiştirin:

Bunun nedeni `android olabilir
<TabWidget android:id="@android:id/tabs" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:measureWithLargestChild="false"> 
</TabWidget>