Android 通过PagerAdapter将属性集传递给自定义ViewPager的孩子

Android 通过PagerAdapter将属性集传递给自定义ViewPager的孩子,android,android-viewpager,android-custom-view,android-pageradapter,android-attributes,Android,Android Viewpager,Android Custom View,Android Pageradapter,Android Attributes,我的问题-ViewPager视图的子视图无法从AttributeSet获取属性。 我创建自定义视图组,包括ViewPager: public class CustomCalendarView extends FrameLayout { ... public CustomCalendarView(Context context, AttributeSet attr) { super(context, attr); init(context, attr); } private v

我的问题-ViewPager视图的子视图无法从AttributeSet获取属性。 我创建自定义视图组,包括ViewPager:

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”-没有任何更改)

因此,TypedArray a不为null,但在获取维度时返回传递的默认值。 如果我直接在xml中设置MonthView,并将设置属性,它可以工作,但不能在PagerAdapter中。
如何修复它并使视图属性可见?

如果我正确理解AttributeSet,您只能访问构造函数中的属性,因此尝试保存副本并向下传递它们将不起作用。您需要在构造函数中使用TypedArray并解析出所有数据,然后将数据传递给其他类

<declare-styleable name="MonthView">
    <attr name="day_text_size" format="dimension"/>
    ...
</declare-styleable>
    <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);
       ...
   }
}