개발 Tip
BaseActivity로 액티비티, 프래그먼트 전환 메서드 재사용 하기
삐질
2019. 5. 17. 22:34
안녕하세요. 삐질삐질 개발하는 개발자 삐질입니다.
오늘은 흔히 액티비티와 프래그먼트를 전환하는데 있어
아주 간단하고 유용한 팁을 소개하고자 합니다.
- 액티비티 스타트 메서드
- 프래그먼트 교체 메서드
코드는 아래와 같습니다.
BaseActivity.kt
open class BaseActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
fun replaseFragment(fragment: Fragment, tag: String) {
supportFragmentManager.beginTransaction()
.replace(R.id.container, fragment, tag)
.addToBackStack(null)
.commit()
}
/* 자바에서 와일드카드로 쓰이는 <?>는 코틀린에선 <*>로 쓰인다 */
fun startNextActivity(className: Class<*>) {
var intent = Intent(this, className);
startActivity(intent)
}
}
BaseActivity.java
public class BaseTestActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public void replaseFragment(Fragment fragment, String tag){
getSupportFragmentManager().beginTransaction()
.replace(R.id.container,fragment,tag)
.addToBackStack(null)
.commit();
}
public void startNextActivity(Class<?> className) {
Intent intent = new Intent(this, className);
startActivity(intent);
}
}
어때요. 굉장히 간단하죠?
이렇게 BaseActivity 처럼 메서드를 선언 해 두었다면 아래와 같은 형태로 원하는 위치에서 사용이 가능해집니다.
MainActivity.kt
class MainActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
/* 액티비티를 스타트 시키고 싶은 경우 */
startNextActivity(TestActivity::class.java) //다음 액티비티를 제네릭으로 전달한다 .
/* 프래그먼트를 바꾸고싶은 경우 */
replaseFragment(HomeFragment.newInstance(),"HomeFragment")
}
}
MainActivity.java
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
startNextActivity(TestActivity.class);
replaseFragment(HomeFragment.newInstance(),"HomeFragment");
}
}
또한 이렇듯 Child 관계에 있는 프래그먼트에서도 손쉽게 activity Instance 캐스팅을 통해 얼마든지 재사용이 가능합니다.
HomeFragment.kt
class HomeFragment : Fragment() {
companion object {
fun newInstance(): HomeFragment {
return HomeFragment()
}
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return super.onCreateView(inflater, container, savedInstanceState)
(activity as MainActivity).replaseFragment(HomeFragment.newInstance(),"Homefragment")
(activity as MainActivity).startNextActivity(MainActivity::class.java)
}
}
HomFragment.java
public class HomeFragment extends Fragment {
public static HomeFragment newInstance(){
HomeFragment homeFragment = new HomeFragment();
return homeFragment;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return super.onCreateView(inflater, container, savedInstanceState);
((MainActivity)getActivity()).replaseFragment(HomeFragment.newInstance(),"Homefragment");
((MainActivity)getActivity()).startNextActivity(MainActivity.class);
}
}
안드로이드 초보 개발자를 위해 아래와 같은 카카오 오픈톡을 운영 중입니다.
https://open.kakao.com/o/gn4xqQ6