我的问题 - ViewPager 视图的子视图无法从 AttributeSet 获取属性。我制作了包含 ViewPager 的自定义 ViewGroup:
public class CustomCalendarView extends FrameLayout {
...
public CustomCalendarView(Context context, AttributeSet attr) {
super(context, attr);
init(context, attr);
}
private void init(Context context, AttributeSet attributeSet){
...
_viewPager = new ViewPager(context, attributeSet);
_pagerAdapter = new MonthPagerAdapter(_minDate, _maxDate, attributeSet);
...
addView(_viewPager);
_viewPager.setAdapter(_pagerAdapter);
...
}
在适配器中,我保存 AttributeSet 对象并在创建步骤将其传递给 ViewPager 视图的子视图:
private class MonthPagerAdapter extends PagerAdapter {
private final Calendar _minDate;
private final Calendar _maxDate;
private final AttributeSet _attributeSet;
public MonthPagerAdapter(Calendar min, Calendar max, AttributeSet attr){
_minDate = min;
_maxDate = max;
_attributeSet = attr;
}
@Override public Object instantiateItem(ViewGroup container, int position) {
MonthView v = new MonthView(getContext(), _attributeSet);
...
container.addView(v);
return v;
}
...
}
属性示例(我尝试将 declare-styleable 的名称设置为“CustomCalendarView” - 没有任何变化)
<declare-styleable name="MonthView">
<attr name="day_text_size" format="dimension"/>
...
</declare-styleable>
xml 中使用自定义视图的示例:
<my_app_package.views.CustomCalendarView
xmlns:calendar="http://schemas.android.com/apk/res-auto"
calendar:day_text_size="16sp"
android:id="@+id/calendar"
android:layout_width="match_parent"
android:layout_height="250dp"/>
在子视图中,我尝试获取该属性:
...
if (attr != null) {
TypedArray a = context.obtainStyledAttributes(attr, R.styleable.MonthView, defStyle, 0);
if (a != null) {
_dayTextSize = a.getDimensionPixelSize(R.styleable.MonthView_day_text_size, _dayTextSize);
...
}
}
因此,TypedArray 不是 null,而是在获取维度时返回传递的默认值。如果我直接在 xml 中设置 MonthView 并设置属性 - 它可以工作,但不能在 PagerAdapter 中。如何修复它并使视图可见属性?