如何为自定义 RecyclerView.LayoutManager 实现的 LayoutParams class 定义自定义属性?
How do you define custom attributes for the LayoutParams class of a custom RecyclerView.LayoutManager implementation?
我知道如何为特定 classes 创建自定义属性。您只需使用 class 名称在 Styleable 中定义它们,就像这样。
<declare-styleable name="MyCustomView">
<attr name="customAttr1" format="integer" />
<attr name="customAttr2" format="boolean" />
</declare-styleable>
然后,当我在布局中使用 MyCustomView
的实例时,customAttr1
和 customAttr2
可用于设置。很简单。
我现在想做的是在我的自定义 RecyclerView
的子项上使用 LayoutParams
的自定义属性,或者更准确地说,在提供的布局文件的根视图中我正在使用的个人 RecyclerView.ViewHolder
subclasses。但是,我无法获得交给我的属性,我不确定为什么。
这是我的 attrs.xml 文件...
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ScrollableGridLayoutManager.LayoutParams">
<attr name="cellLayoutMode">
<enum name="scrollable" value="0" />
<enum name="fixedHorizontal" value="1" />
<enum name="fixedVertical" value="2" />
<enum name="fixedHorizontalAndVertical" value="3" />
</attr>
</declare-styleable>
</resources>
这是我自定义 LayoutParams class 中读取属性的代码...
public LayoutParams(Context context, AttributeSet attrs){
super(context, attrs);
TypedArray styledAttrs = context.obtainStyledAttributes(R.styleable.ScrollableGridLayoutManager_LayoutParams);
if(styledAttrs.hasValue(R.styleable.ScrollableGridLayoutManager_LayoutParams_cellLayoutMode)){
int layoutModeOrdinal = styledAttrs.getInt(R.styleable.ScrollableGridLayoutManager_LayoutParams_cellLayoutMode, layoutMode.ordinal());
layoutMode = LayoutMode.values()[layoutModeOrdinal];
}
styledAttrs.recycle();
}
这是我在我的一个 ViewHolder 的布局中设置它的地方...
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="start|center_vertical"
android:background="#0000FF"
app:cellLayoutMode="fixedVertical">
<TextView
android:id="@+id/mainTextView"
android:textColor="#000000"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#FFFF00"
android:layout_marginStart="20dp" />
</LinearLayout>
然而,我尝试的任何东西似乎都没有进入 'hasValue' 调用。它总是 returns 就像没有设置一样。
注意:我在定义属性时也尝试了所有这些...
<declare-styleable name="LayoutParams">
<declare-styleable name="ScrollableGridLayoutManager_LayoutParams">
<declare-styleable name="ScrollableGridAdapter_LayoutParams">
...但是 none 似乎有效。
那我做错了什么?您如何定义特定于您的自定义属性 LayoutParams
class?
在自定义 LayoutParams
构造函数中,obtainStyledAttributes()
调用必须包含传入的 AttributeSet
。否则,它只是从 Context
的主题中提取值,并且布局 XML 中指定的那些属性值不会包含在返回的 TypedArray
.
中
例如:
TypedArray styledAttrs =
context.obtainStyledAttributes(attrs, R.styleable.ScrollableGridLayoutManager_LayoutParams);
我知道如何为特定 classes 创建自定义属性。您只需使用 class 名称在 Styleable 中定义它们,就像这样。
<declare-styleable name="MyCustomView">
<attr name="customAttr1" format="integer" />
<attr name="customAttr2" format="boolean" />
</declare-styleable>
然后,当我在布局中使用 MyCustomView
的实例时,customAttr1
和 customAttr2
可用于设置。很简单。
我现在想做的是在我的自定义 RecyclerView
的子项上使用 LayoutParams
的自定义属性,或者更准确地说,在提供的布局文件的根视图中我正在使用的个人 RecyclerView.ViewHolder
subclasses。但是,我无法获得交给我的属性,我不确定为什么。
这是我的 attrs.xml 文件...
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ScrollableGridLayoutManager.LayoutParams">
<attr name="cellLayoutMode">
<enum name="scrollable" value="0" />
<enum name="fixedHorizontal" value="1" />
<enum name="fixedVertical" value="2" />
<enum name="fixedHorizontalAndVertical" value="3" />
</attr>
</declare-styleable>
</resources>
这是我自定义 LayoutParams class 中读取属性的代码...
public LayoutParams(Context context, AttributeSet attrs){
super(context, attrs);
TypedArray styledAttrs = context.obtainStyledAttributes(R.styleable.ScrollableGridLayoutManager_LayoutParams);
if(styledAttrs.hasValue(R.styleable.ScrollableGridLayoutManager_LayoutParams_cellLayoutMode)){
int layoutModeOrdinal = styledAttrs.getInt(R.styleable.ScrollableGridLayoutManager_LayoutParams_cellLayoutMode, layoutMode.ordinal());
layoutMode = LayoutMode.values()[layoutModeOrdinal];
}
styledAttrs.recycle();
}
这是我在我的一个 ViewHolder 的布局中设置它的地方...
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="start|center_vertical"
android:background="#0000FF"
app:cellLayoutMode="fixedVertical">
<TextView
android:id="@+id/mainTextView"
android:textColor="#000000"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#FFFF00"
android:layout_marginStart="20dp" />
</LinearLayout>
然而,我尝试的任何东西似乎都没有进入 'hasValue' 调用。它总是 returns 就像没有设置一样。
注意:我在定义属性时也尝试了所有这些...
<declare-styleable name="LayoutParams">
<declare-styleable name="ScrollableGridLayoutManager_LayoutParams">
<declare-styleable name="ScrollableGridAdapter_LayoutParams">
...但是 none 似乎有效。
那我做错了什么?您如何定义特定于您的自定义属性 LayoutParams
class?
在自定义 LayoutParams
构造函数中,obtainStyledAttributes()
调用必须包含传入的 AttributeSet
。否则,它只是从 Context
的主题中提取值,并且布局 XML 中指定的那些属性值不会包含在返回的 TypedArray
.
例如:
TypedArray styledAttrs =
context.obtainStyledAttributes(attrs, R.styleable.ScrollableGridLayoutManager_LayoutParams);