我正在尝试使用选择器为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);
这看起来像预期的那样:
但当我改变页面改变时的选择器状态......
@Override
public void onPageSelected(int position) {
for (int i = 0; i < mPagerAdapter.getCount(); i++) {
viewPagerCountDots.getChildAt(i).setSelected(i == position);
}
}
..它看起来像这样:
使子项无效或ViewGroup不执行任何操作。有什么问题在这里发生了什么?
更新
的建议,对子项调用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();
}
}
答案 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是一个很好的