TIL #76

loci·2024년 7월 15일
0

TIL

목록 보기
73/103


백준 2442번
별찍기

별들을 출력할때 중앙정렬해서 출력하기

각줄마다 별의 n에서 개수만큼 빼준 값을 공백의 개수로 넣어준다.


나의 코드

fun main() {
    val n = readLine()!!.toInt()
    for (i in 1..n) {
        for (j in 1..n - i) {
             print(" ")
        }
        for (j in 1..2*i -1) {
            print("*")
        }

        println()
    }
}

Fragment

프래그먼트란

  • 액티비티 위에서 동작하는 모듈화된 사용자 인터페이스(액티비티에서 독립될 수 없음)
  • 여러 프래그먼트를 하나의 액티비티에 조합할 수도 있고, 하나의 프래그먼트를 여러 액티비티에서 재사용할 수 있음

데이터전달

  • Activity - 시스템의 액티비티 매니저에서 intent를 해석해 액티비티간 데이터를 전달
  • Fragment - 액티비티의 프래그먼트 매니저에서 메소드로 프래그먼트간 데이터를 전달

프래그먼트 생명주기

프래그먼트는 앱의 UI부분을 모듈화하여 재사용할 수 있도록 해주는 구성요소로 자체적인 생명주기를 가지고 액티비티의 생명주기와 밀접하게 연결되어있다.

  • onAttach() : 프래그먼트가 액티비티에 연결될 때 호출, 프래그먼트는 아직 액티비티와 연결되지 않음
  • onCreate() : 프래그먼트가 생성될 때 호출 (초기화작업, 리소스 바인딩 등 수행)
  • onCreateView() : 프래그먼트의 레이아웃을 인플레이트하는 곳(뷰를 생성하고 레이아웃 설정)
  • onActivityCreated(): 액티비티의 onCreate()가 완료된 후 호출(뷰 관련 초기화 수행)
  • onStart() : 프래그먼트가 사용자에게 보여질 준비가 되었을때 호출(필요 리소스할당 및 애니메이션 시작)
  • onResume() : 프래그먼트가 사용자와 상호작용할 수 있는 상태가 되었을때 호출(프래그먼트가 포그라운드에 있을때 실행된느 작업)
  • onPause() : 프래그먼트가 일시정지 되었을때 호출(상태저장, 스레드 중지 등 수행)
  • onStop() : 프래그먼트가 더이상 사용자에게 보이지 않을때 호출 (리소스 해제, 스레드 정지 등 수행)
  • onDestroyView() : 프래그먼트가 파괴될 때 호출 (프래그먼트의 상태를 정리하고 모든 리소스를 해제)
  • onDetach() : 프래그먼트가 액티비티로부터 분리될 때 호출(액티비티와 모든연결 해제)

프래그먼트 사용이유

Activity로 화면을 계속 넘기는 것보다 Fragment로 일부만 바꾸는 것이 자원이용량이 적어 속도가 빠르다.
1. Activity를 적게 만들수 있다.
2. Activity의 복잡도를 줄일 수 있다.
3. Fragment를 사용하면 재사용할 수 있는 레이아웃을 분리해서 관리가 가능하다.
4. 최소 1개의 Activity안에서 Fragment공간에 View만 집어넣으면 여러 Activity를 만들지 않아도 여러화면을 보여줄 수 있다.

Fragment 만들기

  • new -> fragment 로 fragment 생성
  • fragment xml 정의
<androidx.constraintlayout.widget.ConstraintLayout 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"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:background="#FF9800"  
    tools:context=".FirstFragment">  
  
    <!-- TODO: Update blank fragment layout -->  
    <TextView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="프래그먼트 1"        android:textSize="40sp"  
        app:layout_constraintBottom_toBottomOf="parent"  
        app:layout_constraintEnd_toEndOf="parent"  
        app:layout_constraintStart_toStartOf="parent"  
        app:layout_constraintTop_toTopOf="parent" />  
  
  
</androidx.constraintlayout.widget.ConstraintLayout>
  • Activity에서 fragment의 구역 설정
<FrameLayout  
    android:id="@+id/frameLayout"  
    android:layout_width="0dp"  
    android:layout_height="0dp"  
    android:layout_marginStart="10dp"  
    android:layout_marginEnd="10dp"  
    app:layout_constraintBottom_toTopOf="@+id/btn1"  
    app:layout_constraintEnd_toEndOf="parent"  
    app:layout_constraintStart_toStartOf="parent"  
    app:layout_constraintTop_toTopOf="parent" />
  • kotlin코드에서 동적으로 Fragment 추가 (코드에서는 setFragemnt함수를 추가해서 설정)
class MainActivity : AppCompatActivity() {  
  
    private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }  
  
    override fun onCreate(savedInstanceState: Bundle?) {  
        super.onCreate(savedInstanceState)  
        enableEdgeToEdge()  
        setContentView(binding.root)  
        binding.apply {  
            btn1.setOnClickListener{  
                setFragment(FirstFragment())  
            }  
            btn2.setOnClickListener {  
                setFragment(SecondFragment())  
            }  
        }        setFragment(FirstFragment())  
  
    }  
  
    private fun setFragment(frag: Fragment){  
        supportFragmentManager.commit {  
            replace(R.id.frameLayout, frag)  
            setReorderingAllowed(true)  
            addToBackStack("")  
        }  
    }  
  
}

supportFragmentManager - 사용자 상호작용에 응답해 추가나 삭제 등 할 수 있게 해주는 매니저
replace - 어느 레이아웃에 어느 Fragment를 띄울 것인지 설정
setReorderingAllowed - 애니메이션과 전환이 올바르게 작동하도록 트랜잭션과 관련된 프래그먼트의 상태 변경을 최적화
addToBackStack - 뒤로가기 버튼 클릭시 다음 액션 (이전 Fragment로 가거나 앱을 종료)

전체코드 (github)


Error

supportFragmentManager설정 중에 commit이 비활성화된 문제발생

-> fragment dependencies 를 넣어줘야한다.

[versions]
fragement = "1.8.1"

[libraries]
androidx-fragment = { group = "androidx.fragment", name = "fragment-ktx", version.ref = "fragement" }

dependencies{
	implementation(libs.androidx.fragment)
}

name에 fragment를 넣었는데 안돼서 fragment-ktx로 바꿔주시 고쳐졌다.

profile
편리한 개발자

0개의 댓글