Android选择器改变颜色但不改变大小

时间:2016-07-04 07:51:11

标签: android android-layout android-viewpager viewpagerindicator

我正在尝试使用选择器为ViewPager实现一个简单的点指示器。

当页面改变时,点应该改变颜色和大小,但它们只改变颜色,而尺寸保持不变。

选择器:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true">
        <shape android:shape="oval">
             <size
               android:height="12dp"
               android:width="12dp"/>
            <solid android:color="@color/highlight"/>
        </shape>
    </item>
    <item>
        <shape android:shape="oval">
            <size
              android:height="6dp"
              android:width="6dp"/>
            <solid android:color="@color/light_grey"/>
        </shape>
    </item>
</selector>

用于布局

<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:padding="@dimen/margin_2x"
  android:src="@drawable/dot_selector">
</ImageView>

在onCreate()中用于显示初始状态:

for (int i = 0; i < mPagerAdapter.getCount(); i++) {
    getLayoutInflater().inflate(R.layout.dot_indicator, viewPagerCountDots);
}
viewPagerCountDots.getChildAt(0).setSelected(true);

这看起来像预期的那样:

enter image description here

但当我改变页面改变时的选择器状态......

@Override
public void onPageSelected(int position) {
    for (int i = 0; i < mPagerAdapter.getCount(); i++) {
        viewPagerCountDots.getChildAt(i).setSelected(i == position);
    }
}

..它看起来像这样:

enter image description here

使子项无效或ViewGroup不执行任何操作。有什么问题在这里发生了什么?

更新

根据Bartek Lipinski

的建议,对子项调用requestLayout进行修复
@Override
public void onPageSelected(int position) {
    for (int i = 0; i < mPagerAdapter.getCount(); i++) {
        View dotView = viewPagerCountDots.getChildAt(i);
        dotView.setSelected(i == position);
        dotView.invalidate();
        dotView.requestLayout();
    }
}

3 个答案:

答案 0 :(得分:6)

requestLayout()回调中添加onPageSelected次来电:

@Override
public void onPageSelected(int position) {
    for (int i = 0; i < mPagerAdapter.getCount(); i++) {
        viewPagerCountDots.getChildAt(i).setSelected(i == position);
        viewPagerCountDots.getChildAt(i).requestLayout();
    }
}

编辑:

或者您可以将drawable更改为始终具有相同的大小,因此setSelected就足够了:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true">
        <shape android:shape="oval">
            <size
                android:width="12dp"
                android:height="12dp"/>
            <solid android:color="@color/highlight"/>
        </shape>
    </item>
    <item>
        <layer-list>
            <item android:bottom="3dp"
                  android:left="3dp"
                  android:right="3dp"
                  android:top="3dp">
                <shape android:shape="oval">
                    <size
                        android:width="6dp"
                        android:height="6dp"/>
                    <solid android:color="@color/light_grey"/>
                </shape>
            </item>
        </layer-list>
    </item>
</selector>

答案 1 :(得分:0)

试试这个

//if you container is LinearLayout ,change to LinearLayout.params 
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    //as you wish
    params.width=200;
    params.height=200;
    @Override
    public void onPageSelected(int position) {
        for (int i = 0; i < mPagerAdapter.getCount(); i++) {
           ImageView dotIv= (ImageView)viewPagerCountDots.getChildAt(i);
            dotIv.setImageResource("//normalPic");
            if(i==position){
                dotIv.setImageResource("//selectPic");
                dotIv.setLayoutParams(params);
            }

        }
    }

答案 2 :(得分:-1)

视图尺寸在创建时会被测量一次。由于您将ImageView的布局宽度和高度设置为&#34; wrap_content&#34;,因此未选择的圆圈将具有6dp的大小,并且它们的大小不会发生变化。您可以设置布局宽度和高度&#34; 12dp&#34;

顺便说一下,我建议使用库来指示而不是实现它。 ViewPagerIndicator是一个很好的