0

所以我写了一个“多滑动抽屉”小部件,它的工作原理与 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"

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

4

1 回答 1

1

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

资源/值/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();
    . . .
}
于 2012-07-08T22:57:57.917 回答