2016-05-14 33 views
7

我設置tablayout到我的viewpager。但是當我使用notifyDataSetChanged然後刪除我的customview和顯示默認標題視圖 我的代碼Tablayout自定義視圖在23.4.0設計庫破碎

ViewPager viewPager = findView(R.id.view_pager); 
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager(), getResources(), getFragments()); 
    viewPager.setAdapter(adapter); 

    tabs.setupWithViewPager(viewPager); 
    for (int i = 0; i < tabs.getTabCount(); i++) { 
     TabLayout.Tab tab = tabs.getTabAt(i); 
     tab.setCustomView(getTabView(i)); 

    } 
    t.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      adapter.notifyDataSetChanged(); 
     } 
    }); 


    public View getTabView(int position) { 
    View v = LayoutInflater.from(this).inflate(R.layout.pager_tab, null); 
    RelativeLayout linearLayout = (RelativeLayout) v.findViewById(R.id.view); 



    return v; 
} 

所以其工作正常,但是當我打電話adapter.notifyDataSetChanged();然後我的tablayout不顯示customview,我已經添加prev。它只顯示默認標題..如果我使用 編譯「com.android.support:design:23.1.1」

但如果我將此更改爲新版本,這是行不通的,請任何一個幫我我嘗試這個,但havnt得到ans或任何其他替代庫或方法,我可以在標籤視圖中添加自定義視圖

回答

1

我想我找到了一種解決方案:聽佈局更改,如果customView爲null,設置它再次:

viewPager.addOnLayoutChangeListener(new ViewPager.OnLayoutChangeListener() { 
    @Override 
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
     for (int i = 0; i < tabLayout.getTabCount(); i++) { 
      if (tabLayout.getTabAt(i).getCustomView() == null) { 
       tabLayout.getTabAt(i).setCustomView(tabs[i]); 
      } 
     } 
    } 
} 
+0

但每次添加視圖是正確的?並且未刪除預視圖 – andro

0

我面臨同樣的問題,我通過設置TabLayout.setupWithViewPager(viewPager,false)當安裝(我目前正在使用版本24.1.0)。

對於更詳細的說明,老實說我只是看看TabLayout類,並意識到去除選項卡的調用來自PagerAdapterObserver。那一個是autoRefresh是真的女巫是默認值TabLayout.setupWithViewPager(ViewPager viewPager)

然後對文檔的快速瀏覽一下說:

如果自動刷新是真實的,在PagerAdapter的任何變化都會觸發 這個佈局從適配器的標題,以重新填充本身。

因此,無論是文檔應該更新說autoRefresh應爲false爲自定義視圖或他們未能照顧自定義視圖。

https://developer.android.com/reference/android/support/design/widget/TabLayout.html#setupWithViewPager(android.support.v4.view.ViewPager, boolean)

+0

嘗試將其設置爲false,但仍然得到相同的結果:( 我僅在從版本22更新到25時出現此問題012) – vida

1

爲了設置自定義視圖中創建或重建的標籤時,我們需要一個回調當這種情況發生。
TabLayout不允許在這種情況下調用偵聽器,但它暴露了方法TabLayout.newTab()

創建一個從TabLayout延伸並覆蓋newTab()的類,如下所示。

public class TabLayoutWithCustomTabView extends TabLayout { 
    public TabLayoutWithCustomTabView(Context context) { 
     super(context); 
    } 

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

    public TabLayoutWithCustomTabView(Context context, AttributeSet attrs, 
             int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @NonNull 
    @Override 
    public Tab newTab() { 
     final Tab tab = super.newTab(); 
     tab.setCustomView(inflate(getContext(), R.layout.custom_layout, null)); 
     return tab; 
    } 
} 

在佈局中,使用新的類,你有TabLayout

<com.example.TabLayoutWithCustomTabView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     ... /> 
+0

這是一個絕妙的答案。這將解決添加> 1其他視圖無法加載 – Silmarilos

+0

這個偉大的但我們如何設置標籤title.how獲取新標籤的索引創建,所以我們可以設置標題 – suulisin

2

可能是一個錯誤!並且我仍然在最新的25.2.0支持SDK上面臨這個問題

默認情況下,當更新viewpager時,tablayout被分配自動刷新。這可以是固定(解決方法)關閉自動刷新像在下面的代碼,

viewPager = (ViewPager) findViewById(R.id.viewpager); 
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 

setupViewPager(viewPager); 
tabLayout.setupWithViewPager(viewPager,false); // Do like this to disable auto refresh of tabs 
0

突出部的高度被固定到48dp。材料準則使用48dp當你只有文字,但如果你想要一個圖標的高度是72dp(選項卡準則)。因此,要解決它,我子類的TabLayout並以這種方式overrided onMeasure:

@覆蓋保護無效onMeasure(INT widthMeasureSpec,詮釋heightMeasureSpec){ super.onMeasure(widthMeasureSpec,heightMeasureSpec); super.setMeasuredDimension(widthMeasureSpec, )MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec),MeasureSpec.EXACTLY)); }

而且您還需要在xml中設置選項卡的高度。

機器人:layout_height = 「72dp」

,使其正常工作。