9

Al fine di passare facilmente tra i frammenti, che sto incorporando un HorizontalScrollView nel mio layout Tab in questo modo:HorizontalScrollView in TabHost aggiunta di spazio aggiuntivo sulla fine

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

Ma dopo l'aggiunta di frammenti nel mio codice (indicato di seguito) ci mostra un tratto un po 'di spazi extra alla fine del HorizontalScrollView:

prima di scorrere

Before scrolling

Dopo lo scorrimento

After scrolling

Il codice è piuttosto complesso, ma cercherò di mostrare le parti più importanti.

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

Inoltre estranei, ma anche un problema in cui la prima scheda non viene caricato manualmente (cliccando linguette carica Frammenti perfettamente, solo il primo in assoluto non carica per qualche motivo).

+0

Questo può essere a causa del 'Android: fillViewport = "true"' 'nella HorizontalScrollView', provare a rimuoverlo per un'istanza e vedi se funziona. Sia 'HorizontalScrollView' che' TabWidget' hanno 'android: layout_height =" wrap_content "', quindi il 'fillViewport' potrebbe essere il motivo. – g00dy

+0

Purtroppo l'ho provato e non ha fatto differenza. Ho pensato forse di aggiungere accidentalmente una scheda aggiuntiva (invisibile?), Ma non riesco a trovare dove ciò potrebbe accadere con le dichiarazioni di registro. –

+0

Forse è all'interno di 'tabsFL'? Non lo so, ma forse anche l'ultimo Tab è mezzo invisibile, anche quello è un po ':) – g00dy

risposta

0

Penso che si sta aggiungere manualmente tabhost come ..

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

in questo codice i Pulsante scheda add on manualmente e il suo carico sul frammento.

0

TabWidget ha misuraWithLargestChild impostato su true per impostazione predefinita, il che significa che sta utilizzando la più ampia delle schede per calcolare la larghezza complessiva del LinearLayout interno utilizzato da TabWidget quando misura se stesso. Se le tue schede sono di lunghezza diversa, ciò porterà a LinearLayout interno che ha uno spazio extra alla fine rispetto alla differenza tra le schede più brevi e la scheda più larga. Se aggiungi android:measureWithLargestChild="false" al layout di TabWidget, dovrebbe risolvere il tuo problema.

tl; dr modificare il layout TabWidget a:

<TabWidget android:id="@android:id/tabs" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:measureWithLargestChild="false"> 
</TabWidget> 
Problemi correlati