[안드로이드 프로그래밍] 방탈출 게임 7. 레이아웃을 이동해도 값이 유지되도록 만들기.

     

아이템 레이아웃 인벤토리, 혹은 힌트 그림이 있는 레이아웃에서 다른 레이아웃으로 이동했다가 다시 돌아와도 그림이나 값이 그대로 유지되는 것을 구현한다.





이렇거나 혹은




이런 기능을 원하면 꼼꼼히 읽어보자. (제발 ^^)



일단 액티비티가 생성되면 가장 먼저 실행되는 것은 onCreate()함수이다. 즉 onCreate()에 아이템 생성 코드를 넣으면 액티비티가 생성될때 아이템이 생성된다. 


그 말은 즉..


onCreate()에 사용자가 아이템을 먹었는지 안 먹었는지 검사해서 아이템을 보여줄건지 아닐건지 결정할 수 있다. 아이템이 아니더라고 보여주고 싶은 화면을 onCreate()에 만들어 놓으면 조건에 맞게 보여줄 수 있다.


일단 인벤토리를 만들어 보자.





 저 안드로봇 3마리는 아이템 1 2 3 이다. 





지금 이대로 실행하면 저 아이템들이 그대로 화면에 보인다. onCreate에서 조건을 만족하면 보이고, 아니면 안보이게 하는 코드를 작성할 필요가 있다.






일단 이미지뷰의 선언은 전역변수로 선언한다. 하지만 객체화는 메소드 안에서 해야 하기 때문에 onCreate()안에서 findViewById를 통해 객체화 한다. 


위 코드를 치면 부울변수가 false면 이미지를 invisible(투명)하게 부울변수가 true이면 그림을 보여준다. (부울변수는 static이어야 앱이 실행되고 계속해서 값을 저장하고 있는다.)


그렇다면 아이템을 얻었을 때 저 부울변수 값을 변하게하는 무엇인가가 필요하다. 새로운 함수를 만들자. (레이아웃에서 onclick을 할 필요는 없다. 그냥 순수한 함수이다.)




getItem1이라는 함수를 만들었다. 이함수가 실행되면 haveItem1이 true로 변해서 item1이 visible로 바뀐다. 이제 아이템을 클릭했을때 getItem1함수를 실행하면 된다. 하지만 getItem1이라는 함수는 인벤토리에 있는 함수이고, 아이템을 클릭하는 함수는 다른 자바파일에 있다. 따라서 인벤토리에 있는 getItem1을 쓰기 위해서는 그 자바파일을 객체화해야 한다. 




방화면에서 쪽지그림을 클릭하면 item1 함수가 실행된다. 이때 getItem1을 실행하고 싶으면 인벤토리 자바파일을 위와 같이 객체화해서 만들면 된다. 여기서는 메인액티비티가 인벤토리이기 때문에 MainActivity ma = new MainActivity();로 선언했다. 자신이 만든 인벤토리의 자바파일명으로 객체화 하면된다 (ex. 만약 inventory.java 일경우 inventory 변수명 = new inventory(); )


이렇게 하면 다른 java파일에서 만든 함수도 사용할 수 잇다. 같은 방법으로 여러개의 아이템을 만들 수 있다.








아이템이 아니라 자신이 입력한 값을 저장하고 싶으면 비슷한 방법을 사용한다. 이전에 만들었던 숫자 패드에서 숫자가 입력되었을 때, 레이아웃을 이동해도 숫자 값을 기억하도록 해보자.




위에 있는 텍스트뷰는 순서대로 tv1, tv2, tv3, tv4이다. 여기에 들어가는 각각의 숫자값을 기억하는 static String을 만들고, onCreate()에 넣으면 된다. 다음 코드를 보자.




onCreate()에 경우 위에 아이템과 같은 방법으로 값을 보여주게 했다. 하지만 이전 값을 기억하기 위해서는 어떻게 할까?

onCreate()와는 반대인 onDestroy()를 이용한다. onDestroy()는 액티비티가 종료될 때 자동으로 실행된다. 따라서 종료될때 텍스트 뷰에 숫자들을 저장하면 나중에 다시 켤때 그 값이 입력된다.



이 방법으로 했는데 값이 기억되지 않는다면, 액티비티를 종료하지 않아서이다. Intent는 액티비티를 이동하는 거지만 사실 새로운 액티비티를 생성하고 기존 액티비티 위에 쌓아 올리는 거다. 따라서 기존 액티비티를 종료하지 않고 계속 쌓이게 된다.




위 그림과 같이 인텐트는 계속해서 쌓이게 되기 때문에 메모리가 부족해서 앱이 비정상종료될 수 도 있다. 또한 이전에 A액티비티와 새로만든 A액티비티는 사실상 다른 액티비티이다. 따라서 이전 액티비티로 돌아갈 경우 finish()를 사용하는게 더욱 좋다.




이전액티비티로 돌아가는 것이 아니라 새로운 액티비티를 만들고 기존 액티비티를 종료하려면 다음과 같이 intent와 finish를 동시에 사용한다.





이것은 "액티비티의 생명주기"라고 하여 안드로이드 프로그래밍할 때 기본이 되는 내용이다.


반응형

댓글

Designed by JB FACTORY