Android-具有自定义视图标签的Tablayout-无法应用可绘制选择器 [英] Android - tablayout with custom view tabs - drawable selector cannot be applied

查看:162
本文介绍了Android-具有自定义视图标签的Tablayout-无法应用可绘制选择器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在gradle中使用编译'com.android.support:design:25.3.1'在tablayout中设置自定义标签.

I am trying to set up custom tabs in a tablayout using compile 'com.android.support:design:25.3.1' in gradle.

我想使用选择器,以便在单击选项卡时会根据其状态进行更改.

I want to use selectors so that when a tab is clicked it changes based on its state.

所以我尝试了以下失败的事情:

So I've tried the following unsuccessfully :

这是我的活动xml:

<ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:background="@color/white"/>

<android.support.design.widget.TabLayout
    android:id="@+id/tabLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:tabMode="fixed"
    app:tabGravity="fill"
    style="@style/MyCustomTabLayout"
    />

这是我用于tabLayout的样式:

here is the style i use for the tabLayout:

<style name="MyCustomTabLayout" parent="Widget.Design.TabLayout">
       <item name="tabIndicatorColor">@android:color/transparent</item>
   </style>

隐藏下划线.

这是我的主页标签的选择器之一:

here is one of my selectors for my home tab:

这是我对每个标签的自定义视图:

here is the custom view i have for each tab:

<ImageView
    android:id="@+id/iv_imgview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    tools:src="@drawable/home_tab_selector"

    />

<TextView
    android:id="@+id/tv_tab_name"
    android:layout_gravity="center"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    tools:text="HOME"
    />

这是创建布局的代码部分:

and here is the portion of code that creates the tablayout:

for (int i = 0; i < NUM_OF_TABS; i++)
           tabLayout.addTab(tabLayout.newTab());

       adapter = new LandingPagerAdapter(getApplicationContext(),getSupportFragmentManager(), tabLayout.getTabCount());

       //Adding adapter to pager
       viewPager.setAdapter(adapter);

       tabLayout.addOnTabSelectedListener(this);
       tabLayout.setupWithViewPager(viewPager);

       // Iterate over all tabs and set the custom view
       for (int i = 0; i < tabLayout.getTabCount(); i++) {
           TabLayout.Tab tab = tabLayout.getTabAt(i);
           tab.setCustomView(adapter.getTabView(i));
       }

       tabLayout.getTabAt(0).select();

最后是负责应用选择器和自定义视图的getTabView方法:

and finally here is the getTabView method responsible for applying the selector and custom view:

public class LandingPagerAdapter extends FragmentStatePagerAdapter {

    private final Context context;
    //integer to count number of tabs
    int tabCount;
    private Fragment mCurrentFragment;

    private String[] tabTitles = new String[]{"Home", "tab2"};

    // configure tab icons
    int[] imageTabResId = {
            R.drawable.home_tab_selector,
            R.drawable.tab_two_selector,;

    //Constructor to the class
    public LandingPagerAdapter(Context context, FragmentManager fm, int tabCount) {
        super(fm);
        this.context = context;
        this.tabCount = tabCount;
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                TabHomeContainerFragment tab1 = new TabHomeContainerFragment();
                return tab1;
            case 1:
                TabTwoContainerFragment tab2 = new TabTwoContainerFragment();; //Todo: these should all be containers
                return tab2;
            default:
                return null;
        }
    }

    //Overriden method getCount to get the number of tabs
    @Override
    public int getCount() {
        return tabCount;
    }

    public Fragment getCurrentFragment() {
        return mCurrentFragment;
    }

    @Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        if (getCurrentFragment() != object) {
            mCurrentFragment = ((Fragment) object);
        }
        super.setPrimaryItem(container, position, object);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return tabTitles[position];
    }

    public View getTabView(int position) {
        // Given you have a custom layout in `res/layout/custom_tab.xml` with a TextView and ImageView
        View v = LayoutInflater.from(context).inflate(R.layout.custom_landingpagetab, null);
        TextView tv = (TextView) v.findViewById(R.id.tv_tab_name);
        tv.setText(tabTitles[position]);
        ImageView img = (ImageView) v.findViewById(R.id.iv_imgview);
        img.setImageDrawable(ContextCompat.getDrawable(getApplicationContext(),imageTabResId[position]));
        return v;
    }

}

getTabView中的通知我正在将图像资源设置为类字段中数组中的选择器. 但我一直在测试的api 24上的设备上没有任何反应.

Notice in getTabView i am setting the image resource to be the selector in the array in the class field. but nothing happens on the device on api 24 i have been testing on.

推荐答案

我正在使用支持库27.1.1,并且遇到相同的问题.经过一些研究,我发现必须明确定义 state_selected .参见下面的代码:

I'm using support library 27.1.1 and facing the same problem. After some research I found that the state_selected must be defined clearly. See code below:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_chat_disabled" android:state_selected="false"/>
    <item android:drawable="@drawable/ic_chat_enabled" android:state_selected="true"/>
</selector>

android:state_selected ="false" 必须具有!

这篇关于Android-具有自定义视图标签的Tablayout-无法应用可绘制选择器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