我是Android开发新手,我正在编写一个小应用程序以了解它的工作原理。我有所有的工作,但目前我无法得到一个关于自定义可绘制状态的观点......让我来解释一些示例代码。无法理解Android自定义可绘制状态
这是我attrs.xml,我在其中声明属性名称为 “oddMonth”,这是布尔:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="DayView">
<attr name="oddMonth" format="boolean"/>
</declare-styleable>
</resources>
然后,我有一个自定义视图:
<?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>
所以我放线 “机器人:背景=” @绘制/ dayview_state “”,这是指文件dayview_state.xml:
<?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>
,使f ar ...为了我能理解....我有一个在attrs.xml中定义的属性。此属性表示我的自定义视图的状态。根据这个属性的布尔值,我的应用程序将加载两个不同的xml中的一个(这里不重要),每个定义一个不同的drawable。所以最后一步是构建我的自定义类!从类的摘录:
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();
}
}
}
好吧...所以我在这里有一个私人变量mOddMonth,蒙山getter和二传手。用于在其他地方膨胀此视图的构造函数。另一个专用变量:
private static final int[] STATE_ODD_MONTH = { R.attr.oddMonth };
其是仅由一个int值的阵列,即属性oddMonth在attrs.xml定义的参考。而继承的方法:
@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);
}
}
,我真的不能“深刻”理解......嗯,在我看来,我添加一个状态,如果局部变量mOddMonth是真实的,否则不是。所以...我的代码只能如果我代替我dayview_state.xml下列要求:
<?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>
这样,如果有国家第一个布局被加载,否则将被加载第二个。但是关于国家的价值呢?无处在我的代码中,我为这个变量/属性设置了值....我错了?
它似乎与默认选择器一起工作,只设置真值:<?xml version =“1.0”encoding =“utf-8”?> <! - pressed - > <! - 集中 - > <项目安卓!颜色= “#FF000000”/><! - 默认 - > –
2013-02-12 08:33:46
等等?我的自定义选择器呢? – Stefano 2013-02-12 10:00:17
我不认为我明白你的问题本身 - 变量mOddmonth设置为true,那么,为什么你最终在onCreateDrawableState STATE_ODD_MONTH状态,多数民众赞成。那么究竟是什么,你的意思是“怎么样的状态值?无处在我的代码设置的值此变量/属性” – 2013-05-13 19:09:38