2012-07-08 61 views
0

所以我寫了一個'多重滑動抽屜'小部件,它可以像Slidingdrawer一樣工作,除了它允許最多4個'抽屜'。不過,我真的更喜歡製作這個'n-drawers',但我遇到的問題是使用xml中的參數。目前,我通過處理/內容通過:有沒有辦法在xml中接受多個視圖ID作爲參數?

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

您可以定義您的小部件,使其具有參數(例如,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> 

:然後在Java代碼中你的時候

<com.example.MyWidget 
    ns:contents="@array/my_widget_layouts" 
    ns:handles="@array/my_widget/buttons" 
    . . . 
    /> 

您可以使用標準的符號定義數組構建你的部件:

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

沒有在array.xml中聲明數組的內聯方法嗎?或者也許按照XML中聲明的順序獲取子項? – Rollie 2012-07-08 23:14:52

+0

@Rollie - 你可以定義一個接受字符串值的屬性,然後用代碼解析和解釋(類似於你提出的)。您可以使用'Resources.getIdentifier'方法將解析的字符串轉換爲資源ID值。這是一個巨大的混亂,你放棄任何編譯時檢查。 – 2012-07-08 23:20:44

+0

不是我想要的答案,但也許我應該想要我得到的答案:P – Rollie 2012-07-09 06:29:42

相關問題