HorizontalScrollView в TabHost добавляет дополнительное пространство на конец

Чтобы легко переключаться между фрагментами, я встраиваю HorizontalScrollView в мой макет вкладки так:

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

Но после добавления фрагментов в моем коде (показано ниже) в конце HorizontalScrollView неожиданно появляется лишний пробел:

Перед прокруткой

Перед прокруткой

После прокрутки

После прокрутки

Код довольно сложный, но я постараюсь показать важные части.

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

Также не имеет отношения к делу, но у меня также есть проблема, когда первая вкладка не загружается вручную (щелчок вкладки отлично загружает Фрагменты, только по первому из них по какой-то причине не загружается).

Solutions Collecting From Web of "HorizontalScrollView в TabHost добавляет дополнительное пространство на конец"

Я думаю, что вы добавили вручную tabhost, как ..

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

В этом коде я добавляю кнопку вкладок вручную и свою нагрузку на фрагмент.

TabWidget имеет значение measureWithLargestChild по умолчанию, равное true, а это означает, что он использует самую широкую вкладку для вычисления общей ширины внутреннего LinearLayout, который использует TabWidget, когда он измеряет себя. Если ваши вкладки имеют разную длину, это приведет к тому, что внутренний LinearLayout будет иметь дополнительное пространство на конце от разницы между более короткими вкладками и самой широкой вкладкой. Если вы добавите android:measureWithLargestChild="false" в макет TabWidget, он должен решить вашу проблему.

Tl; dr Изменить свой макет TabWidget для:

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