6

HorizontalScrollView in TabHost adding extra space at the end

 2 years ago
source link: https://www.codesd.com/item/horizontalscrollview-in-tabhost-adding-extra-space-at-the-end.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

HorizontalScrollView in TabHost adding extra space at the end

advertisements

In order to easily switch between fragments, I'm embedding a HorizontalScrollView into my Tab layout like so:

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

But after adding Fragments in my code (shown below) there suddenly shows up some extra whitespace at the end of the HorizontalScrollView:

Before scrolling

XbDaX.png

After scrolling

Qnc8T.png

The code is quite complex but I'll try to show the important parts.

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

Also unrelated, but I also have a problem where the first tab doesn't load manually (clicking tabs loads the Fragments perfectly, just the very first one doesn't load for some reason).


i think you are add manually tabhost like ..

@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 this code i add tab button on manually and its load on fragment.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK