Avtivity 화면에서
XML로 정의되어 있는 View 와 Layout을 객체화 시키는 메소드가 inflate 다.
inflate 메소드를 통해서 XML 리소스 정보를 해석하여 View를 생성하고 rootView를 리턴한다.
리턴된 rootView를 setContentView() 라는 메소드를 통해 보여줄 수 있다.
setContentView를 이용하면 XML 레이아웃을 인플레이션 한 후 화면에 보여주는 기능을 하기도 하고, 인플레이션 된 위젯을 화면에 구성하는 기능을 한다.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
XML 로 작성된 메뉴(옵션 메뉴, 컨텍스트 메뉴)는 inflate(팽창 → 프로그래밍 객체로 변환) 하면 실제 메뉴가 생성된다.
기본적인 사용 패턴은
// 1. inflater 얻어오기
MenuInflater inflater = getMenuInflater();
LayoutInflater inflater = getLayoutInflater();
LayoutInflater inflater = (LayoutInflater) getSystemService( Context.LAYOUT_INFLATER_SERVICE );
// 2. View inflate 하기 (XML 파일과 연결 (R. 으로 시작되는 resource 파일들만 inflate 가능))
inflater.inflate(R.menu.mymenu, menu);
View v = (View) inflater.inflate( R.layout.inflate_example, parent, false );
// 3. 화면에 표시하기
setContentView( v );
다시 정리하면
LayoutInflater inflater = (LayoutInflater) getSystemService( Context.LAYOUT_INFLATER_SERVICE );
View v = (View) inflater.inflate( R.layout.inflate_example, parent, false );
setContentView(v);
Main View 에 부분 xml 을 가져와서 보여주는 것에 대한 예제를 보자.
LinearLayout add_layout = (LinearLayout) findViewById(R.id.addLayout); // 인플레이션 LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.add_layout,add_layout,true); |
=== activity_main.xml ===
|
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" >
<TextView android:id="@+id/txt01" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="부분 레이아웃" android:layout_marginTop="30dp" android:gravity="center_horizontal" android:textSize="20dp" android:textColor="#a88" />
<Button android:id="@+id/btn1" android:layout_gravity="center_horizontal" android:text="Add" android:textAllCaps="false" android:textSize="20dp" android:onClick="btn_addlayout" android:layout_width="wrap_content" android:layout_height="wrap_content" />
<LinearLayout android:id="@+id/addLayout" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
</LinearLayout> </LinearLayout>
|
부분 Layout 을 추가할 add_layout.xml 를 정의한다.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
<Button android:id="@+id/btnTest" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:text="동의 토글" android:textSize="20dp" android:textStyle="bold" />
<RadioGroup android:id="@+id/rg1" android:orientation="horizontal" android:layout_gravity="center" android:layout_margin="10dp" android:layout_marginRight="5dp" android:layout_width="wrap_content" android:layout_height="wrap_content">
<RadioButton android:id="@+id/rb1" android:text="독서" android:textColor="#00f" android:textSize="20dp" android:layout_marginRight="5dp" android:layout_width="wrap_content" android:layout_height="wrap_content" />
<RadioButton android:id="@+id/rb2" android:text="여행" android:textColor="#00f" android:textSize="20dp" android:layout_marginRight="5dp" android:layout_width="wrap_content" android:layout_height="wrap_content" />
<RadioButton android:id="@+id/rb3" android:text="스포츠" android:textColor="#00f" android:textSize="20dp" android:layout_marginRight="5dp" android:layout_width="wrap_content" android:layout_height="wrap_content" />
<RadioButton android:id="@+id/rb4" android:text="영화" android:textColor="#00f" android:textSize="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content" />
</RadioGroup>
<LinearLayout android:gravity="center" android:layout_margin="10dp" android:layout_width="match_parent" android:layout_height="wrap_content">
<TextView android:text="동의" android:textSize="20dp" android:layout_margin="10dp" android:textColor="#f00" android:layout_width="wrap_content" android:layout_height="wrap_content" />
<CheckBox android:id="@+id/agree" android:layout_width="wrap_content" android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout> |
이제 MainActivity.java 파일에 inflation 을 시킨다.
import android.content.Context; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import android.widget.LinearLayout;
public class MainActivity extends AppCompatActivity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }
// 버튼을 클릭했을 때 동작처리 메소드 public void btn_addlayout(View view){ addLayout(); }
// add_layout.xml 을 activity_main.xml 에 추가하는 메소드 private void addLayout(){ LinearLayout add_layout = (LinearLayout) findViewById(R.id.addLayout);
// 인플레이션 LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.add_layout,add_layout,true);
// add_layout.xml 에 버튼 객체 참조 Button btnTest = (Button) findViewById(R.id.btnTest); final CheckBox agree = (CheckBox) findViewById(R.id.agree);
btnTest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(agree.isChecked()){ agree.setChecked(false); } else { agree.setChecked(true); } } });
} }
|