Skip to content

dbmina/seminar1

Repository files navigation

seminar1

1. 다른 화면으로 이동할 경우

first_button.setOnClickListener{ val Intent= Intent(this,MainActivity2::class.java ) startActivity(Intent)

}

Intent 객체를 만들어서 이동하고 싶은 Activity를 적어준다! 이 경우 MainActivity2로 이동하는 것!

2. 미리보기 글씨 만들기

android:hint="비밀번호 EditTextView"

EditText안에 hint 속성으로 글씨를 써준다! 이렇게 쓰면 미리보기 속성으로 글씨가 나오게 된다

3. 회원가입시 정보가 다 채워졌는지 판별

editText1 = findViewById(R.id.Edittext) editText2 = findViewById(R.id.editText) editText3 = findViewById(R.id.editText2)

button2.setOnClickListener { if (editText1?.length() != 0 && editText2?.length() != 0 && editText3?.length() != 0) {
Toast.makeText(this, "회원가입성공", Toast.LENGTH_SHORT).show() val intent = Intent(this, MainActivity3:: class.java) startActivity(intent) }

else { Toast.makeText(this, "빈칸이 있습니다", Toast.LENGTH_SHORT).show() }

각각의 editText를 findViewByID로 해서 받아온 이후 length()를 사용하여 사용자가 정보를 입력했는지 판별

또한 if 문안에 정보가 채워졌을 경우에만 intent 객체를 넘기면 사용자가 모든 정보를 입력했을때만 다른 화면으로 넘어가는 것을 구현할 수 있다

로그인 화면 구현

디자인을 고려하여 로그인 화면 구현

회원가입 화면 구현

4. Recyclerview data 만들때 guideline 적용하기

각각의 데이터를 라인에 맞추어 정리하고 싶으면 guideline을 사용하는 방법이 있다.

<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="167dp" />

이런식으로 guideline 코드를 작성해준 뒤,

텍스트뷰의 시작을 guideline으로 하고 싶으면 app:layout_constraintStart_toStartOf="@+id/guideline" 이런식으로 코드를 작성해주면 된다

5. Recyclerview의 component

-반복적으로 보여질 아이템의 xml 작성 (activity_data.xml)
-아이템에 대한 데이터 객체 만들기(ProfileData)
-데이터 뷰에 쁘려주는 역할인 ViewHolder 만들기 (ProfileViewHolder)
-데이터를 각 아이템들에게 전달하는 역할인 Adapter 만들기 (ProfileAdapter)
-Recyclerview (activity_main3.xml)
-Adapter 추가

RecyclerView 화면 구현

6. RecyclerView에서 각 item을 누르면 다른 화면으로 전환하는 것 구현

-ProfileAdapter에 val itemClick: (ProfileData)->Unit 추가

class ProfileAdapter (private val context: Context, val itemClick: (ProfileData)->Unit): RecyclerView.Adapter()

override fun onBindViewHolder(holder: ProfileViewHolder, position: Int) { holder.onBind(data[position], itemClick) }

onBindViewHolder에 itemCLick 추가

-ViewHolder의 class 수정

class ProfileViewHolder (itemView: View, itemClick:(ProfileData)->Unit): RecyclerView.ViewHolder(itemView)-

onBind 함수 수정

fun onBind(data: ProfileData,itemClick:(ProfileData)->Unit){ title.text=data.title subtitle.text=data.subtitle itemView.setOnClickListener { itemClick(data) } }

-MainActivity3 class 수정

val profileAdapter=ProfileAdapter(this ){ProfileData-> startActivity(Intent(this, ItemActivity::class.java)) }

Bottom navigation view, Tab layout 구현 먼저 bottom navigation view를 위해서는 원하는 개수만큼의 fragment를 만든 후 이를 convert to linear layout 시킨다. 다음 menu directory에 가서 원하는 아이템의 개수만큼 아이템의 태그를 넣어준다. 각 아이템은 drawable 파일에서 resource file을 추가시켜주면 된다. activity file에 가서 각 탭을 클릭했을 때 일어나는 이벤트 처리 listener를 설정해주는 것이 필요하다. 또한 sample_bottom_navi_setOnNavigationItemSelectedListener{} 안에 각 아이템 별 인덱스를 설정해줌으로써, 뷰페이저의 current Item의 값을 변화시켜주는 것이 필요하다 이렇게 하면 하단탭을 눌렀을때 작동은 잘 되지만 슬라이드 이후에 탭의 변경이 잘 되지 않기 때문에 ViewPager 페이지 변경에 대한 리스너가 필요하다 이는 BottomNav kotlin file에 addOnPageChangeListener라는 함수를 통해서 구현하였다

**BottomNavigation 안에 recyclerview 구현하기 ** override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState)

    val profileAdapter=ProfileAdapter(context!! )

    rcv.adapter=profileAdapter
    rcv.layoutManager= LinearLayoutManager(context!!)
    profileAdapter.data= mutableListOf(
        ProfileData("이름", "안녕안녕"),
        ProfileData("나이", "22"),
        ProfileData("파트", "Android"),
        ProfileData("Github","link in bio"),
        ProfileData("음식", "떡볶이")
    )

    profileAdapter.notifyDataSetChanged()

}
위의 코드처럼 recyclerview를 구현한 것에서 약간의 수정만 해주면 가능하다. 

