2017-01-27 13 views
7

मैं एंड्रॉयड TabLayoutTabLayout हटाने अनावश्यक स्क्रॉल

import android.support.design.widget.TabLayout; 

To see what's going on, look at this gif

जब मैं बाईं ओर सबसे महत्वपूर्ण टैब और फिर दाईं ओर के टैब स्क्रॉल और सबसे महत्वपूर्ण टैब का चयन के साथ मुश्किल समस्या आई थी दाईं ओर, टैबलाउट पहले मुझे बाएं टैब को फिर से दिखाता है और फिर दाईं ओर चयनित टैब पर स्क्रॉल करता है।

private void setStartingSelection(ViewPager viewPager, ProductsPagerAdapter adapter) { 
     int tabPosition=0; 
     for(int i = 0 ; i < adapter.getCount(); i++){ 
      String title = (String) adapter.getPageTitle(i); 
      if(title.equals(selectedCategory.getName())){ 
       tabPosition=i; 
       break; 
      } 
     } 
     viewPager.setCurrentItem(tabPosition); 
    } 

मुझे आशा है कि इस मदद करता है: यहाँ मेरी सेटअप कोड

void setupTabs(ViewPager viewPager, TabLayout tabLayout) { 
     ProductsPagerAdapter adapter = new ProductsPagerAdapter(getChildFragmentManager(), rootCategory.getChildCategories()); 
     viewPager.setAdapter(adapter); 
     tabLayout.setupWithViewPager(viewPager); 

     setStartingSelection(viewPager, adapter); 


    } 

    private void setStartingSelection(ViewPager viewPager, ProductsPagerAdapter adapter) { 
     for(int i = 0 ; i < adapter.getCount(); i++){ 
      String title = (String) adapter.getPageTitle(i); 
      if(title.equals(selectedCategory.getName())){ 
       viewPager.setCurrentItem(i); 
       break; 
      } 
     } 
    } 

और लेआउट

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:fitsSystemWindows="true" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="@color/toolbar_color" 
      app:navigationIcon="@drawable/ic_back_white" 
      app:title="@string/title_transport" 
      app:titleTextColor="@color/title_color"/> 


     <android.support.design.widget.TabLayout 
      android:id="@+id/tab_layout" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      app:tabMode="scrollable" 
      app:tabTextColor="@color/white" 
      app:tabIndicatorColor="@color/tab_indicator" 
      app:tabGravity="fill"/> 

    </android.support.design.widget.AppBarLayout> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="0px" 
     android:layout_weight="1" 
     android:background="@android:color/white" /> 

</LinearLayout> 
+0

' AppBarLayout' होना चाहिए कर सकते हैं! https://developer.android.com/reference/android/support/design/widget/AppBarLayout.html – Mohsen

+0

मैंने इसे बदलने की कोशिश की, लेकिन यह – RexSplode

+0

कुछ भी नहीं बदलेगा यदि आप setupTabs में setStartingSelection विधि के कॉल में टिप्पणी करते हैं, तो करता है समस्या अभी भी बनी हुई है? –

उत्तर

0

बहुत सारी खोज के बाद मुझे समझ में आया कि मुझे एक और घटक चाहिए जो टैबलाउट की तरह दिखेगा, लेकिन टैबलाउट नहीं होगा। तो मैंने ViewPagerIndicator का उपयोग किया।

यह टैबलाउट के समान ही है, हालांकि इसमें टैबलेआउट में मौजूद शांत चयन एनिमेशन और चयनित टैब सूचक एनिमेशन की कमी है। यह टैब फिट करने के लिए पाठ का आकार भी बदलता नहीं है, जो अच्छा है, और यह टेक्स्ट को फिट करने के लिए टैब का आकार बदलता नहीं है, जो खराब है (मुझे पता है कि सभी स्टाइल पैरामीटर की कोशिश की गई है - यह पाठ को लपेट नहीं सकता है)।

लेकिन यह टैब को ठीक और अतिरिक्त स्क्रॉलिंग के बिना चुनता है। दुर्भाग्यवश एंड्रॉइडअर्सनल में समाधान नहीं होते हैं, जो उससे बेहतर होते हैं (कम से कम जब मैंने खोज नहीं की थी)।

0

बदलें नीचे के रूप में अपने विधि है।

+0

आइटम चुनते हैं तो यह विजेट स्क्रॉल करता है, मुझे खेद है, लेकिन मुझे डर है कि प्रारंभिक चयन सेट करने से यहां कोई मदद नहीं मिलती है। यह स्क्रॉलिंग न केवल पहली बार दिखाई देती है, लेकिन हर बार जब आप टैब स्क्रॉल करते हैं और उनमें से एक का चयन करते हैं – RexSplode

1

वास्तव में आप स्क्रॉलिंग समस्या से निपट रहे हैं। हाँ। बात यह है कि, टैबलाउट क्षैतिज स्क्रॉलव्यू बढ़ाता है। इस तरह कुछ कोशिश करें।

public class CustomTabLayout extends TabLayout { 

public CustomTabLayout(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    init(context); 
} 

public CustomTabLayout(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(context); 
} 

public CustomTabLayout(Context context) { 
    super(context); 
    init(context); 
} 

void init(Context ctx){ 

} 

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    // Do not allow touch events. 
    return false; 
} 

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    // Do not allow touch events. 
    return false; 
} 

} 
+0

बात यह है कि, यदि मैं इन तरीकों को ओवरराइड करता हूं, तो मुझे अपने लिए सभी चयन और स्क्रॉल व्यवहार को लागू करना होगा। और यह प्रदान करना कि अधिकांश टैबलाउट विधियां निजी हैं, इस दृष्टिकोण को प्रतिबिंब एपीआई का भी उपयोग करना होगा। लेकिन यह एक संभावना है हालांकि। – RexSplode

2

आप हालांकि इस कोड

tabLayout.setupWithViewPager(viewPager); 
    // little hack to prevent unnecessary tab scrolling 
    tabLayout.clearOnTabSelectedListeners(); 
    tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 
      viewPager.setCurrentItem(tab.getPosition(), false); 
     } 

     @Override 
     public void onTabUnselected(TabLayout.Tab tab) { } 

     @Override 
     public void onTabReselected(TabLayout.Tab tab) { } 
    }); 

`CoordinatorLayout` का एक सीधा बच्चे की कोशिश या आप भी अंतिम पंक्ति के लिए सीधे यह कर सकते हैं

tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(viewPager) { 
    @Override 
    public void onTabSelected(TabLayout.Tab tab) { 
     viewPager.setCurrentItem(tab.getPosition(), false); 
    } 
}); 
+0

धन्यवाद, यह पूरी तरह से काम किया। –

संबंधित मुद्दे