땀이 삐질삐질 나는 개발 일기

BaseActivity로 액티비티, 프래그먼트 전환 메서드 재사용 하기 본문

개발 Tip

BaseActivity로 액티비티, 프래그먼트 전환 메서드 재사용 하기

삐질 2019. 5. 17. 22:34
안녕하세요. 삐질삐질 개발하는 개발자 삐질입니다.

오늘은 흔히 액티비티와 프래그먼트를 전환하는데 있어 

아주 간단하고 유용한 팁을 소개하고자 합니다.

  1. 액티비티 스타트 메서드

  2. 프래그먼트 교체 메서드


코드는 아래와 같습니다.

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



Comments