BottomNavigationView 구현예시

두번째 화면의 경우 recycler view이기 때문에 아래로 스크롤 하면 더 많은 화면이 등장한다!

Tab Layout 구현방식

하단탭을 만들고 싶을때 bottom navigation view를 사용했다면, 상단탭을 만들기 위해서는 Tab layout을 사용하는 것이 일반적이다. 이를 위해서는 xml 코드 안에 <com.google.android.material.tabs.TabLayout 로 시작하는 tablayout을 적어주면 된다. 아니면 버튼처럼 끌어와서 위치시켜도 무방하다. 이후 각 탭을 작성했을 때 새로운 화면을 보여주고 싶다면 sample_tab.setupWithViewPager( sample_tab_viewpager) sample_tab. apply{ getTabAt 0 text =info getTabAt 1 text =others} 이런식으로 코드를 넣어주면 된다

Tab Layout 구현

POSTMAN 테스트 :서버에 이상이 없는지 체크

Reftrofit Interface 구현 코드

interface SampleService{
@Headers("Content-Type:application/jason")
@POST("/users/signin")
fun postLogin(
@Body body: SampleRequestData
):Call
}

싱글톤으로 만드는 구현체 코드

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)  

}

Request Data 코드

data class SampleRequestData(

val email: String,  
val password: String  

)

Response Data 코드
data class SampleResponseData(

val data: Data,  
@SerializedName("message")  
val message: String,  
val status: Int,  
val success: Boolean  

) {

data class Data(  

    val email: String,  
    val password: String,  
    val userName: String  
)  

}

Main Activity Kotlin 파일 구성코드

override fun onCreate(savedInstanceState: Bundle?) {

    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    first_button.setOnClickListener{


        val email_=email.text.toString()
        val password_=password.text.toString()
        val call :Call<SampleResponseData>
        call=SampleServiceImpl.service.postLogin(
        SampleRequestData(email = email_, password = password_)
        )
      call.enqueue(object :Callback<SampleResponseData>{
         override fun onFailure(call: Call<SampleResponseData>, t:Throwable){

         }
          override fun onResponse(
              call: Call<SampleResponseData>,
              response:Response<SampleResponseData>
          ){
             response.takeIf { it.isSuccessful }
                 ?.body()
                 ?.let{it->
                     Toast.makeText(this@MainActivity, "${it.data.userName}님, 안녕하세요", Toast.LENGTH_SHORT).show()
                     Log.d("success", "통신성공")
                     val intent=Intent(this@MainActivity, BottomNav::class.java)
                     startActivity(intent)
                 }?:showError(response.errorBody())
          }
      }
      )


    }



    }
    
   }

서버통신의 결과

값이 들어오지 않을 경우

로그인 성공

회원가입 성공

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages