안드로이드 DialogFragment의 show함수에 문제가 생긴 경우
안녕하세요. 개발자 드리머즈입니다.
안드로이드에서 Custom Dialog Fragment 사용하다가 문제가 생겨서 정리합니다.
문제 현상
Fragment에서 Custom DialogFragment를 문제없이 잘 사용하고 있었습니다. 그런데 이 Custom DialogFragment를 Activity에서 사용하려고 하니 아래 사진과 같이 잘 사용하던 show함수를 찾을 수 없다는 에러가 발생했습니다.
Cannot resolve method 'show(android.app.FragmentManager, java.lang.String)'
원인
문제의 코드가 실행된 Activity는 android.app.Activity을 상속받는 Activity입니다. 따라서 이 Activity에서 getFragmentManager() 함수를 호출하게 되면 android.app.Activity에 존재하는 getFragmentManager() 함수가 호출됩니다. 이 함수의 리턴값은 android.app.FragmentManager입니다.
제가 만든 Custom DialogFragment는 android.support.v4.app.DialogFragment을 상속받는 클래스입니다. 일반 안드로이드 OS의 Framework에 속하는 android.app.DialogFragment를 상속받는 게 아니고 Support Library(지원 라이브러리)내 존재하는 DialogFragment를 상속받는 클래스입니다. 그래서 제가 만든 Custom DialogFragment에서 show함수를 호출하게 되면 android.support.v4.app.DialogFragment내의 show함수가 호출되며 이 함수에서 요구하는 parameter type을 정확하게 보면 아래와 같습니다.
1 | void show (android.support.v4.app.FragmentManager manager, String tag) | cs |
결국 show함수의 첫 번째 인자가 요구하는 type은 android.support.v4.app.FragmentManager인데 실제로 들어간 값은 android.app.FragmentManager로 요구하는 자료형이 들어오지 않았습니다. 패키지의 이름이 비슷하긴 하지만 정확하게 원하는 자료형의 FragmentManager가 사용되어야 합니다.
해결 방법
문제가 되는 자료형을 일치시켜주면 됩니다. 다음의 두 가지 방법 중 하나를 사용하면 됩니다.
1. Activity가 android.app.Activity가 아닌 android.support.v7.app.AppCompatActivity를 상속받게 합니다.
1 2 3 4 5 | import android.support.v7.app.AppCompatActivity; public class MyActivity extends AppCompatActivity { ...생략... } | cs |
그러면 이 Activity에서 getSupportFragmentManager()를 사용하면 이 함수의 리턴 타입이 android.support.v4.app.FragmentManager가 되어 show함수에서 요구하는 자료형과 일치하게 되어 문제가 해결됩니다.
2. Custom DialogFragment가 android.app.DialogFragment 클래스를 상속받도록 수정합니다.
1 2 3 4 5 | import android.app.DialogFragment; public class MyCustomDialogFragment extends DialogFragment { ...생략... } | cs |
그러면 show함수의 첫 번째 인자가 요구하는 자료형이 android.app.Fragment가 되어 Activity내에서 사용되는 getFragmentManager()가 리턴하는 자료형과 일치하게 되어 문제가 해결됩니다.
기타
그 동안 그냥 무턱대고 아무것이나 import 했었는데 앞으로는 import를 할 때 지원 라이브러리의 것을 사용할 지 아니면 일반 프레임워크 라이브러리를 사용할 지 고민을 해야겠습니다. 그리고 프로젝트내에서 사용하는 라이브러리를 통일시켜서 import하는 것이 좋아보입니다.
저는 지원 라이브러리 사용하는 것이 좀 어색했었는데 조금 사용해보니 지원 라이브러리가 가진 장점이 많아 웬만하면 지원 라이브러리를 사용하는 것이 좋을 것 같습니다.
댓글 영역