所以我写了一个'多滑动抽屉'小部件,它像Slidingdrawer一样工作,除了它允许最多4个'抽屉'。但是,我真的更喜欢制作这个'n-Drawers',但我遇到的问题是xml中的参数。目前,我通过以下方式传递句柄/内容:
ns:handle1="@+id/slideHandleButton1"
ns:content1="@+id/contentLayout1"
ns:handle2="@+id/slideHandleButton2"
ns:content2="@+id/contentLayout2"
ns:handle3="@+id/slideHandleButton3"
ns:content3="@+id/contentLayout3"
但显然这里存在一些冗余。我原本以为我可以使用'getChild(i)'循环遍历子节点并在内部添加它们,但我的理解是getChild方法以视觉顺序返回子节点,而不是它们在xml中添加的顺序。所以我现在要做的是:
ns:handles="@id/contentLayout1,@id/contentLayout2,@id/contentLayout13"
允许任意数量的抽屉。这可能吗?或者这个问题有另一个好的解决方案吗?
答案 0 :(得分:1)
您可以将窗口小部件定义为具有参数(例如,handles
和contents
),每个参数都引用一个数组。您可以使用标准表示法定义数组:
<强> RES /值/ arrays.xml 强>
<array name="my_widget_layouts">
<item>@layout/contentLayout1</item>
<item>@layout/contentLayout2</item>
. . .
</array>
<array name="my_widget_buttons">
<item>@+id/slideHandleButton1</item>
<item>@+id/slideHandleButton2</item>
. . .
</array>
在某些布局中:
<com.example.MyWidget
ns:contents="@array/my_widget_layouts"
ns:handles="@array/my_widget/buttons"
. . .
/>
然后在构建窗口小部件的Java代码中:
MyWidget(Context context, AttributeSet attrs) {
Resources res = getResources();
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyWidget);
// Get the ID of the array containing the content layout IDs for this widget
int contentsId = a.getResourceId(R.styleable.MyWidget_contents, 0);
if (contentsId > 0) {
// array of layouts specified
TypedArray ta = res.obtainTypedArray(contentsId);
int n = ca.length();
mContentLayoutIds = new int[n];
for (int i = 0; i < n; ++i) {
mContentLayoutIds[i] = ta.getResourceId(i, 0);
// error check: should never be 0
}
ta.recycle();
}
// similar code to retrieve the button IDs
if (mContentLayoutIds.length != mHandleIds.length) {
// content layout and button arrays not same length: throw an exception
}
. . .
a.recycle();
. . .
}