2013-05-29 3 views
1

누구나 알고있는 방법, 참조 된 XML 레이아웃을 얻는 방법, 프로그래밍 방식으로 (사용자 정의 위젯 용). 원하는 속성으로 사용자 정의 선언 스타일을 이미 만들었고 문자열 또는 정수와 같은 xml 특성 값을 얻는 방법을 알고 있습니다.사용자 정의 xml 속성이있는 사용자 정의보기 : 레이아웃을 다시 채우는 방법

<MyCustomView 
    xmlns:my="http://schemas.android.com/apk/res-auto" 
    id="@+id/view" 
    my:headerLayout="@layout/my_fancy_layout" 
    /> 

그래서 내가 프로그래밍 my_fancy_layout를 검색하고 MyCustomView의 코드에서 그 레이아웃을 팽창하려는 : 내가 원하는 무엇

이 같은 것입니다.

어떻게 할 수 있습니까?

편집 : 나는

int resId = attrs.getAttributeResourceValue(androidns, "headerLayout", 0);

그러나 무슨과 자원 ID를 retreive 수 있습니다 생각 나는 MyCustomView 도서관 프로젝트이며, 경우 올바른 네임 스페이스 나는

의 xmlns를 사용하고자하는 경우 : my = "http://schemas.android.com/apk/res-auto"

답변

0

좋아, 난 혼자 해결책을 발견

당신이 행해져 Yout의 AttributeSet에서하는 TypedArray를 검색 할 수 있습니다. 평소처럼 팽창 할 수있는 것보다

TypedArray attrs = ... ; 
int headerRes = attrs.getResourceId(R.styleable.MyCustomWidget_headerLayout, -1); 

:이 같은 뭔가 원하는 리소스 ID에 액세스 할 수있는 것보다

LayoutInflater.from(context).inflate(headerRes, this); 
0

실제로 constru에서 레이아웃을 확장 할 수 있습니다. 사용자 정의보기에 ctor :

public class MyCustomView extends /* LinearLayout, RelativeLayout, etc. */ { 
    public MyCustomView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     initView(context, attrs); 
    } 
    public MyCustomView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     initView(context, attrs); 
    } 
    protected void initView(Context context, attrs) { 
     LayoutInflater.from(context).inflate(attrs.getAttributeResourceValue("http://schemas.android.com/apk/res-auto", "headerLayout", 0), this, true); 
    } 
} 
+0

그래, 분명,하지만 난에 레이아웃을 지정하려면 xml. 그래서 R.layout.my_custom_view의 값을 xml에 지정된 값으로 바꾸고 싶습니다. – sockeqwe

+0

방금 ​​반영한 답을 편집했습니다. 하지만 테스트되지 않았습니다. – etienne

관련 문제