2012-10-25 2 views
0

Views 블록에 ImageView, ButtonTextView이 포함되어 있습니다. Java 코드에서 동적으로이 블록을 만들고 싶습니다. 이 블록을 XML로 정의하고 src/text 속성을 변경하고 현재 layout에 추가하는 방법이 있습니까?Android - 동적으로 뷰 블록을 만들고 레이아웃에 추가

감사합니다.

론 나는 다음과 같은 기술을 사용

답변

1

: 사용 팽창 그런

<!-- content.xml --> 
<merge> 
    <ImageView android:id="@+id/image /> 
    <Button android:id="@+id/button /> 
    <TextView android:id="@+id/text /> 
</merge> 

LayoutInflater :

View block = inflater.inflate(R.layout.content, root, attach); 
(TextView) textView = (TextView) block.findViewById(R.id.text); 
textView.setText(text); 

사용자 정의가 ViewViewGroup을 확장 쓸 때 나는이 특히 유용하다고 (예 : LinearLayout 또는 RelativeLayout) 선언적 XML로 내용을 정의하려고합니다. 예를

public class MyWidget extends LinearLayout { 

    // Invoked by all of the constructors 
    private void setup() { 
    Context ctx = getContext(); 
    inflate(ctx, R.layout.content, this); 
    ((TextView) findViewById(R.id.text)).setText(
     ctx.getString(R.string.hello_world) 
    ); 
    } 
} 

에 대한 가능한 변화는 당신이 필요하지 않은 Layout 대신 <merge> 경우 사용하고 있습니다. LayoutInflaterContextgetSystemService()를 통해 (당신이 후자의 경우에 LayoutInflater 객체에 결과를 캐스팅해야 Activity.getLayoutInflater() 또는 얻을 수 있습니다. 내가이를 사용하는 경우

+1

내가 그것을 ... 시도 감사 : – Ron

+1

을주지 블록 몇 번 ... 어떻게 ID를 통해 의견을 주소로 문제가되는 것을 피할 수 있습니까? id/image는 여러 번있을 것입니다. 실 거예요? – Ron

+2

'id'는 뷰를 찾기위한 식별자입니다. 계층 구조 내에서 고유 할 필요도 없습니다. 두 개의보기가 동일한 ID를 가질 때 아무 것도 발생하지 않습니다. 유일한 문제는'View.findViewById (int)'를 호출하고 동일한 ID를 가진 두 개 이상의 뷰가 존재할 때입니다. 왜냐하면이 경우에는 찾고있는 것을 찾을 수 없기 때문입니다 ('setTag (Object) '). 그러나 inflator가 마지막으로 생성 된 계층 구조를 반환하고이 계층 구조에서'findViewById'를 호출 할 수 있고'content.xml'에서 중복 된 ID가 아닌 – Raffaele

관련 문제