如何更改 viewpager 中每个片段的点指示器(活动和非活动)的颜色?

Posted

技术标签:

【中文标题】如何更改 viewpager 中每个片段的点指示器(活动和非活动)的颜色?【英文标题】:How to change the color of dots indicator (both active and inactive) per fragment in viewpager? 【发布时间】:2020-11-06 21:49:46 【问题描述】:

A picture of what I'm trying to achieve

我已经使用 XML 设置了点指示器的活动和非活动状态的颜色。但是,我对如何更改每个屏幕的活动和非活动状态的颜色感到非常困惑,如图所示。 我已经使用片段和 viewpager 创建了布局,并添加了一个 tablayout。

MainActivity.kt

class MainActivity : AppCompatActivity() 
    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val adapter = MyViewPagerAdapter(supportFragmentManager)
        adapter.addFragment(TakeFragment())
        adapter.addFragment(UploadFragment())
        adapter.addFragment(PaidFragment())
        viewPager.adapter = adapter
        tab_layout.setupWithViewPager(viewPager)

    

    class MyViewPagerAdapter(fragmentManager: FragmentManager) : FragmentPagerAdapter(fragmentManager)

        val fragmentList : MutableList<Fragment> = ArrayList()

        override fun getItem(position: Int): Fragment 
            return fragmentList[position]
        

        override fun getCount(): Int 
            return fragmentList.size
        

        fun addFragment(fragment: Fragment)
            fragmentList.add(fragment)
        
    

activity_main.xml

    <FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/frag_container"
        android:layout_
        android:layout_
        tools:context=".MainActivity">

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/viewPager"
        android:layout_
        android:layout_>

        <com.google.android.material.tabs.TabLayout
            android:id="@+id/tab_layout"
            android:layout_
            android:layout_
            android:background="#00000000"
            app:tabBackground="@drawable/tab_selector"
            app:tabGravity="center"
            app:tabIndicatorHeight="0dp" />

    </androidx.viewpager.widget.ViewPager>

</FrameLayout>

tab_selector.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/selected_dot"
        android:state_selected="true"/>

    <item android:drawable="@drawable/default_dot"/>
</selector>

selected_dot.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape
            android:innerRadius="0dp"
            android:shape="ring"
            android:thickness="8dp"
            android:useLevel="false">
            <solid android:color="#8EBFE8"/>
        </shape>
    </item>
</layer-list>

default_dot.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape
            android:innerRadius="0dp"
            android:shape="ring"
            android:thickness="8dp"
            android:useLevel="false">
            <solid android:color="#AAD6F9"/>
        </shape>
    </item>
</layer-list>

【问题讨论】:

参考这个-->droidmentor.com/create-onboard-screens-using-viewpager 【参考方案1】:

为了简单起见,假设您已经实现了 ViewPager.OnPageChangeListener

@Override
    public void onPageSelected(int i) 
        Log.v(TAG, " ++++++++    onPageSelected:  " + i);
        mViewPager.setCurrentItem(i);

        //TODO You can use this position: to write other dependent logic
        if (i == 0) 
            System.out.println("0");
            mImv1.setBackgroundResource(R.drawable.activate_one);
            mImv2.setBackgroundResource(R.drawable.default_one);

         else 
            System.out.println("1");
            mImv1.setBackgroundResource(R.drawable.default_one);
            mImv2.setBackgroundResource(R.drawable.activate_one);
        

    

【讨论】:

嘿,这里的mImv1和mImv2是什么? 有没有办法在不使用 2 个单独的可绘制对象的情况下更改它的颜色?【参考方案2】:
private int dotsCount;
private ImageView[] dots;

private void addViewPagerDots() 

    dotsCount = viewPagerAdapter.getCount();
    dots = new ImageView[dotsCount];

    for (int i = 0; i < dotsCount; i++) 
        dots[i] = new ImageView(this);
        dots[i].setImageDrawable(getResources().getDrawable(R.drawable.default_dot));

        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT
        );

        params.setMargins(5, 0, 5, 0);

        final int presentPosition = i;
        dots[presentPosition].setOnTouchListener(new View.OnTouchListener() 
            @Override
            public boolean onTouch(View v, MotionEvent event) 
                viewPager.setCurrentItem(presentPosition);
                return true;
            

        );
        dotsLayout.addView(dots[i], params);
    
    dots[0].setImageDrawable(getResources().getDrawable(R.drawable.selected_dot));



【讨论】:

以上是关于如何更改 viewpager 中每个片段的点指示器(活动和非活动)的颜色?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 viewPager 中使用按钮更改页面?

检测片段内的 ViewPager 选项卡更改

检测片段内的 ViewPager 选项卡更改

如何在 viewpager 每个项目的片段底部添加动作布局

在popBackStack之后,ViewPager中的碎片不是显示器

如何更新 Tablayout 中的片段? (Viewpager2, FragmentStateAdapter)