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

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

Я думаю, что вы добавили вручную 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> 
Intereting Posts
Как найти анимацию закончена игра в android Как определить, было ли отклонено уведомление? Во втором тесте getActivity () никогда не возвращается Почему два разных приложения, использующих aviary sdk, не установлены на одном устройстве? Почему onLoadFinished вызывается снова после возобновления фрагмента? Какова цель идентификатора элемента в Android ListView Adapter? Тип устарел Службы Google Play устарели. Требуется 11011000, но найдено 10289574 Как использовать службы WCF, зависящие от сеанса, с использованием Ksoap2-Android Закрытая акция Android Twitter по умолчанию закрыта Как сохранить положительные / отрицательные кнопки DialogFragment над мягкой клавиатурой Я должен дважды нажать кнопку, чтобы она работала Создание меню, но одна из двух кнопок не работает должным образом Crittercism Android – не всегда отправляет отчет о сбое на сервер Как проверить, существует ли база данных real.