3

我的问题 - 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 中。如何修复它并使视图可见属性?

4

1 回答 1

0

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

于 2016-03-06T09:31:33.517 回答