Android: ViewPager — PagerSlidingTabStrip, пользовательский фон вкладки на state_selected

#android #android-viewpager #pagerslidingtabstrip

#Android #android-viewpager #pagerslidingtabstrip

Вопрос:

Мне нужно использовать пользовательский фон для каждой вкладки, когда каждая из них находится в режиме state_selected. Но все равно ничего не происходит, когда я выбираю вкладку.

Я использовал селектор следующим образом: (tab_selector.xml )

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

И это activity_main.xml:

 <com.astuetz.PagerSlidingTabStrip
    android:id="@ id/tabs"
    android:layout_width="match_parent"
    android:layout_height="48dip"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:background="@drawable/tab_back"
    app1:pstsTabBackground="@drawable/tab_selector"
    app1:pstsIndicatorColor="#00FFFFFF"
    app1:pstsShouldExpand="true" />

<android.support.v4.view.ViewPager
    android:id="@ id/pager"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@ id/tabs"
    tools:context=".MainActivity" />
 

Как очевидно, я использую PagerSlidingTabStrip от astuetz.
И вот как я использую ViewPager и PagerSlidingTabStrip:

 final PagerSlidingTabStrip tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);
viewPager = (ViewPager) findViewById(R.id.pager);
viewPager.setAdapter(mainPagerAdapter);
tabs.setTextColor(Color.WHITE);
tabs.setViewPager(viewPager);

    viewPager.setOnPageChangeListener(new OnPageChangeListener() {
    @Override
    public void onPageSelected(int position) {
        tabs.setViewPager(viewPager);
    }
 

Я пытался смешивать разные состояния и переставлять их, но все равно не работает.
Я попытался поместить определенную вкладку в выбранный режим, но я не мог понять это.

Ответ №1:

Я понял это сам, но не стандартным способом! Поскольку мне нужен был градиентный фон на выбранной вкладке, я использовал индикатор и подчеркивание следующим образом:

 <com.astuetz.PagerSlidingTabStrip
    android:id="@ id/tabs"
    android:layout_width="match_parent"
    android:layout_height="48dip"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:background="@drawable/tab_back"
    app1:pstsUnderlineHeight="24dip"
    app1:pstsIndicatorHeight="48dip"
    app1:pstsIndicatorColor="#e7e7e7"
    app1:pstsShouldExpand="true" />
 

Комментарии:

1. Эй, я хочу сделать то же самое, но не понимаю, что такое app1??

2. Вы можете использовать это для настройки свойств этой библиотеки. Я использовал это много недель назад, но я думаю, что для того, чтобы иметь более одного элемента, вам следует использовать app2, app3 и так далее. PagerSlidingTabStrip-Настройка

3. @FarzadDev, ты знаешь, как поместить разные изображения на каждую вкладку? xml Настройка pstsTabBackground для использования файла выбора вкладок будет использовать только одно изображение. Не могу понять, как получить 4 разных чертежа для перехода на мои 4 вкладки. Спасибо, если вы знаете.

Ответ №2:

Только для тех, кто ищет ответ, не используя раздвоенную полосу вкладок PageSliding.

Для проблемы с селектором вы можете установить OnPageChangeListener на TabStrip с помощью CustomOnPageChangeListener и установить selected_state кнопки внутри TabStrip на «true»

Вот мой CustomOnPageChangeListener

 private class CustomOnPageChangeListenner implements ViewPager.OnPageChangeListener{

    private PagerSlidingTabStrip tabStrip;
    private int previousPage=0;
    //Constructor initiate with TapStrip
    //
    public CustomOnPageChangeListenner(PagerSlidingTabStrip tab){
        tabStrip=tab;
        //Set the first image button in tabStrip to selected,
        ((LinearLayout)tabStrip.getChildAt(0)).getChildAt(0).setSelected(true);
    }
    @Override
    public void onPageScrolled(int i, float v, int i2) {

    }

    @Override
    public void onPageSelected(int i) {
        //set the previous selected page to state_selected = false
        ((LinearLayout)tabStrip.getChildAt(0)).getChildAt(previousPage).setSelected(false);
        //set the selected page to state_selected = true
        ((LinearLayout)tabStrip.getChildAt(0)).getChildAt(i).setSelected(true);
        //remember the current page
        previousPage=i;
    }

    @Override
    public void onPageScrollStateChanged(int i) {

    }
}
 

А затем вы устанавливаете этот пользовательский прослушиватель на свою полосу вкладок

 PagerSlidingTabStrip tabStrip;
tabStrip.setOnPageChangeListener(new CustomOnPageChangeListenner(tabStrip));
 

Комментарии:

1. Ваш обрезанный не работает, брат. NPE в ((LinearLayout)TabStrip.getChildAt(0)).getChildAt(0)

Ответ №3:

Я вызываю PagerSlidingTabStrip.setOnPageChangeListener и не viewPager.setOnPageChangeListener

Это работает для меня.