안드로이드 프로그래밍[Kotiln Code]/안드로이드 초기 강좌

[안드로이드] 액티비티 4 ( 액티비티와 프래그먼트 통신 with inteface )

훈츠 2020. 4. 20. 20:34
반응형

 

안녕하세요. 훈츠입니다. 금일은 액티비티와 프래그먼트 간 인터페이스 하는법에 대해  포스팅 합니다.

 

액티비티와 프래그먼트 통신 구성 목차

액티비티에서 프래그먼트로 값을 보내기 위해서는, 프래그먼트 매니저를 통해 프래그먼트를 찾고, 그안에 함수를 호출하면 됩니다.

프래그먼트에서 액티비티로 값을 보내기 위해서는, 옵저버 패턴을 이용합니다.

리스너를 가지는 인터페이스를 선언후 그안에  구현부가 없는 함수를 선언 합니다.

그리고 인터페이스를 상속하는 클래스 변수를 선언후, 클래스 변수에서 함수를 호출 하여 값을 입력 합니다.

 

액티비티에서는 onAttachFragment 를 통해 해당하는 프래그먼트를 if 로 확인후, 해당하는 인터페이스를 익명객체로 붙여줍니다. 그리고 그안에서 함수를 오버라이드후 값을 받을 view를 연결해 줍니다.

 

  • MainActivity XML 구성
    • 에디트 텍스트 추가 : 프래그먼트로 보내기 위한 텍스트값 입력창
    • 버튼 추가 : 프래그먼트로 텍스트값 보내기 위한 버튼
    • 텍스트뷰 추가 : 프래그먼트로 부터 받은 텍스트값 출력
    • 프레임 레이아웃 추가 : 프래그먼트 구성을 위한 프레임 레이아웃

 

  • BlankFragment XML 구성
    • 버튼 추가 : 액티비티로 텍스트값 보내기 위한 버튼
    • 텍스트뷰 추가 : 액티비티로 부터 받은 텍스트값 출력

 

  • MainActivity KT 구성
    • 서포트 프래그먼트 매니저로, 프레임레이아웃에 View 바꾸기
    • 서포트 프래그먼트 매니저로, 아이디로 프래그먼트 찾은후, 프래그먼트내 펑션 이용.
    • onAttachFragment 함수 오버라이드후, 프래그먼트의 리스너함수를 익명객체로 호출후 함수 오버라이드하기

 

  • BlankFragment KT 구성
    • 액티비티에서 호출할 함수 구성
    • 액티비티에서 옵저버할 인터페이스 리스너 선언후 안에 함수 선언
    • 인터페이스를 상속한 변수 구성
    • 변수에서 함수를 호출 후 값 입력

 

전체 구성도

 

액티비티 코드

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
32
 
class MainActivity : AppCompatActivity() {
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
 
        bt_send.setOnClickListener(View.OnClickListener {
            supportFragmentManager.findFragmentById(R.id.blankFragment).let{
                if(it is BlankFragment){
                    it.setActivityText(inputText.text.toString())
                }
            }
        })
 
        supportFragmentManager.beginTransaction()
            .replace(R.id.blankFragment,BlankFragment())
            .commit()
    }
    override fun onAttachFragment(fragment: androidx.fragment.app.Fragment) {
        super.onAttachFragment(fragment)
        if(fragment is BlankFragment){
            fragment.onTextListener = object:BlankFragment.OnTextListener{
                override fun onTextChange(text: String?) {
                    fragmentText.setText(text)
                }
            }
        }
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

 

프래그먼트 코드

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 BlankFragment : Fragment() {
 
    interface OnTextListener{
        fun onTextChange(text:String?)
    }
    var onTextListener : OnTextListener? = null
 
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_blank, container, false)
    }
 
    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        bt_confirm.setOnClickListener{
            onTextListener?.onTextChange("확인되었습니다.")
        }
    }
 
    fun setActivityText(text: String?){
        activityText.setText(text)
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

 

출력 화면

https://youtu.be/Okrq0A4IqRU

 

코드 공유

https://github.com/rain2002kr/ActivityExam4_interfaceWithFragment.git

 

rain2002kr/ActivityExam4_interfaceWithFragment

액티비티와 프래그먼트 통신 예제입니다. Contribute to rain2002kr/ActivityExam4_interfaceWithFragment development by creating an account on GitHub.

github.com

 

반응형