반응형
이전 포스팅에서 api 통신을 하였는데, 결과값으로 이미지를 받을것이다.
해당 이미지를 뿌려주기 위한 activity를 꾸며보자
1. activity_main 수정
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/imgDog"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:contentDescription="@string/dog_image"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="30dp"
android:layout_marginBottom="100dp"
android:layout_marginStart="32dp"
android:layout_marginEnd="32dp"/>
<ProgressBar
android:id="@+id/pbDog"
android:layout_width="100dp"
android:layout_height="100dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
<ImageView
android:id="@+id/imgRefresh"
android:layout_width="50dp"
android:layout_height="50dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintEnd_toEndOf="parent"
android:src="@drawable/ic_refresh"
android:contentDescription="@string/refresh"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imgDog"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
이미지 소스는 적당한것을 붙여넣거나, 아래 깃주소에 해당 프로젝트 올려놨으니 참고!
https://github.com/Daseul727/mobile_sample/tree/main/network_mobile
2. data binding 설정
data binding이랑 이미지 로드 라이브러리를 사용하기 위해 build.gradle 을 수정해야한다
android {
namespace 'com.example.network_sample'
compileSdk 34
...
//추가
buildFeatures {
viewBinding = true
dataBinding true
}
}
dependencies {
...
//추가
/*image load*/
implementation "io.coil-kt:coil:$coilVersion"
}
coilVersion 은 1.2.2 를 사용했다
3. MainActivity 수정
1) view data binding
우선 activity_main과 연결하기위해 바인딩을 시켜준다
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var mainViewModel: MainViewModel
//추가
private lateinit var _binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//추가
_binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(_binding.root)
}
위에서 build.gradle에 데이터바인딩 사용설정이 성공적으로 완료되었다면 ActivityMainBinding 이 자동완성으로 import 될것이다.
그리고 onCreate 에서 한번더 _binding을 inflate 시켜주면 초기화 완료
2) api 연결
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var mainViewModel: MainViewModel
private lateinit var _binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
_binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(_binding.root)
}
//추가
private fun fetchResponse() {
mainViewModel.fetchDogResponse()
_binding.pbDog.visibility = View.VISIBLE
}
이전 포스팅에서 model에 만들었던 함수를 호출하자
3) observer 추가
이제 실제로 fetchresponse 를 호출해볼건데, 해당함수 호출되어 model 의 "response"에 값이 담기면,
담기는것을 observe 하고있다가 화면에 데이터를 뿌려주는 함수를 넣어준다.
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var mainViewModel: MainViewModel
private lateinit var _binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
_binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(_binding.root)
//추가
fetchData()
//추가
_binding.imgRefresh.setOnClickListener {
fetchResponse()
}
}
//추가
private fun fetchData() {
fetchResponse()
mainViewModel.response.observe(this) { res->
when (res) {
is NetworkResult.Success -> {
res.data?.let {
_binding.imgDog.load(
res.data.message
) {
transformations(RoundedCornersTransformation(16f))
}
}
_binding.pbDog.visibility = View.GONE
}
is NetworkResult.Error -> {
_binding.pbDog.visibility = View.GONE
Toast.makeText(
this,
res.message,
Toast.LENGTH_SHORT
).show()
}
is NetworkResult.Loading -> {
_binding.pbDog.visibility = View.VISIBLE
}
}
}
}
private fun fetchResponse() {
mainViewModel.fetchDogResponse()
_binding.pbDog.visibility = View.VISIBLE
}
}
이렇게하면 완성!
github주소
- showDog 프로젝트
728x90
'Mobile > Android' 카테고리의 다른 글
Kotlin - Android Navigation Component 사용과 Fragment 이동 (0) | 2024.04.09 |
---|---|
<data> 태그 사용법 (0) | 2024.04.02 |
Kotlin - Android Hilt 사용하여 앱 개발하기 (2) - Network 통신 (0) | 2024.03.28 |
Kotlin - Android Hilt 사용하여 앱 개발하기 (1) - Hilt 추가 (0) | 2024.03.28 |
Kotlin - Android 앱 개발하기 (5) - GNB 영역 추가 (0) | 2024.03.07 |