이미지가 클릭되었음을 프로그램에서 인식하기 위해선, 이미지에 대한 고유 식별자가 존재해야 한다. ImageView 태그에 id 속성을 추가해주자. id는 특징을 나타낼 수 있는 값이 좋으나, 지금은 사진의 특징이 별로 없기 때문에 그냥 파일 이름을 그대로 사용하겠다.
<ImageView
android:id="@+id/photo_1"
android:src="@drawable/photo_1"
android:layout_width="120dp"
android:layout_height="120dp"/>
이번엔 MainActivity 파일에 들어가 아래와 같이 코드를 작성한다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 화면 클릭을 인식
val image1 = findViewById<ImageView>(R.id.photo_1)
image1.setOnClickListener {
Toast.makeText(this, "1번 사진 선택", Toast.LENGTH_LONG).show()
}
}
}
① class MainActivity
② : AppCompatActivity()
③ fun
④ onCreate
※ Activity Lifecycle
생명주기는 액티비티가 생성되고 종료될 때 거치는 여러 단계를 나타내는 개념으로, 액티비티가 어떤 상태에 있는지를 시스템과 개발자에게 알려주는 역할을 수행한다. 생명주기는 아래와 같은 단계로 구성된다.
- onCreate(): 액티비티가 생성될 때
- onStart(): 액티비티가 사용자에게 보여지기 시작할 때
- onResume(): 액티비티가 사용자와 상호 작용(포커스)할 때
- onPause(): 액티비티가 포커스를 잃었을 때
- onStop(): 액티비티가 사용자에게 보이지 않을 때
- onDestroy(): 액티비티가 종료되기 전
- onRestart(): 액티비티가 onStop() 상태에서 다시 시작될 때
⑤ (savedInstanceState: Bundle?)
메서드의 파라미터를 정의한다.
savedInstanceState는 액티비티가 재생성되었을 때, 이전 상태 정보를 담고 있는 Bundle 객체를 나타낸다.
※ Bundle
Bundle은 key-value 쌍으로 데이터를 저장한다는 점에서 Map과 유사하다. Bundle은 안드로이드에서 사용되는 데이터 컨테이너로, 주로 액티비티 간에 데이터를 전달하거나 상태 정보를 저장하기 위해 사용된다. 데이터 식별에는 문자열 키가 사용되며, 주로 Intent에 데이터를 첨부하거나 onSaveInstanceState 메서드를 통해 상태 정보를 저장할 때 사용된다. 또한, 액티비티의 이전 상태를 복원하는 데 사용될 수도 있다.
Bundle?은 널(Null) 값이 허용되는 타입이므로, 이전 상태 정보가 없을 수도 있다.
즉, savedInstanceState라는 이전 상태 정보를 담은 Bundle 객체를 활용하여 액티비티의 초기화 작업을 수행하기 위해 작성된 부분이다.
⑥ super.onCreate(savedInstanceState)
⑦ setContentView(R.layout.activity_main)
⑧ findViewById<ImageView>(R.id.photo_1)
⑨ setOnClickListener
⑩ Toast.makeText(this, "1번 사진 선택", Toast.LENGTH_LONG).show()
코드를 실행시켜보면 아래와 같은 결과를 얻을 수 있을 것이다.
① 패키지 우 클릭 > New > Activity > Empty Views Activity 클릭
② Activity Name만 적절하게 바꿔주고, 나머지는 기본 값을 유지한 채 Finish 버튼을 클릭한다.
새롭게 생성된 xml 파일로 이동한 후, ConstraintLayout 컨테이너 안에 아래의 내용을 작성한다.
<ImageView
android:src="@drawable/photo_1"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
클릭 이벤트에 따라 화면 전환이 이루어질 수 있도록 코드를 작성해야 한다.
// 화면 클릭을 인식
val image1 = findViewById<ImageView>(R.id.photo_1)
image1.setOnClickListener {
Toast.makeText(this, "1번 사진 선택", Toast.LENGTH_LONG).show()
// 이미지를 크게 보여주는 화면으로 전환
val intent = Intent(this, PhotoAlbumActivity::class.java)
startActivity(intent)
}
① Intent
② class.java
③ startActivity(intent)
이제 코드를 실행한 후, 첫번째 사진을 클릭해보자. 아래와 같이 사진이 큰 화면으로 전환되어 나오면 실습을 성공적으로 마친 것이다.
PhotoAlbumActivity에 우클릭 > Refactor > Rename으로 이름을 Photo1Activity로 바꾸고, 추가적으로 Photo2Activity, Photo3Activity, Photo4Activity, Photo5Activity를 생성한다.
이제 똑같은 방식으로 5개의 사진에 대해 모두 클릭 이벤트와 화면 전환을 연결하면 포토 앨범이 완성된다.
① photo 1~5 xml 파일에 아래의 내용을 추가한다.
<ImageView
android:src="@drawable/photo_1"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
② activity_main.xml에서 사진의 id 속성을 입력한다.
<ImageView
android:id="@+id/photo_1"
android:src="@drawable/photo_2"
android:layout_width="120dp"
android:layout_height="120dp"/>
③ MainActivity에서 아래의 내용을 5번 붙여넣는다.
// 화면 클릭을 인식
val image1 = findViewById<ImageView>(R.id.photo_1)
image1.setOnClickListener {
Toast.makeText(this, "1번 사진 선택", Toast.LENGTH_LONG).show()
// 이미지를 크게 보여주는 화면으로 전환
val intent = Intent(this, Photo1Activity::class.java)
startActivity(intent)
}
④ 코드를 실행하면, 이제 모든 사진에 클릭 시 화면 전환이 적용된다.
코드 실행 시에 나오는 스마트폰이 창 모드로 열리는 것이 불편하다면 에뮬레이터를 분리하여 화면 위에 띄우는 것이 가능하다. 이 실습은 필수는 아니고, 필요에 따라 진행하기 바란다.
① File > Settings > Tools > Emulator를 클릭한다.
② Launch in a tool window 체크를 해제한다.
③ 안드로이드 스튜디오를 재부팅한다.
이제 결과가 아래와 같이 나올 것이다. 확실히 스마트폰이 화면 위에 떠있는 것이 사용하기에는 더 편리한 것 같다.