9

आदेश आसानी से टुकड़े के बीच स्विच करने के लिए, मैं बहुत तरह मेरे टैब लेआउट में एक HorizontalScrollView embedding हूँ: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> 

लेकिन मेरे कोड में टुकड़े जोड़ने के बाद (नीचे दिखाया गया

स्क्रॉल

Before scrolling

से पहले:) वहाँ अचानक HorizontalScrollView के अंत में कुछ अतिरिक्त व्हाइट दिखाता है

स्क्रॉल

After scrolling

के बाद कोड काफी जटिल है, लेकिन मैं महत्वपूर्ण भागों दिखाने का प्रयास करेंगे।

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

इसके अलावा असंबंधित, लेकिन मैं भी एक समस्या है, जहां पहले टैब मैन्युअल रूप से लोड नहीं करता है (टैब पर क्लिक टुकड़े पूरी तरह से लोड करता है, बस बहुत पहले एक किसी कारण से लोड नहीं करता है)।

+0

यह 'एंड्रॉयड की वजह से हो सकता है: fillViewport =" true "' 'HorizontalScrollView' में, एक उदाहरण के लिए इसे हटाने के लिए कोशिश करते हैं और देखें कि यह काम करता है या नहीं। 'क्षैतिज स्क्रॉलव्यू' और 'टैबविड्ज' दोनों में 'android: layout_height =" wrap_content "है, इसलिए' fillViewport' कारण हो सकता है। – g00dy

+0

दुर्भाग्य से मैंने कोशिश की और इससे कोई फर्क नहीं पड़ता। मैंने सोचा कि शायद मैं गलती से अतिरिक्त (अदृश्य?) टैब जोड़ रहा हूं, लेकिन यह नहीं पता कि लॉग स्टेटमेंट के साथ यह कहां हो सकता है। –

+0

शायद यह 'टैबएसएफएल' के अंदर है? मुझे नहीं पता, लेकिन शायद आखिरी टैब आधा अदृश्य है, एक भी चेक करें :) – g00dy

उत्तर

0

मैं आप मैन्युअल रूप से जोड़ रहे हैं की तरह लगता है 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(); 
} 
} 
इस कोड में

मैं स्वयं और टुकड़ा पर अपनी लोड पर टैब बटन जोड़ें।

0

टैबविड्ज में माप हैथथर्जेस्ट चाइल्ड डिफ़ॉल्ट रूप से सत्य पर सेट है, जिसका अर्थ है कि यह आंतरिक टैबरलाइट की समग्र चौड़ाई की गणना करने के लिए आपके टैब के सबसे बड़े पैमाने पर उपयोग कर रहा है, जो टैबविड्ज स्वयं को मापने पर उपयोग करता है। यदि आपके टैब अलग-अलग लंबाई के हैं, तो इससे छोटे टैब और आपके सबसे बड़े टैब के बीच के अंतर से अंत में कुछ अतिरिक्त स्थान होने के कारण आंतरिक लाइनरलाइट होगा। यदि आप अपने टैबविड्ज लेआउट में android:measureWithLargestChild="false" जोड़ते हैं तो इसे आपकी समस्या का समाधान करना चाहिए।

tl; डॉ करने के लिए अपने लेआउट TabWidget बदलें:

<TabWidget android:id="@android:id/tabs" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:measureWithLargestChild="false"> 
</TabWidget> 
संबंधित मुद्दे