답변:
전화하는 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에 뷰를 추가하여 올바르게 표시하는 데 어려움을 겪었습니다.
아직 관심이있는 사람 :
내가 찾은 가장 좋은 방법은 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.
이것은 늦었지만 누군가에게 도움이 될 수 있습니다 :) :) 프로그래밍 방식으로 뷰를 추가하려면 다음과 같이하십시오.
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);
전체 뷰를 프로그램 적으로 작성합니다. 동일한 수의보기를 추가 할 수 있습니다. 이것이 도움이되기를 바랍니다. :)
프로그래밍 방식으로 제약 조건을 설정한다는 아이디어는 번거로울 수 있습니다. 아래 의이 솔루션은 제약 조건, 선형 등 모든 레이아웃에 적용됩니다. 가장 좋은 방법은 프로그래밍 방식으로 생성 된 뷰를 기대하는 위치에 적절한 제약 조건 (또는 선형과 같은 다른 레이아웃의 적절한 배치)을 사용하여 자리 표시 자, 즉 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);
(마지막 파라미터 설정 참고 findViewById로 null호출하여 볼을 추가하는 addView()컨테이너 뷰 (FrameLayout이)에 단순히 전달하여 부풀려 부착와 동일 true의 제 3 파라미터를 findViewById(). 자세한 내용은 참조 이것을 ).