Ich bin neu in Android-Entwicklung und ich schreibe eine kleine App, um zu verstehen, wie es funktioniert. Ich habe alles funktioniert, aber im Moment kann ich keinen Punkt über benutzerdefinierte Zeichnungszustände bekommen ... lassen Sie mich mit einem Beispielcode erklären.Ich kann nicht Android benutzerdefinierten Zustand zu verstehen
Hier ist meine attrs.xml, in dem ich ein Attribut mit dem Namen "oddMonth" erklären, die boolean:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="DayView">
<attr name="oddMonth" format="boolean"/>
</declare-styleable>
</resources>
Dann habe ich eine Ansicht custom:
<?xml version="1.0" encoding="utf-8"?>
<com.example.calendar.DayView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="90dp"
android:background="@drawable/dayview_state" >
<TextView android:id="@+id/day_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:paddingRight="3dp" />
</com.example.calendar.DayView>
Also ich die Zeile "android: background =" @ ziehbar/dayview_state "", die dayview_state.xml Datei verweist:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:easycalendar="http://schemas.android.com/apk/res/com.example.calendar">
<item easycalendar:oddMonth ="true" android:drawable="@drawable/customborder_odd" />
<item easycalendar:oddMonth ="false" android:drawable="@drawable/customborder_even"/>
</selector>
So f ar ... für was ich verstehen kann .... Ich habe ein Attribut in attrs.xml definiert. Dieses Attribut repräsentiert den Status für meine benutzerdefinierte Ansicht. Je nach dem booleschen Wert dieses Attributs lädt meine App eines von zwei verschiedenen xml (die hier nicht wichtig sind), von denen jedes ein anderes Zeichen definiert. Der letzte Schritt ist also, meine benutzerdefinierte Klasse zu erstellen! Folgt ein Extrakt aus der Klasse:
public class DayView extends RelativeLayout {
private static final int[] STATE_ODD_MONTH = { R.attr.oddMonth };
private boolean mOddmonth = true;
public DayView(Context mContext, AttributeSet attrs) {
super(mContext, attrs);
}
@Override
protected int[] onCreateDrawableState(int extraSpace) {
if (mOddmonth) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
mergeDrawableStates(drawableState, STATE_ODD_MONTH);
return drawableState;
} else {
return super.onCreateDrawableState(extraSpace);
}
}
public boolean isOddMonth() {
return mOddmonth;
}
public void setOddMonth(boolean oddMonth) {
if (mOddmonth != oddMonth) {
mOddmonth = oddMonth;
refreshDrawableState();
}
}
}
Ok ... so habe ich hier eine private Variable mOddMonth, whith Getter und Setter. Der Konstruktor, mit dem diese Ansicht an anderer Stelle aufgebläht wird. Eine weitere private Variable:
private static final int[] STATE_ODD_MONTH = { R.attr.oddMonth };
die ein Array aus nur einem int-Wert gemacht wird, dass ein Verweis auf das Attribut in oddMonth attrs.xml definiert. Und die geerbte Methode:
@Override
protected int[] onCreateDrawableState(int extraSpace) {
if (mOddmonth) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
mergeDrawableStates(drawableState, STATE_ODD_MONTH);
return drawableState;
} else {
return super.onCreateDrawableState(extraSpace);
}
}
das kann ich nicht wirklich „tief“ verstehen ... na ja, so scheint es mir, dass ich einen Zustand hinzufügen, wenn die lokale Variable mOddMonth wahr ist, sonst nicht. Also ... mein Code funktioniert nur, wenn ich meine dayview_state.xml mit folgenden ersetzen:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:easycalendar="http://schemas.android.com/apk/res/com.example.calendar">
<item easycalendar:oddMonth ="true" android:drawable="@drawable/customborder_odd" />
<item android:drawable="@drawable/customborder_even"/>
</selector>
Auf diese Weise das erste Layout geladen wird, wenn es der Staat ist, andernfalls wird die zweite geladen werden. Aber was ist mit dem Wert des Staates? Nirgendwo in meinem Code setze ich den Wert für diese Variable/Attribut .... wo ich falsch liege?
Es scheint, dass mit dem Standardselektor funktioniert und nur wahre Werte gesetzt: Xml version = "1.0" encoding = "utf-8"?> <- default -> –
Und so? Was ist mit meinem benutzerdefinierten Selektor? – Stefano
Ich glaube nicht, dass ich Ihre Frage per se verstehe - die Variable mOddmonth wird auf "true" gesetzt, weshalb Sie den Status STATE_ODD_MONTH in onCreateDrawableState erhalten. Also was genau meinst du mit "Was ist mit dem Wert des Staates? Nirgendwo in meinem Code habe ich den Wert für diese Variable/Attribut" –