방향 전환에 따라 가로, 세로 레이아웃을 보여줘야한다.

현재 디폴트로 세로 레이아웃이 나오므로, 가로 레이아웃을 만들어주겠다.

 

1. app > res > New - Android Resource Directory로 새 폴더를 만들어준다.

 

2. 폴더의 Resource type을 layout으로 설정한 다음, 폴더명을 'layout-land'로 설정한다.

이 이름으로 설정해야 단말을 가로 방향으로 돌릴 때 이 폴더 안에 있는 레이아웃 파일을 우선적으로 적용하기 때문이다.

 

프로젝트 창에서 Andoird에서는 해당 폴더가 보이지 않으니, Project로 바꾼 뒤 app > src > main > res에 들어가면 있다.

 

3. layout 폴더의 activity_main.xml 파일을 복사하여 layout-land 폴더에다 붙여넣기 해준다. (이름은 바꾸지 않는다.)

 

4. 생명주기 메서드를 사용하여 화면 방향 전환에 따라 토스트를 띄운다.

생명주기 메서드(=수명 주기(Life Cycle)) : 화면의 상태에 따라 시스템이 자동으로 호출해주는 메서드

 

MainActivity에서 Generate > Override Methods로 onStart, onStop, onDestroy 메서드를 재정의 해준다.

 

<MainActivity.java>

package com.example.chapter3_4;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        showToast("OnCreate 호출됨.");
    }

    @Override
    protected void onStart() {
        super.onStart();
        showToast("onStart 호출됨.");
    }

    @Override
    protected void onStop() {
        super.onStop();
        showToast("onStop 호출됨.");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        showToast("onDestroy 호출됨.");
    }

    public void showToast(String data){
        Toast.makeText(this, data, Toast.LENGTH_LONG).show();
    }
}

 

위 코드대로 입력하면 실행 시 아래와 같이 나타난다.

 

방향이 전환 될 때마다 onCreate, onStart, onStop, onDestroy 메서드가 호출된다.

 

onCreate : 메모리에 액티비티가 만들어지는 시점(화면에 보이기 전)

onStart : 화면에 보이기 전에 호출

onStop : 화면이 보이다가 없어지면 호출

onDestroy : 메모리에서 없어지는 경우 호출

 

 

<문제 상황>

AVD 단말을 회전 시켰는데 화면 전환이 되지 않았다.

해결 : 저걸 눌러야 완전히 회전이 되는 것이었다.

 

토스트를 통해 우리는 방향 전환이 될 때마다 새로운 액티비티가 생겨나고(onCreate), 기존의 액티비티가 없어진다는 것(onDestory)을 알 수 있다.

그러나 기존과 같은 상태의 액티비티를 유지하고 싶다면?

액티비티를 계속 살려놓을 수는 없다. 그래서 액티비티가 죽을 때 해당 액티비티의 상태를 저장하여, 다음에 액티비티가 생성될 때 그 상태를 복원하는 방식으로 구현한다. (마치 복제인간처럼..)

 

onSaveInstanceState : 액티비티가 종료되기 전의 상태를 저장함

 

<MainActivity.java 위의 코드에 추가>

package com.example.chapter3_4;

public class MainActivity extends AppCompatActivity {

    String name;
    EditText editText;

    @Override
    public void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("name",name);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        showToast("OnCreate 호출됨.");

        //추가한 코드
        editText = findViewById(R.id.editTextText);
        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                name = editText.getText().toString();
                showToast("입력된 값을 변수에 입력했습니다 : "+name);
            }
        });

        if(savedInstanceState != null){
            name = savedInstanceState.getString("name");
            showToast("값을 복원했습니다 : "+name);
        }
    }
    /* ... 생략 ... */
}

 

사실 100% 이해는 못했다. 일단은 넘어가자

 

<문제 상황>

AVD 화면을 회전 시키자 앱이 강제종료됨.

해결 : activity_main.xml 파일 2개의 Button과 EditText의 id를 동일하게 맞춰줘야 한다.

(원래 button, button2 이런식으로 되어있었음.)

 

[안드로이드 스튜디오 강좌 #15] 이벤트 처리 이해하기 - 단말 방향 전환 이벤트 처리

! 목표 단말 방향을 전환 했을 때 화면 방향이 가로, 세로로 전환되는 이벤트를 알아보자 1. 단말 방향 변경 단말을 가로/세로 방향으로 바꿨을 때 가로 세로의 화면 비율에 따라 화면이 다르게

jlog1016.tistory.com

 

<실행 화면>

 

이름을 입력, 확인 버튼을 누른 뒤 방향 전환을 하면 입력한 내용 그대로 유지된 상태로 가로 레이아웃이 나타난다.

 

 

이와 같이 변수의 값을 유지시켜야 할 경우에는 위와 같은 방식으로 코드를 짜야하지만,

단순히 화면에 보이는 레이아웃만 바꾸고 싶다면 액티비티를 굳이 없앴다가 다시 만들 필요가 없기 때문에 다른 방법을 사용해서 구현할 수 있다.

 

1. app > manifest > AndroidManifest.xml 의 코드 내에서 <application> -> <activity> 안에 아래 코드를 추가한다.

android:configChanges="orientation|screenSize|keyboardHidden"

 

+ 만약 화면을 항상 가로 방향으로 고정하고 싶을 경우 이 코드를 추가하면 된다.

android:screenOrientation="landscape"

 

2. MainActivity.java에 onConfigurationChanged 메소드를 재정의한다. showToast 메서드도 만들어준다.

<MainActivity.java>

package com.example.chapter3_5;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    public void onConfigurationChanged(Configuration newConfig){
        super.onConfigurationChanged(newConfig);

        if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){
            showToast("방향 : ORIENTATION_LANDSCAPE");
        }
        else if(newConfig.orientation==Configuration.ORIENTATION_PORTRAIT){
            showToast("방향 : ORIENTATION_PORTRAIT");
        }
    }

    public void showToast(String data){
        Toast.makeText(this, data, Toast.LENGTH_LONG).show();
    }
}

 

이렇게 코드를 작성하면, 액티비티가 다시 만들어지지 않고 유지시킨 상태로 방향만 전환하는 것을 볼 수 있다.

 

<실행 화면>

 

'TIL > 안드로이드 스튜디오' 카테고리의 다른 글

3장 알림 대화상자 보여주기 (AlertDialog)  (0) 2024.11.28
3장 토스트와 스낵바 (냠냠)  (0) 2024.11.28
3장 이벤트 처리(터치, 제스처, 키)  (0) 2024.11.26
에러  (0) 2024.11.25
3장 드로어블  (0) 2024.11.22