具有自定义视图的Tablayout在23.4.0 design lib

时间:2016-05-14 07:29:31

标签: android android-design-library android-tablayout

我正在将tablayout设置为我的viewpager。但是当我使用notifyDataSetChanged然后它删除我的自定义视图并显示默认标题视图 我的代码

 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没有显示我已经添加的自定义视图。它只显示默认标题..这个相同的代码工作  如果我使用     编译&#34; com.android.support:design:23.1.1&#34;

但如果我将此更改为较新版本,这不起作用请任何人帮助我尝试这个但是havnt得到ans或任何其他替代lib或方法,我可以在标签视图中添加customView

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我想我找到了一种解决方案:听取布局更改,如果customView为null,请再次设置:

(1,)

答案 2 :(得分: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"
        ... />

答案 3 :(得分:0)

我遇到了同样的问题,我通过在设置时设置TabLayout.setupWithViewPager(viewPager,false)来解决此问题(我目前正在使用版本24.1.0)。

更详细,老实说,我只看一下TabLayout类,并意识到删除标签的调用来自PagerAdapterObserver。当autoRefresh为真时设置的那个是女性TabLayout.setupWithViewPager(ViewPager viewPager)的默认值。

然后快速查看文档说:

  

如果autoRefresh为true,则会触发PagerAdapter中的任何更改   这种布局可以从适配器的标题中重新填充。

因此,应该更新文档,说明autoRefresh对于自定义视图应该为false,或者他们无法处理自定义视图。

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

答案 4 :(得分:0)

标签的高度固定为48dp。当您只有文本时,材料指南使用48dp,但如果您想要图标,则高度为72dp(选项卡指南)。因此,为了解决这个问题,我将TabLayout子类化并以这种方式覆盖onMeasure方法:

@Override protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec){     super.onMeasure(widthMeasureSpec,heightMeasureSpec);     super.setMeasuredDimension(widthMeasureSpec,         MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec),MeasureSpec.EXACTLY)); }

您还需要在xml中设置选项卡的高度。

机器人:layout_height =&#34; 72dp&#34;

这样它就能正常工作。