방향 전환에 따라 가로, 세로 레이아웃을 보여줘야한다.
현재 디폴트로 세로 레이아웃이 나오므로, 가로 레이아웃을 만들어주겠다.
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 이런식으로 되어있었음.)
<실행 화면>
이름을 입력, 확인 버튼을 누른 뒤 방향 전환을 하면 입력한 내용 그대로 유지된 상태로 가로 레이아웃이 나타난다.
이와 같이 변수의 값을 유지시켜야 할 경우에는 위와 같은 방식으로 코드를 짜야하지만,
단순히 화면에 보이는 레이아웃만 바꾸고 싶다면 액티비티를 굳이 없앴다가 다시 만들 필요가 없기 때문에 다른 방법을 사용해서 구현할 수 있다.
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 |