有没有办法接受多个视图ID作为xml中的参数?

时间:2012-07-08 22:35:39

标签: android

所以我写了一个'多滑动抽屉'小部件,它像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"

允许任意数量的抽屉。这可能吗?或者这个问题有另一个好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

您可以将窗口小部件定义为具有参数(例如,handlescontents),每个参数都引用一个数组。您可以使用标准表示法定义数组:

<强> 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();
    . . .
}