signup_btn.setOnClickListener {
val intent = Intent(this, SignUpActivity::class.java)
startActivity(intent)
}
-
setOnClickListener๋ ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํด์ฃผ๋ ๋ฉ์๋๋ก signup_btn(ํ์๊ฐ์ ) button์ ๋๋ฅด๋ฉด { }์์ ์ฝ๋๋ฅผ ์คํํ๋ค.
-
Intent ์์ฑ - Intent( context, ํธ์ถํ ์กํฐ๋นํฐ :: class.java ) startActivity( )์ ์์ฑํ Intent๊ฐ์ฒด๋ฅผ ํ๋ผ๋ฏธํฐ ๊ฐ์ผ๋ก ๋ฃ์ด์ ํธ์ถํ๋ฉด ํธ์ถํ
์กํฐ๋นํฐ๋ก ํ๋ฉด์ด ์ ํ๋๋ค.
fun signUp(){
signup_btn.setOnClickListener {
if(et_name_signup.text.isNullOrBlank() || et_id_signup.text.isNullOrBlank() || et_pwd_signup.text.isNullOrBlank() || et_pwdcheck_signup.text.isNullOrBlank()){
Toast.makeText(this, "๋น ์นธ์ด ์์ต๋๋ค.", Toast.LENGTH_SHORT).show()
}
else{
if(et_pwd_signup.text.toString().equals(et_pwdcheck_signup.text.toString())){
Toast.makeText(this, "ํ์๊ฐ์
์ด ์๋ฃ๋์์ต๋๋ค.", Toast.LENGTH_SHORT).show()
}
else{
Toast.makeText(this, "๋น๋ฐ๋ฒํธ๊ฐ ๋ค๋ฆ
๋๋ค.", Toast.LENGTH_SHORT).show()
}
}
}
}
- isNullOrBlank( )๋ฅผ ์ด์ฉํด EditTextView์ ๋ฐ์ดํฐ๊ฐ ์๋์ง ํ์ธ ํ๋๋ผ๋ ์๋๊ฒฝ์ฐ : ๋น์นธ์ด ์๋ค๋ ToastMessage ์ถ๋ ฅ ๋ชจ๋ ์๋ ๊ฒฝ์ฐ: ํ์๊ฐ์ ์ด ์๋ฃ๋์๋ค๋ ToastMessage ์ถ๋ ฅ
- ํ์๊ฐ์ ์ ์ฑ๊ณตํ๋ฉด ์ด์ ๋ก๊ทธ์ธ ํ๋ฉด์ผ๋ก ๋์์ค๊ธฐ
- ํ์๊ฐ์ ํ ์์ด๋์ ๋น๋ฐ๋ฒํธ๊ฐ ์ ๋ ฅ๋์ด ์๊ธฐ
fun gotoSignUp() {
signup_btn.setOnClickListener {
val intent = Intent(this, SignUpActivity::class.java)
startActivityForResult(intent, REQUEST_SIGNUP)
}
}
- startActivity : ์ ์กํฐ๋นํฐ๋ฅผ ์ด์ด์ค๋ค. (๋จ๋ฐฉํฅ)
- startActivityForResult : ์ ์กํฐ๋นํฐ๋ฅผ ์ด์ด์ฃผ๊ณ ๊ฒฐ๊ณผ๊ฐ์ ์ ๋ฌํ๋ค.(์๋ฐฉํฅ)
- RequestCode: ์กํฐ๋นํฐ๋ฅผ ์๋ณํ๊ธฐ ์ํ ๊ฐ
< SignUpActivity>
intent.putExtra("id", et_id_signup.text.toString())
intent.putExtra("pwd", et_pwd_signup.text.toString())
setResult(Activity.RESULT_OK, intent)
finish()
- putExtra( ): ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์กํฐ๋นํฐ์ ์ ๋ฌํ๋ค.
- setResult( ): ํ์๊ฐ์ ์ ์๋ฃํ ๊ฒฝ์ฐ resultCode๋ฅผ Activity.RESULT_OK๋ก ์ค์ ํ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ฃผ์ด ์ฑ๊ณต์ ์ผ๋ก ํ์๊ฐ์ ์ด ๋์์์ ๋ณด์ฌ์ค๋ค.
< MainActivity>
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == Activity.RESULT_OK) {
when (requestCode) {
REQUEST_SIGNUP -> {
et_id_login.setText(data!!.getStringExtra("id").toString())
et_pwd_login.setText(data!!.getStringExtra("pwd").toString())
}
}
}
}
- OnActivityResult( ) ๋ฉ์๋๋ฅผ ํตํด ํธ์ถ๋ Activity์์ ์ ์ฅํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋๋ค.
- resultCode๊ฐ Activity.RESULT_OK์ด๊ณ requestCode๊ฐ REQUEST_SIGNUP์ธ ๊ฒฝ์ฐ ์ฆ ํ์๊ฐ์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ๊ฒฝ์ฐ ์ด์ ๋ก๊ทธ์ธ ํ๋ฉด์ ์์ด๋์ ๋น๋ฐ๋ฒํธ๊ฐ ์ ๋ ฅ๋์ด์๊ฒ ํ๋ค.
- ๋ก๊ทธ์ธ ๋ฒํผ์ ๋๋ฅด๋ฉด HomeActivity๋ก ์ด๋
- ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ ์๊ฐ id์ password๋ฅผ ๊ธฐ์ตํด์ ๋ค์ ๋ก๊ทธ์ธ ๋ ์๋๋ก๊ทธ์ธ
- ์๋๋ก๊ทธ์ธ์ ์ฑ๊ณตํ ๊ฒฝ์ฐ ์๋๋ก๊ทธ์ธ์ด ๋๋ค๋ ๋ฉ์์ง ์ถ๋ ฅ
sharedPreferences = getSharedPreferences("SHARED_PREF", Context.MODE_PRIVATE)
editor = sharedPreferences.edit()
- getSharedPreferences( )๋ฅผ ์ด์ฉํด SharedPreferences๊ฐ์ฒด ์์ฑ
- SharedPreferences๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด Editor ์ธํฐํ์ด์ค ์ฌ์ฉ
editor.putString("ID_REM", et_id_login.toString())
editor.putString("PWD_REM", et_pwd_login.toString())
editor.apply()
- Editor ๊ฐ์ฒด๋ฅผ ํตํด ์ํ๋ ๊ฐ์ key, value ํํ๋ก ์ ๋ ฅํ๊ณ apply( )๋ฅผ ํด์ฃผ๋ฉด ๋ฐ์ดํฐ ์ ์ฅ์ด ์๋ฃ๋๋ค. (ํ์!)
editor.clear()
editor.commit()
- clear()๋ฅผ ์ฌ์ฉํ๋ฉด SharedPreferences์ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋๊ณ ๋ณ๊ฒฝ ํ์๋ commit์ ํด์ค๋ค.
- RecyclerView์์ ๋ณด์ฌ์ค item Layout
- ๊ฐ ์์ดํ ์ ๋ค์ด๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ด์ Data Class
- ๋ฐ์ดํฐ๋ฅผ ๋ทฐ์ ๋ฟ๋ ค์ฃผ๋ ์ญํ ์ ViewHolder
- ์์ดํ ๋ง๋ค ๋ทฐํ๋๋ฅผ ์์ฑํ๊ณ ๊ทธ์ ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ Adapter
์ด๋ฏธ์ง์ Title๊ณผ Subtitle ํ์์ด ๋ณด์ฌ์ง๋ sample_item_list.xml์ ๋ง๋ ๋ค.
โ
data class SampleData(
val title : String,
val subTitle : String,
val date : String,
val detail : String
)
RecyclerView์์ ์ฌ์ฉ๋ title๋ณ์, subTitle ๋ณ์, date๋ณ์, detail๋ณ์๋ฅผ ๋ด์ ๋ฐ์ดํฐ์ ํ์ ๋ง๋ ๋ค.
class SampleViewHolder (iTemView : View) : RecyclerView.ViewHolder(iTemView){
private val title: TextView = iTemView.findViewById(R.id.item_title)
private val subtitle: TextView = iTemView.findViewById(R.id.item_subtitle)
fun onBind(data : SampleData){
title.text = data.title
subtitle.text = data.subTitle
}
}
findViewById( ) ๋ฅผ ์ฌ์ฉํด์ item Layout์์ ์ ์ํ item_title๊ณผ item_subtitle์ ์์๋ก ๊ฐ์ง๋ค. onBind( ) ๋ View์ Data Class์์ ์์ฑํ๋ title, subTitile์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ค๋ค.
๋ฐ๋์ ์ค๋ฒ๋ผ์ด๋๋ฅผ ํด์ค์ผ ํ๋ 3๊ฐ์ง ๋ฉ์๋
- onCreateViewHolder
- onBindViewHolder
- getItemCount
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SampleViewHolder {
val view = LayoutInflater.from(context).inflate(R.layout.sample_item_list,parent, false)
return SampleViewHolder(view)
}
๋ ์ด์์์ ๋ง๋ค๊ณ ํด๋น ์์ดํ ์ ๊ด๋ จ๋ ์๋ฃ๋ฅผ ๋ด์ ๋ทฐ ํ๋๋ฅผ ๋ง๋ ๋ค.
override fun getItemCount(): Int = data.size
๋ฆฌ์คํธ์ ํ์๋ ์์ดํ ์ ๊ฐ์๋ฅผ ๋ฆฌํดํ๋ค.
override fun onBindViewHolder(holder: SampleViewHolder, position: Int) {
holder.onBind(data[position])
holder.itemView.setOnClickListener {
val model = data.get(position)
var gTitle: String = model.title
var gSubTitle: String = model.subTitle
var gDate: String = model.date
var gDetail: String = model.detail
val intent = Intent(context, DetailActivity::class.java)
intent.putExtra("iTitle", gTitle)
intent.putExtra("iSubTitle", gSubTitle)
intent.putExtra("iDate", gDate)
intent.putExtra("iDetail", gDetail)
context.startActivity(intent)
}
}
๋ทฐ ํ๋๊ฐ ์ค์ ๋ก ์ฐ๊ฒฐ(bind)๋ ๋ ํธ์ถ๋๋ฉฐ ๊ฐ ์์ดํ ์ ๋๋ฅด๋ฉด ํด๋น ์์ดํ ์ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ๋ DetailActivity๋ก ๋ฐ์ดํฐ๋ค์ ๋๊ฒจ์ค๋ค.
RecyclerActivity
class RecyclerActivity : AppCompatActivity() {
private lateinit var sampleAdapter: SampleAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_recycler)
sampleAdapter = SampleAdapter(this)
main_rcv.adapter = sampleAdapter
main_rcv.layoutManager = LinearLayoutManager(this)
sampleAdapter.data = mutableListOf(
SampleData("์ด๋ฆ", "๋ฐํ์ง", "์๋
์์ผ: 1999.09.21", "์ฃผ์: ์ผ์ฐ๋๊ตฌ ๋ฐฑ์๋ ์ด๋๊ฐ")
)
sampleAdapter.notifyDataSetChanged()
}
}
RecycleView์ adapter์ sampleAdapter๋ก ์ ์ฉํ๊ณ RecyclerView๊ฐ ์์๋๋ก ๋ฐฐ์น๋๋๋ก LinearLayoutManager๋ก ์ค์ ํ๋ค. SampleAdapter์ ๋ฆฌ์คํธ๋ก ๋ณด์ฌ์ค ๋ฐ์ดํฐ(ํ์ดํ, ์๋ธํ์ดํ, ๋ ์ง, ์ธ๋ถ์ ๋ณด)๋ค์ ๋ฃ์ด์ฃผ๊ณ Adapter์ ๋ฐ์ดํฐ๊ฐ ์๋ก ๋ง๋ค์ด์ก์์ ์๋ ค์ค๋ค.
< SampleAdapter >
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SampleViewHolder {
val view = when(viewType){
1 -> LayoutInflater.from(context).inflate(R.layout.sample_item_list, parent,false)
2 -> LayoutInflater.from(context).inflate(R.layout.grid_item_list, parent,false)
else -> LayoutInflater.from(context).inflate(R.layout.sample_item_list, parent,false)
}
return SampleViewHolder(view)
}
override fun getItemViewType(position: Int): Int {
return num
}
** 3์ฃผ์ฐจ ํ์๊ณผ์ ์ดํ ์คํํด ์ฝ๋๊ฐ Fragment์ ์๋ค.
< SecondFragment>
override fun onCreateView(
...
setHasOptionsMenu(true)
...
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
var sub: Menu? = menu?.addSubMenu("sort")
sub?.add(Menu.NONE, Menu.FIRST + 3, Menu.NONE, "linear")
sub?.add(Menu.NONE, Menu.FIRST + 4, Menu.NONE, "grid")
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when(item?.itemId){
Menu.FIRST + 3 -> {
sampleAdapter.num = 1
main_rcv.layoutManager = LinearLayoutManager(context)
}
Menu.FIRST + 4 ->{
sampleAdapter.num = 2
main_rcv.layoutManager = GridLayoutManager(context, 2)
}
}
return super.onOptionsItemSelected(item)
}
onCreateView์์ ๊ผญ setHasOptionsMenu(true) ๋ฅผ ์จ์ผ fragment์์ menu๋ฅผ ์ฌ์ฉํ ์ ์๋ค. onCreateOptionsMenu์์ submenu๋ฅผ ์์ฑํด linear์ grid menu๋ฅผ ๋ง๋ค๊ณ onCreateViewHolder์์ num์ ๋๊ฒจ๋ฐ์ ๊ทธ์ ๋ฐ๋ฅธ linear, GridLayoutManager๊ฐ ์คํ๋๋๋ก ํ๋ค.
โ ํ์๊ณผ์ : ํ๋กํ ํ๋ฉด - ๋ฆฌ์ฌ์ดํด๋ฌ๋ทฐ ํ๋ฉด - ๋น์ด์๋ ํ๋ฉด 3๊ฐ๋ก ๊ตฌ์ฑ(20.11.02 ์๋ฃ)
- ํ๋์ ์กํฐ๋นํฐ๊ฐ ์ฌ๋ฌ ๊ฐ์ ํ๋ฉด์ ๊ฐ์ง ์ ์๊ฒ ํ๋ค.
- ํ๋ฉด์ ๋ถ์๋ณ๋ก ๋ฐ๋ก ๋์์ ์ํค๊ณ ์ถ์ ๋ ๊ฐ๊ฐ์ ํ๋ฉด์ ๋ถํ ํด์ ๋ ๋ฆฝ์ ์ธ ์ฝ๋๋ก ๊ตฌ์ฑํ ์ ์๋๋ก ๋์์ค๋ค.
- Activity์์ ์ฐจ์ด: Activity๋ ์๋๋ก์ด๋ ์์คํ ์ด ๊ด๋ฆฌํ๊ณ Fragment๋ ์กํฐ๋นํฐ๊ฐ ๊ด๋ฆฌํ๋ค.
- ํ๋์ ํ๋ฉด ์์์ ์ฌ๋ฌ๊ฐ์ง ํ๋ฉด์ ์ฌ๋ผ์ด๋ ํ์์ผ๋ก ๋ณด์ฌ์ค ๋ ์ฌ์ฉํ๋ค.
- ํ๋จ ํญ, ์๋จ ํญ๊ณผ ์ฐ๋ํ์ฌ ์ฌ์ฉํ๋ค.
- ํ๋จ ํญ์ ๋ง๋ค ๋ ์ฌ์ฉํ๋ค.
- ViewPager์ ์ฐ๋ํ์ฌ ํ๋ฉด๋ค์ ์ ํํ ์ ์๋ค.
- ํ๋ฉด์ด 3๊ฐ ์ด์์ผ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
- ์๋จ ํญ์ ๋ง๋ค ๋ ์ฌ์ฉํ๋ค.
- ViewPager์ ์ฐ๋ํ์ฌ ํ๋ฉด๋ค์ ์ ํํ ์ ์๋ค.
- BottomNavigationView์ ๋นํด์ ์์น ์ด๋์ด ์์ ๋กญ๋ค. ViewPager์ ์ฐ๋ํ์ฌ ํ๋ฉด๋ค์ ์ ํํ ์ ์๋ค.
First Fragment (ํ๋กํ ํ๋ฉด)
- SampleViewPagerAdapter2.kt
override fun getItem(position: Int): Fragment = when (position) {
0 -> Me_FirstFragment()
1 -> Me_SecondFragment()
else -> throw IllegalStateException("Unexpected position $position")
}
override fun getCount(): Int = 3
ViewPager Adapter๋ ๋๊ฐ์ง ๋ฉ์๋๋ฅผ ๋ฐ๋์ ์ค๋ฒ๋ผ์ด๋ ํด์ผ ํ๋ค.
- getItem() First Fragment ์๋จ ํญ์ ๋ค์ด๊ฐ ๋๊ฐ์ ํ๋๊ทธ๋จผํธ์ position์ ์ง์ ํ๋ค.
- getCount() Adapter์์ ๋ง๋ค ํ์ด์ง ์๋ฅผ ๋ฐํํ๋ค.
- FirstFragment.kt
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
sharedPreferences = view.context.getSharedPreferences("SHARED_PREF", Context.MODE_PRIVATE)
viewPagerAdapter2 = SampleViewPagerAdapter2(childFragmentManager)
sample_viewpager_2.adapter = viewPagerAdapter2
me_name.text = sharedPreferences.getString("USER_NAME", "")
sample_tab.setupWithViewPager(sample_viewpager_2)
sample_tab.apply {
getTabAt(0)?.text = "INFO"
getTabAt(1)?.text = "OTHER"
}
}
- supportFragmentManager : Activity์์ ViewPager๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- childFragmentManager: Fragment์์ ViewPager๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
ViewPagerAdapter๋ฅผ ํตํด ํ์ ๋ ํ๋๊ทธ๋จผํธ๋ค์ FirstFragment์ ์๋จ ํญ๊ณผ ์ฐ๋์์ผ ํ๋กํ ํ๋ฉด์ ์์ฑํ๋ค.
BottomNavigation ๊ณผ 3๊ฐ์ Fragment ์ฐ๋
- bottom_menu.xml
<item
android:id="@+id/menu_me"
android:icon="@drawable/ic_me"
android:title="Me"/>
<item
android:id="@+id/menu_portfolio"
android:icon="@drawable/ic_portfolio"
android:title="PortFolio"/>
<item
android:id="@+id/menu_setting"
android:icon="@drawable/ic_setting"
android:title="Setting"/>
BottomNavigation์ ๋ค์ด๊ฐ icon์ ๊ฐ์ ธ์จ ํ id๋ฅผ ์ง์ ํด์ค๋ค.
- bottom_navi_color.xml
<item android:color="#86C3BA" android:state_checked="true"/>
<item android:color="#9E9E9E" android:state_checked="false"/>
ํ์ฌ ๋ณด์ฌ์ฃผ๋ ํ๋ฉด์ ๋ฐ๋ผ item์ ์ํ์ ์์ ์ง์ ํ๋ค.
- RecyclerActivity.kt
//๋ทฐํ์ด์ง๋ฅผ ์ฌ๋ผ์ด๋ ํ์ ๋ ๊ทธ์ ๋์๋๋ ํ๋จ ํญ ๋ณ๊ฒฝ
sample_viewpager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) {}
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) {
}
override fun onPageSelected(position: Int) {
sample_bottom_navi.menu.getItem(position).isChecked = true
}
})
ViewPager์ ํ๋ฉด์ ํ์ ๊ฐ์งํ๋ ๋ฆฌ์ค๋ ์ ์ธํ๊ณ ViewPager์ ํ์ด์ง ์ค ํ๋๊ฐ ์ ํ๋ ๊ฒฝ์ฐ ๊ทธ์ ๋์๋๋ ํ๋จ ํญ์ ์ํ๋ฅผ ๋ณํ์ํจ๋ค.
// ํ๋จ ํญ์ ๋๋ ์ ๋ ๋ทฐํ์ด์ง ํ๋ฉด ๋ณ๊ฒฝ
sample_bottom_navi.setOnNavigationItemSelectedListener {
var index by Delegates.notNull<Int>()
when (it.itemId) {
R.id.menu_me -> index = 0
R.id.menu_portfolio -> index = 1
R.id.menu_setting -> index = 2
}
sample_viewpager.currentItem = index
true
}
๊ฐ ํญ์ ํด๋ฆญํ์ ๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ Listener ์ค์ ํ๊ณ bottom_menu.xml์์ ์ง์ ํ Item id๊ฐ์ ๊ฐ์ ธ์ viewpager์ currentItem์ ๋ฃ๋๋ค.
-
Retrofit Interface ์ค๊ณ
-
์๋ฒ Request / Response ๊ฐ์ฒด ์ค๊ณ
-
Retrofit Interface ์ค์ ๊ตฌํ์ฒด ๋ง๋ค๊ธฐ
-
Callback ๋ฑ๋กํ์ฌ ํต์ ์์ฒญ
Retrofit Interface ์ค๊ณ
interface SampleService {
@Headers("Content-Type:application/json")
@POST("/users/signup")
fun postSignup(
@Body body: RequestSignupData
):Call<ResponseSignupData>
@Headers("Content-Type:application/json")
@POST("/users/signin")
fun postLogin(
@Body body: RequestLoginData
): Call<ResponseLoginData>
}
์๋ณ URL์ Interface๋ก ์ค๊ณ
์๋ฒ Request / Response ๊ฐ์ฒด ์ค๊ณ
- RequestSignupData
data class RequestSignupData(
val email : String,
val password : String,
val userName : String
)
- ResponseSignupData
data class ResponseSignupData(
val data: Data,
val message: String,
val status: Int,
val success: Boolean
) {
data class Data(
val email: String,
val password: String,
val userName: String
)
}
- RequestLoginData
data class RequestLoginData(
val email : String,
val password : String
)
- ResponseLoginData
data class ResponseLoginData(
val data: Data,
val message: String,
val status: Int,
val success: Boolean
) {
data class Data(
val email: String,
val password: String,
val userName: String
)
}
Retrofit Interface ์ค์ ๊ตฌํ์ฒด ๋ง๋ค๊ธฐ
object SampleServiceImpl {
private const val BASE_URL = "http://15.164.83.210:3000"
private val retrofit : Retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
val service : SampleService = retrofit.create(SampleService::class.java)
}
์ฑ๊ธํค์ผ๋ก ๋ง๋๋ ์ค์ ๊ตฌํ์ฒด : ๊ฐ์ฒด๋ ํ๋๋ง ์์ฑํ๊ณ ํ๋ก์ ํธ ์ด๋์๋ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ค.
Callback ๋ฑ๋กํ์ฌ ํต์ ์์ฒญ
- Call < Type> : ๋น๋๊ธฐ์ ์ผ๋ก Type์ ๋ฐ์์ค๋ ๊ฐ์ฒด
- Callback < Type > : Type ๊ฐ์ฒด๋ฅผ ๋ฐ์์์ ๋ ํ๋ก๊ทธ๋๋จธ์ ํ๋
val email = et_id_login.text.toString()
val password = et_pwd_login.text.toString()
val call: Call<ResponseLoginData> = SampleServiceImpl.service.postLogin(
RequestLoginData(email = email, password = password)
)
call.enqueue(object : Callback<ResponseLoginData> {
override fun onFailure(call: Call<ResponseLoginData>, t: Throwable) {
// ํต์ ์คํจ ๋ก์ง
}
// ํต์ ์ฑ๊ณต ๋ก์ง
override fun onResponse(
call: Call<ResponseLoginData>,
response: Response<ResponseLoginData>
) {
response.takeIf { it.isSuccessful }
?.body()
?.let {
it.data.let { data ->
Toast.makeText(
this@MainActivity, "${data.userName}๋",
Toast.LENGTH_SHORT
).show()
editor.putString("USER_NAME", data.userName)
editor.putString("ID_REM", et_id_login.toString())
editor.putString("PWD_REM", et_pwd_login.toString())
editor.apply()
}
val intent = Intent(this@MainActivity, RecyclerActivity::class.java)
startActivity(intent)
} ?: showError(response.errorBody())
}
}
)
์์์ ๋ง๋ ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ์ด์ฉํด์ Call ๊ฐ์ฒด๋ฅผ ๋ฐ์์จ ํ enqueue๋ฅผ ํธ์ถํ์ฌ ์ค์ ์๋ฒ ํต์ ์ ๋น๋๊ธฐ์ ์ผ๋ก ์์ฒญํ๋ค.