2012-08-15 14 views
12

Jestem dość biegły w tworzeniu złożonych układów niestandardowych opartych na ViewGroup. Jedyne, czego mi brakuje to możliwość tworzenia moich własnych LayoutParams. Naprawdę potrzebuję możliwości uzyskania marginesów i dlaczego nie tworzyć innych dodatkowych parametrów do przekazania rodzicowi.Jak utworzyć niestandardowe elementy LayoutParams do zastosowania w niestandardowym układzie?

Jak mogę utworzyć niestandardowy LayoutParam i używać go przez xml? Próbowałem użyć LinearLayout.LayoutParam, ale oczywiście ulega awarii, ponieważ rodzic nie jest LinearLayout. Jak mogę pracować z LayoutParams na niestandardowych układach?

Aktualizacja:

Jak teraz mam trzymać z użyciem FrameLayout i nadrzędne funkcje onMeasure i onLayout aby zrobić układ siebie. Zapewnia to FrameLayout.LayoutParams. Zgaduję, że dzieci będą musiały obsługiwać niestandardowy LayoutParam?

+2

Zobacz ten link (ostatnia część o FlowLayout): http://www.parleys.com/#st=5&id=2191&sl=38. – Luksprog

+0

Świetny link! Idealny! – Jona

+0

Powyższy link nie działa. Ten może być pomocny: https://github.com/ApmeM/android-flowlayoutout –

Odpowiedz

19

W niestandardowym layoucie utwórz zagnieżdżoną klasę rozszerzającą ViewGroup.LayoutParams. Następnie zastąp niektóre metody (wszystkie wymagane są w moim przykładzie). Oto okrojoną wersję jednego z moich własnych układów:

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) { 

     } 

    } 

} 

Dalsze wyjaśnienia: How to create a FlowLayout (! Dzięki za link Luksprog)

+0

Post @Luksprog był martwy! Dziękujemy za opublikowanie kodu, ponieważ inni mogą go uznać za pomocny! – Jona

Powiązane problemy