我想使用选择器来实现ViewPager的简单点指示器。Android选择器更改颜色,但不是大小
当页面被改变时,点应该改变颜色和大小,但它们只是改变颜色,而尺寸保持不变。
选择器:
<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);
这看起来如预计:
但是当我改变页面时改变这样的选择状态...
@Override
public void onPageSelected(int position) {
for (int i = 0; i < mPagerAdapter.getCount(); i++) {
viewPagerCountDots.getChildAt(i).setSelected(i == position);
}
}
..它看起来是这样的:
无效的儿童或ViewGroup不做任何事情。任何线索在这里出了什么问题?
更新
对孩子调用requestLayout修复它,通过Bartek Lipinski
@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();
}
}
这工作,但有一个轻微颜色和尺寸变化之间的延迟 –
调用'requestLayout()'就像要求Android在'View'上执行布局传递一样。这并不意味着它是即时的。 –
在调用requestLayout()之前在视图上调用'invalidate()'来消除延迟。 –