티스토리 뷰

  • 안드로이드 애플리케이션 구성요소에 대한 이해
1
2
3
4
5
6
7
XML 레이아웃 파일          자바 소스 코드 파일
(activity_main.xml)            (MainActivity.java)
+ 
==> 어플리케이션 실행(두개가 모여서 하나의 화면을 구성한다)
R.layout.레이아웃 파일 이름
cs

  • 인플레이션이란?
1
XML 레이아웃에 정의된 내용이 메모리에 객체화 되는 과정
cs

  • 레이아웃 인플레이션의 이해 - 호출 순서

1
2
3
4
5
6
7
8
9
10
11
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        RadioButton radioButton = (RadioButton)findViewById(R.id.radioButton);
        boolean checked = radioButton.isChecked();          // 라디오 버튼 체크하는부분
 
    }
cs

코드의 순서만 바꾸어도 에러가 난다 Why?
1
2
3
4
5
6
7
8
9
10
인플레이션 과정을 이해해야만 한다. 메모리의 객체화 하는 과정에 대해서 알아한다.
 
setContentView() 메소드 역할
1. 화면에 나타낼 뷰를 지정하는 역할
2. XML 레이아웃 내용을 메모리 상에 객체화하는 역할
 
getSystemService(Context.LAYOUT_INFLATER_SERVICE) 역할
전체화면중에서 일부분만을 차지하는 화면 구성요소들을 XML 레이아웃에서 로딩하여 보여 줄 수 없을까? 싶을때 사용 한다.
 
* Auto Import Setting
cs

  • LayoutInflater 실습하기
1
2
3
1. Button 하나를 가운데에 추가 시킨다.
 
2. java 소스로 와서 onCreate() 함수 안에 이벤트 동작 소스를 써준다.
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
 
        // 버튼을 찾기
 
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
 
            }
 
        });
        setContentView(R.layout.activity_main);
    }
}
cs

3.XML 파일에서  Button이라고 하는 태그를 명시를 하면 실제 버튼은 new Button을 통해서 객체를 만들어 주는데, 객체를 만들어 주는 위치를 알 수가 없다. 이때 id로 find를 해서 객체를 찾게 된다.

만약
1
setContentView(R.layout.activity_main);
cs
버튼 객체 이후에 이것의 위치를 바꾸게 될경우 에러가 나게 된다.
이때, Android Monitor에서 에러 메시지만 볼 수 있다.

1
2
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
    at com.example.example_layoutinflater.MainActivity.onCreate(MainActivity.java:18)
cs
이때, 발생이유는 NullPointException -Button이 메모리에 만들어 지기 전인데 버튼객체를 호출하니까 Null Point Exception 이 발생하게 된다. 
LayoutInflation의 기본적인 동작과정을 여기서 이해 할 수 있다.


1
setContentView(R.layout.activity_main);
cs
activity_main 전체를 객체화하는것이 아니라
작은 추가한 부분에다가 다른 뷰를 집어 넣겠다고 할 경우 뷰를 부분화면으로 만들 수가 있는데, 레이아웃이라고 하는것 안에 들어갈 수 있는 View를 의미 한다. 단순 버튼,위젯같은것이 아니라 레이아웃으로 구성된 뷰면 부분화면으로 또 구성할 수 있다. 이럴때에는 직접 setContentView를 사용할 수 없기때문에, 이때 사용하는것이  
getSystemService(Context.LAYOUT_INFLATER_SERVICE) 메소드를 사용해서 부분화면까지도 직접 메모리에 객체화를 해야 한다. ( 직접 인플레이션 과정을 거쳐야 한다는것을 이해해야한다)

  • 인플레이션 예시)
FrameLayout은 한화면에 하나를 추가 할 수 있다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1. 부분 화면을 만들 sumb1.xml 파일을 생성한다.
 
실제로는 전체화면이 아닌데 전체화면인것처럼 보여준다.
우리가 만들것은 전체화면중에서 부분화면을 우리는 만들게 될것이다. 
 
2. 위젯을 추가한다
LinearLayout 안에
여기서 우리가 추가할것들은
TextView 위젯, Button 위젯 추가
Background 도 바꿔주고 
 
이렇게 우리는 부분화면을 만들게 되었다.
이것을 어떻게 사용할것인가?
 
3. activity_main.xml 파일로 돌아온다.
 
여기서 FrameLayout의 ID 값을 container로 설정해준다.
왜 container로 설정하는가? 하면 다른것들을 담고있는 영역을 확보했을 때 많이 쓰이는 ID
 
4. MainActivity.java 로 이동
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class MainActivity extends AppCompatActivity {
    FrameLayout container;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // FrameLayout
 
        // 다른곳에서 쓸수 있도록 전역 변수로 선언 시켜준다.
        container = (FrameLayout) findViewById(R.id.container);
        // 이제 부분화면을 Container화면에 붙여주기로 하자
 
 
        // 버튼을 찾기
 
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
                // 레이아웃의 내용을 객체화 시키는 과정
                LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                inflater.inflate(R.layout.sub1,container,true);
                //1. 파라미터 어디 위치에있는것을 , 2. 확보한 공간 , 3. true (바로 붙여 달라)
 
            }
 
        });
 
    }
}
cs
==> 코드 설명 : MainActivity의 FrameLayout의 이름은 container로 지정하였으므로, 이제 아까전에 만든 sumb1.xml파일에 있는 화면을 가져오려고 한다. 이때, FrameLayout의 container를 담고 있는 객체를 생성 시키고, getSystemService() 함수를 이용해서 상수의 값을 받아온다. 그리고 LayoutInflater 로 객체를 생성하여, 인플레이션객체를 생성한다. 그 인플레이션 객체를 이용 inflate()메서드를 사용하면 ( 1. 파라미터 : 어디 위치에 있는것 2. 확보한 공간 3. true 바로 붙일것인지 여부)를 입력하면 자연스럽게 화면이 붙는것을 확인 할 수 있다.
이때, 인플레이션을 하고 나면 그안에 들어있는 위젯들을 이용해서 찾아 내서 사용할 수 있다. 중요함!!!





공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함