9

Aby łatwo przełączać się między fragmentami, jestem osadzanie HorizontalScrollView do mojego układu Tab tak:HorizontalScrollView w TabHost dodanie dodatkowej przestrzeni na końcu

<?xml version="1.0" encoding="utf-8"?> 
<TabHost xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/tabhost" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <HorizontalScrollView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:fillViewport="true" 
      android:scrollbars="none" > 

      <TabWidget android:id="@android:id/tabs" 
       android:layout_height="wrap_content" 
       android:layout_width="wrap_content"> 
      </TabWidget> 
     </HorizontalScrollView> 
     <FrameLayout 
      android:id="@android:id/tabcontent" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 
    </LinearLayout> 
</TabHost> 

Ale po dodaniu Fragments w moim kodu (pokazane poniżej) tam nagle pojawia się dodatkowe spacje na końcu HorizontalScrollView:

Przed przewijanie

Before scrolling

Po przewijanie

After scrolling

Kod jest dość skomplikowane, ale postaram się pokazać ważnych części.

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

również niepowiązane, ale ja też mam problem gdzie pierwsza zakładka nie jest ładowany ręcznie (kliknięcie zakładki ładuje Fragmenty doskonale, po prostu bardzo pierwsza nie ładuje z jakiegoś powodu).

+0

To może być ze względu na 'android: fillViewport = "true"' w 'HorizontalScrollView', spróbuj usunąć je za przykład i sprawdź, czy to działa. Zarówno 'HorizontalScrollView' jak i' TabWidget' mają 'android: layout_height =" wrap_content "', więc powodem może być 'fillViewport'. – g00dy

+0

Niestety, próbowałem tego i nie miało to żadnego znaczenia. Pomyślałem, że może przypadkowo dodaję dodatkową (niewidoczną?) Zakładkę, ale nie mogę znaleźć, gdzie to może się dziać z wyciągami z dziennika. –

+0

Może jest w środku 'tabsFL'? Nie wiem, ale być może ostatnia Taba jest na wpół niewidoczna, to też się czuje :) – g00dy

Odpowiedz

0

myślę, że jesteś dodać ręcznie tabhost jak ..

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

w tym kodzie i dodać przycisk tabulatora ręcznie i jego ładunku na fragmencie.

0

TabWidget ma domyślnie wartość measureWithLargestChild na true, co oznacza, że ​​używa najszerszej z kart do obliczenia całkowitej szerokości wewnętrznego LinearLayout, którego używa TabWidget, gdy się mierzy. Jeśli twoje zakładki mają różną długość, spowoduje to, że wewnętrzny LinearLayout będzie miał dodatkową przestrzeń na końcu od różnicy między krótszymi zakładkami i najszerszą zakładką. Jeśli dodasz android:measureWithLargestChild="false" do układu TabWidget, powinno to rozwiązać twój problem.

tl; dr Zmień układ TabWidget do:

<TabWidget android:id="@android:id/tabs" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:measureWithLargestChild="false"> 
</TabWidget> 
Powiązane problemy