프로그래밍 방식으로 뷰를 뷰에 추가하는 방법


179

LinearLayoutJava 코드의 프로그램에서을 가지고 뷰를 추가하고 싶다고 가정 해 봅시다 . 어떤 방법을 사용합니까? 나는 그것이 XML에서 어떻게 수행되는지 묻지 않고 있지만,이 샘플 코드의 라인을 따라 어떻게 할 수 있습니까?

(One View).add(Another View)

Swing에서 할 수있는 것처럼.

답변:


248

전화하는 addView것이 정답이지만 작동하려면 그 이상을 조금 더 수행해야합니다.

생성자 (예 :)를 통해보기를 만드는 경우 새로 생성 된 자식을 부모보기에 추가하기 전에 부모보기의 LayoutParams 내부 클래스 인스턴스를 전달하여 새로 생성 된보기 Button myButton = new Button();를 호출해야합니다 setLayoutParams.

예를 들어 onCreate()LinearLayout에 id가 있다고 가정하면 함수에 다음 코드가있을 수 있습니다 R.id.main.

LinearLayout myLayout = findViewById(R.id.main);

Button myButton = new Button(this);
myButton.setLayoutParams(new LinearLayout.LayoutParams(
                                     LinearLayout.LayoutParams.MATCH_PARENT,
                                     LinearLayout.LayoutParams.MATCH_PARENT));

myLayout.addView(myButton);

LayoutParams를 설정하는 것이 중요합니다. 모든 뷰에는 최소한 layout_width 및 layout_height 매개 변수가 필요합니다. 또한 올바른 내부 수업을받는 것이 중요합니다. TableRow.LayoutParams 인스턴스를 자식 뷰의 setLayoutParams에 전달하지 않을 때까지 TableRow에 뷰를 추가하여 올바르게 표시하는 데 어려움을 겪었습니다.


5
프로그래밍 방식으로 뷰를 작성하되이 새로운 뷰에 대해 특별히 작성한 XML 레이아웃 파일을 사용하여 뷰를 어떻게 작성 하시겠습니까?
SK9

9
@ SK9 일반적으로 현재 활동 인 컨텍스트에서 얻을 수있는 LayoutInflater를 사용합니다. 같은 것 : LayoutInflater myInflater = getLayoutInflater; 보기 myView = myInflater.inflate (R.layout.myLayout, 부모, 거짓);
브라이언 쿨리

1
실제로 getLayoutInflater ()는 컨텍스트가 아닌 Window 클래스에서 제공되며 Activity의 편리한 메소드입니다.
브라이언 쿨리

2
코딩 관행으로 findViewById에서 ViewGroup 또는 항상 가장 일반적인 형태의 객체로 캐스트하므로 LinearLayout에서 RelativeLayout으로 변경되면 리팩토링이 없습니다.
Joel Teply

1
세부 사항은 다음과 같습니다. D
Vivek Solanki

51

아직 관심이있는 사람 :

내가 찾은 가장 좋은 방법은 View의 팽창 정적 메소드를 사용하는 것입니다.

View inflatedView = View.inflate(context, yourViewXML, yourLinearLayout);

여기서 yourViewXML은 R.layout.myView와 같습니다.

뷰 (생각할 수있는 모든 레이아웃)를 추가하려면 ViewGroup이 필요합니다.

예를 들어 이미 뷰가 팽창 된 조각이 있고 루트 뷰가 레이아웃이고 뷰를 추가하려고한다고 가정합니다.

    View view = getView(); // returns base view of the fragment
    if (view == null)
        return;
    if (!(view instanceof ViewGroup))
        return;

    ViewGroup viewGroup = (ViewGroup) view;
    View popup = View.inflate(viewGroup.getContext(), R.layout.someView, viewGroup);

정적 예제를 작성할 수도 있습니다. 그러면 조각 예제를 확장 하기 위해 ... 처럼 addView(View v){ // your code after get view }사용 findViewById(int resourceID)하거나 부풀린 뷰를 가져와야합니다 inflatedView.
zgc7009

22

이것은 늦었지만 누군가에게 도움이 될 수 있습니다 :) :) 프로그래밍 방식으로 뷰를 추가하려면 다음과 같이하십시오.

LinearLayout rlmain = new LinearLayout(this);      
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.FILL_PARENT);          
LinearLayout   ll1 = new LinearLayout (this);

ImageView iv = new ImageView(this);
iv.setImageResource(R.drawable.logo);              
LinearLayout .LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);

iv.setLayoutParams(lp);
ll1.addView(iv);
rlmain.addView(ll1);              
setContentView(rlmain, llp);

전체 뷰를 프로그램 적으로 작성합니다. 동일한 수의보기를 추가 할 수 있습니다. 이것이 도움이되기를 바랍니다. :)



3

활동에서보기를 추가하는 또 다른 방법

ViewGroup rootLayout = findViewById(android.R.id.content);
rootLayout.addView(view);

0

프로그래밍 방식으로 제약 조건을 설정한다는 아이디어는 번거로울 수 있습니다. 아래 의이 솔루션은 제약 조건, 선형 등 모든 레이아웃에 적용됩니다. 가장 좋은 방법은 프로그래밍 방식으로 생성 된 뷰를 기대하는 위치에 적절한 제약 조건 (또는 선형과 같은 다른 레이아웃의 적절한 배치)을 사용하여 자리 표시 자, 즉 FrameLayout을 설정하는 것입니다 가지고 있습니다.

프로그래밍 방식으로 뷰를 뷰 방식으로 팽창시키고 addChild()메소드 를 사용하여 FrameLayout의 자식으로 뷰를 팽창시킵니다 . 그런 다음 런타임 중에 뷰가 팽창되어 올바른 위치에 배치됩니다. Android 권장 사항에 따라 FrameLayout [link]에 childView를 하나만 추가해야합니다 .

다음은 특정 위치에서 프로그래밍 방식으로 TextView를 작성하려는 경우 코드의 모양입니다.

1 단계:

부 풀릴 뷰가 포함 된 레이아웃에서 FrameLayout을 올바른 위치에 배치하고 ID (예 : "컨테이너")를 지정하십시오.

2 단계 런타임 중에 부풀 리려는 뷰로 루트 요소를 사용하여 레이아웃을 작성하고 "textview.xml"로 레이아웃 파일을 호출하십시오.

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

</TextView>

BTW, frameLayout의 레이아웃 매개 변수를 wrap_content로 설정하십시오. 그렇지 않으면 프레임 레이아웃이 부모 즉 활동 (예 : 전화 화면)만큼 커집니다.

android:layout_width="wrap_content"
android:layout_height="wrap_content"

설정하지 않으면 기본적으로 프레임의 자식보기가 프레임 레이아웃의 왼쪽 상단으로 이동하므로보기가 단순히 화면의 왼쪽 상단으로 이동합니다.

3 단계

oncreate 메소드에서 다음을 수행하십시오.

FrameLayout frameLayout = findViewById(R.id.container);
                TextView textView = (TextView) View.inflate(this, R.layout.textview, null);
                frameLayout.addView(textView);

(마지막 파라미터 설정 참고 findViewByIdnull호출하여 볼을 추가하는 addView()컨테이너 뷰 (FrameLayout이)에 단순히 전달하여 부풀려 부착와 동일 true의 제 3 파라미터를 findViewById(). 자세한 내용은 참조 이것을 ).


0

당신은 또한 당신이 당신을 재정의 onLayout할 때 super.onLayout모든 속성 을 호출 해야하거나보기가 팽창하지 않도록해야합니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.