Ich versuche, einen Selektor zu verwenden, um eine einfache Punktanzeige für einen ViewPager zu implementieren.Android Selector ändert Farbe, aber nicht Größe
Die Punkte sollen die Farbe und Größe ändern, wenn die Seite geändert wird, aber sie ändern nur die Farbe, während die Größe gleich bleibt.
Der Selektor:
<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>
, die in einem Layout verwendet wird
<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>
die in onCreate benutzt wird(), um den Ausgangszustand zu zeigen:
for (int i = 0; i < mPagerAdapter.getCount(); i++) {
getLayoutInflater().inflate(R.layout.dot_indicator, viewPagerCountDots);
}
viewPagerCountDots.getChildAt(0).setSelected(true);
Dies sieht aus, als erwartet:
Aber wenn ich den Wahlzustand ändern, wenn die Seite wie folgt geändert wird ...
@Override
public void onPageSelected(int position) {
for (int i = 0; i < mPagerAdapter.getCount(); i++) {
viewPagerCountDots.getChildAt(i).setSelected(i == position);
}
}
..es sieht wie folgt aus:
Invalidierung das Kind oder die ViewGroup macht nichts. Irgendeine Ahnung, was hier schief läuft?
aktualisieren
requestLayout Aufruf auf das Kind fixiert es, vorgeschlagen, wie durch 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();
}
}
Dies funktioniert, aber es gibt eine leichte Verzögerung zwischen der Farbe und der Größenänderung –
Der Aufruf von 'requestLayout()' ist so, als würde man Android bitten, einen Layout-Durchlauf auf einer 'View' durchzuführen. Es bedeutet nicht, dass es sofort ist. –
Der Aufruf von 'invalidate()' in der Sicht vor dem Aufruf von 'requestLayout()' entfernt die Verzögerung. –