2012-08-15 60 views
12

我很擅長創建基於ViewGroup的複雜自定義佈局。我唯一缺少的是創建自定義LayoutParams的能力。我真的需要獲得邊距的能力,爲什麼不創建其他額外的參數傳遞給父項。如何創建要在自定義佈局上使用的自定義LayoutParams?

我該如何去創建一個自定義LayoutParam並通過xml使用它?我嘗試使用LinearLayout.LayoutParam,但它顯然崩潰,因爲父母不是LinearLayout。我如何在LayoutParams上使用LayoutParams?

更新:

截至目前,我與使用的FrameLayout和重寫onMeasure和onLayout功能進行佈局自己堅持。這確實提供了FrameLayout.LayoutParams。我猜孩子們將不得不支持自定義的LayoutParam?

+2

請參閱此鏈接(有關的FlowLayout最後部分):HTTP:/ /www.parleys.com/#st=5&id=2191&sl=38。 – Luksprog 2012-08-15 14:57:17

+0

偉大的鏈接!完善! – Jona 2012-08-15 18:10:05

+0

上面的鏈接不起作用。這一個可能會有所幫助:https://github.com/ApmeM/android-flowlayout – 2017-07-24 13:26:02

回答

19

在您的自定義佈局中,創建一個擴展ViewGroup.LayoutParams的嵌套類。然後重寫一些方法(所有必需的都在我的例子中)。這裏是我的自定義佈局中的一個精簡版本:

public class MyLayout extends ViewGroup { 

    public MyLayout(Context context) { 

    } 

    public MyLayout(Context context, AttributeSet attrs) { 

    } 

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 

    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 

    } 

    @Override 
    protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { 
     return p instanceof LayoutParams; 
    } 

    @Override 
    protected LayoutParams generateDefaultLayoutParams() { 
     return new LayoutParams(); 
    } 

    @Override 
    public LayoutParams generateLayoutParams(AttributeSet attrs) { 
     return new LayoutParams(getContext(), attrs); 
    } 

    @Override 
    protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { 
     return generateDefaultLayoutParams(); // TODO Change this? 
    } 

    public static class LayoutParams extends ViewGroup.LayoutParams { 

     public LayoutParams() { 

     } 

     public LayoutParams(int width, int height) { 

     } 

     public LayoutParams(Context context, AttributeSet attrs) { 

     } 

    } 

} 

進一步解釋:How to create a FlowLayout(!感謝您的鏈接Luksprog

+0

後@Luksprog已經死了!感謝您發佈一些代碼,因爲其他人會發現它有幫助! – Jona 2012-08-15 18:11:49