엑티비티에 이에서 엑티비티에 붙어서 (기생?) 화면에 띄어지는데 무조건 엑티비티의 위에 포개어져서 띄워지기 때문에 엑티비티의 레이아웃에 포개어질 view를 만들어 줘야한다
프레그먼트는 화면의 전환이 일어나지 않고도 새로운 화면이 나타나서 부드러운 조작이 가능하다고 한다. 큰 화면을 사용하는 테블릿 같은경우에 화면을 효율적으로 사용 할 수있다.
엑티비티를 사용하여 화면을 분할사용 할 수도 있지만, 비효율적이라고 한다.
두잇 안드로이드에서 프레그먼트의 목적을
1)분할된 화면들을 독립적으로 구성하기 위해 사용
2)분할된 화면들의 상태를 관리하기 위해 사용 한다고 함.
이번에는 연습으로 1)화면 전체를 나타내는 프레그먼트끼리 전환시키기 2) 2개의 프레그먼트를 동시에 띄우는 것 3)프래그먼트 안의 프래그먼트를 띄우는 것을 보고 생명주기가 어떻게 되는가 확인 해 볼 것이다.
1. 화면 전체에 띄어지는 프레그먼트끼리의 화면 전환해보기
1) 우선 프레그먼트의 코틀린파일과 xml파일을 만들어 준다.
프레그먼트의 xml은 단순하게 화면전화이 가능한 버튼과 프레그먼트 조작을 위한 화면으로 돌아가는 버튼을 만들어 주자!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?xml version="1.0" encoding="utf-8"?> <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" tools:context="com.example.practice_activity.activity_for_fragment"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/forfragment" android:background="#007BFF" > </androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
|
중요한건 fragment가 들어갈 view의 id를 정해주는 것이다 나는 forfragment라는 constraintview위에 올릴것임
사용할 버튼들을 만들어 준다.
돌아가기 버튼의 경우 전에 사용하던 엑티비티 전환하는 프로젝트랑 같은 파일에 구성해서 만든것임!
2) 만들어야 하는 파일
위와 같이 fragment를 관리해줄 activity를 만들고 그 activity안에서 사용할 fragment1,2를 만들어 준다. 그리고 그 화면을 구성하는 xml파일도 만들어 줘야한다.
3) 엑티비티.코틀린
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
class activity_for_fragment : AppCompatActivity() { fun change (whatpage : Int){ if (whatpage == 0){ supportFragmentManager.beginTransaction().replace(R.id.forfragment,fragment_full1()).commit() } else if (whatpage ==1){ supportFragmentManager.beginTransaction().replace(R.id.forfragment,fragment_full2()).commit() } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding : ActivityForFragmentBinding = DataBindingUtil. setContentView(this,R.layout.activity_for_fragment)
binding.backbutton.setOnClickListener { finish() } binding.fullfragment.setOnClickListener { change(0) } } } |
우선 activity.kotlin파일에 다음과 같이 change라는 메소드를 만들어 화면전환이 가능하도록 만들어 준다.
설명을 붙이자면 whatpage라는 값이 0이라면 첫번째 fragment가 나타나고, 1이라면 두번쨰 fragment가 나타난다
여기에 전체화면프레그먼트 라는것을 클릭하면 whatpage에 0이 나타나게 클릭에 대한 응답을 설정하여 첫번째 페이지가 나타나게 만들었다.
4)xml파일
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="example.practice_fragment.fragment_full1"> <data/> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="#A79292" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/otherfragmnet1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="프레그먼트전환" /> <Button android:id="@+id/backbutton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="돌아가기" /> </LinearLayout> </FrameLayout> </layout>
|
fragmet.xml
2개의 화면을 다음과 같이 2개의 버튼으로 구성되게 만들었다.
하나는 프레그먼트를 관리하는 엑티비티로 돌아가는 버튼이고, 하나는 다른 프레그먼트의 화면으로 가는 버튼이다.
5)fragment.코틀린
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
class fragment_full1 : Fragment() { lateinit var bind : FragmentFragmentFull1Binding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { bind = DataBindingUtil.inflate(inflater, R.layout.fragment_fragment_full1,container,false) bind.backbutton.setOnClickListener { fragmentManager?.beginTransaction()?.remove(this)?.commit() } bind.otherfragmnet1.setOnClickListener { (context as activity_for_fragment).change(1) } return bind.root } } |
위와 같이 버튼에 대해서 클릭리스너를 설정해 준다.
엑티비티에서 만들었던 메소드를 가지고 와서 사용하는 방법을 찾느라 한참이 걸렸는데.... 저렇게 사용한다고 한다.
(context as 엑티비티클레스).메소드
다른 하나의 fragment도 저런식으로 만들어 주면 됨
6) 결과
이렇게 만들면 프레그먼트 전환 버튼을 누르면 프레그먼트의 전환이 일어난다. 그런데 back stack시에는 ondestroyview에서 멈춘다는데 저런식으로 만들면 ondetach까지 일어나서 어떻게 해야 backstack이 되는지 좀더 알아봐야겠다.
화면 전환이 일어나더라도 activity는 onresume상태로 유지된다. 너무 길어지는거 같아서 따로 리사이클러뷰를 공부해서 2개의 프레그먼트를 띄우는건 다시 글써야겠다..
'두잇 안드로이드 따라하기' 카테고리의 다른 글
1.activity 화면 전환해보기! (0) | 2019.11.17 |
---|
엑티비티에 이에서 엑티비티에 붙어서 (기생?) 화면에 띄어지는데 무조건 엑티비티의 위에 포개어져서 띄워지기 때문에 엑티비티의 레이아웃에 포개어질 view를 만들어 줘야한다
프레그먼트는 화면의 전환이 일어나지 않고도 새로운 화면이 나타나서 부드러운 조작이 가능하다고 한다. 큰 화면을 사용하는 테블릿 같은경우에 화면을 효율적으로 사용 할 수있다.
엑티비티를 사용하여 화면을 분할사용 할 수도 있지만, 비효율적이라고 한다.
두잇 안드로이드에서 프레그먼트의 목적을
1)분할된 화면들을 독립적으로 구성하기 위해 사용
2)분할된 화면들의 상태를 관리하기 위해 사용 한다고 함.
이번에는 연습으로 1)화면 전체를 나타내는 프레그먼트끼리 전환시키기 2) 2개의 프레그먼트를 동시에 띄우는 것 3)프래그먼트 안의 프래그먼트를 띄우는 것을 보고 생명주기가 어떻게 되는가 확인 해 볼 것이다.
1. 화면 전체에 띄어지는 프레그먼트끼리의 화면 전환해보기
1) 우선 프레그먼트의 코틀린파일과 xml파일을 만들어 준다.
프레그먼트의 xml은 단순하게 화면전화이 가능한 버튼과 프레그먼트 조작을 위한 화면으로 돌아가는 버튼을 만들어 주자!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?xml version="1.0" encoding="utf-8"?> <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" tools:context="com.example.practice_activity.activity_for_fragment"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/forfragment" android:background="#007BFF" > </androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
|
중요한건 fragment가 들어갈 view의 id를 정해주는 것이다 나는 forfragment라는 constraintview위에 올릴것임
사용할 버튼들을 만들어 준다.
돌아가기 버튼의 경우 전에 사용하던 엑티비티 전환하는 프로젝트랑 같은 파일에 구성해서 만든것임!
2) 만들어야 하는 파일
위와 같이 fragment를 관리해줄 activity를 만들고 그 activity안에서 사용할 fragment1,2를 만들어 준다. 그리고 그 화면을 구성하는 xml파일도 만들어 줘야한다.
3) 엑티비티.코틀린
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
class activity_for_fragment : AppCompatActivity() { fun change (whatpage : Int){ if (whatpage == 0){ supportFragmentManager.beginTransaction().replace(R.id.forfragment,fragment_full1()).commit() } else if (whatpage ==1){ supportFragmentManager.beginTransaction().replace(R.id.forfragment,fragment_full2()).commit() } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding : ActivityForFragmentBinding = DataBindingUtil. setContentView(this,R.layout.activity_for_fragment)
binding.backbutton.setOnClickListener { finish() } binding.fullfragment.setOnClickListener { change(0) } } } |
우선 activity.kotlin파일에 다음과 같이 change라는 메소드를 만들어 화면전환이 가능하도록 만들어 준다.
설명을 붙이자면 whatpage라는 값이 0이라면 첫번째 fragment가 나타나고, 1이라면 두번쨰 fragment가 나타난다
여기에 전체화면프레그먼트 라는것을 클릭하면 whatpage에 0이 나타나게 클릭에 대한 응답을 설정하여 첫번째 페이지가 나타나게 만들었다.
4)xml파일
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="example.practice_fragment.fragment_full1"> <data/> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="#A79292" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/otherfragmnet1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="프레그먼트전환" /> <Button android:id="@+id/backbutton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="돌아가기" /> </LinearLayout> </FrameLayout> </layout>
|
fragmet.xml
2개의 화면을 다음과 같이 2개의 버튼으로 구성되게 만들었다.
하나는 프레그먼트를 관리하는 엑티비티로 돌아가는 버튼이고, 하나는 다른 프레그먼트의 화면으로 가는 버튼이다.
5)fragment.코틀린
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
class fragment_full1 : Fragment() { lateinit var bind : FragmentFragmentFull1Binding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { bind = DataBindingUtil.inflate(inflater, R.layout.fragment_fragment_full1,container,false) bind.backbutton.setOnClickListener { fragmentManager?.beginTransaction()?.remove(this)?.commit() } bind.otherfragmnet1.setOnClickListener { (context as activity_for_fragment).change(1) } return bind.root } } |
위와 같이 버튼에 대해서 클릭리스너를 설정해 준다.
엑티비티에서 만들었던 메소드를 가지고 와서 사용하는 방법을 찾느라 한참이 걸렸는데.... 저렇게 사용한다고 한다.
(context as 엑티비티클레스).메소드
다른 하나의 fragment도 저런식으로 만들어 주면 됨
6) 결과
이렇게 만들면 프레그먼트 전환 버튼을 누르면 프레그먼트의 전환이 일어난다. 그런데 back stack시에는 ondestroyview에서 멈춘다는데 저런식으로 만들면 ondetach까지 일어나서 어떻게 해야 backstack이 되는지 좀더 알아봐야겠다.
화면 전환이 일어나더라도 activity는 onresume상태로 유지된다. 너무 길어지는거 같아서 따로 리사이클러뷰를 공부해서 2개의 프레그먼트를 띄우는건 다시 글써야겠다..
'두잇 안드로이드 따라하기' 카테고리의 다른 글
1.activity 화면 전환해보기! (0) | 2019.11.17 |
---|