1. Inflation
XML 레이아웃에서 정의된 내용이 메모리에 객체화되는 것을 말한다.
MainActivity.java 파일에서 activity_main.xml 파일을 이해하려면
setContentView 메소드의 파라미터로 해당 XML 레이아웃 파일을 지정해주면 내부적으로 인플레이션 과정이 진행된다.
1 2 3 4 5 6 7 8 | public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } | cs |
- setContentView() 메소드
화면에 나타낼 뷰를 지정하고, XML 레이아웃의 내용을 메모리 상에 객체화한다.
1 2 | public void setContentView (int layoutResID) public void setContentView (View view [, ViewGroup.LayoutParams params]) | cs |
XML 레이아웃 파일의 내용이 메모리에 객체로 만들어지면 소스 코드에서는 그 객체들을 찾아 사용할 수 있다.
객체를 찾을 때는 findViewById 메소드를 이용할 수 있으며
XML 레이아웃에 뷰를 추가할 때 넣어둔 id 속성의 값을 파라미터로 사용한다.
1 | Button button = (Button) findViewById(R.id.button1); | cs |
2. Layout Inflater
- LayoutInflater() 클래스
: 시스템 서비스로 제공되는 클래스로서,
전체 화면 중에서 일부분만을 차지하는 화면 구성 요소들을 XML 레이아웃에서 로딩하여 보여준다.
화면 전체를 나타내는 액티비티의 경우에는 setContentView 메소드를 이용해 XML 레이아웃을 인플레이션할 수 있지만,
XML 레이아웃 파일 안에 포함되지 않는 뷰의 경우에는 setContentView 메소드를 통해 인플레이션되지 않는다.
setContentView 메소드는 액티비티를 위해 만들어 놓은 것이기 때문에 뷰를 위한 인플레이션에는 사용할 수 없다.
실제로 액티비티와 뷰가 내부적으로 관리되는 방식이 달라서 그런 것인데, 이 때문에 뷰의 경우에는 직접 인플레이션을 해야 한다.
레이아웃 인플레이터 객체는 시스템 서비스 객체로 제공되기 때문에 getSystemService 메소드를 이용해 참조할 수 있다.
1 | getSystemService(Context.LAYOUT_INFLATER_SERVICE) | cs |
뷰 객체가 있으면 그 뷰 객체에 인플레이션한 결과물을 설정하게 된다.
1 2 | LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.activity_sub, frame_layout, true); | cs |
- Layout Inflater Example
XML 레이아웃의 이름은 activity_sub.xml로 만들어져 있고 이 XML 레이아웃에 들어가 있는 뷰들은 메모리에 객체로 만들어진 후에 frame_layout 뷰 객체에 설정된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class MainActivity extends AppCompatActivity { Button button; FrameLayout frame_layout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button)findViewById(R.id.button); frame_layout = (FrameLayout)findViewById (R.id.frame_layout); button.setOnClickListener(new View.onClickListener(){ @Override public void onClick(View v){ LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.activity_sub, frame_layout, true); } }); } } | cs |
이런 방식은 새로운 뷰를 정의할 때 자주 볼 수 있는데, 동적으로 레이아웃이 변경, 추가되는 경우에도 사용된다.
출처: https://www.edwith.org/boostcourse-android/lecture/17056/
'Android' 카테고리의 다른 글
ListView (리스트뷰) - 예제 (0) | 2018.05.06 |
---|---|
ListView (리스트뷰) (0) | 2018.05.06 |
Bitmap Button 만들기 (0) | 2018.05.01 |
Nine Patch (나인패치) (0) | 2018.05.01 |
AlertDialog (알림 대화상자) (0) | 2018.04.28 |