마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

중복 코드 정리, 프래그먼트를 매개변수로 받는 법(?)

0 추천
button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        No1Fragment no1Fragment = new No1Fragment();
        transaction.replace(R.id.frame, no1Fragment);
        transaction.commit();
    }
});

button2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        No2Fragment no2Fragment = new No2Fragment();
        transaction.replace(R.id.frame, no2Fragment);
        transaction.commit();
    }
});

안녕하세요 열심히 코딩 공부하고 있는 코린이입니다... 프래그먼트 공부중인데

No1Fragment, No2Fragment 자바 클래스를 만들었고 두 개의 버튼을 누르면 각각 프래그먼트에 연결해서 화면에 출력하는 소스인데요

위의 코드처럼 하면 잘 실행이 됩니다.

근데 버튼 메소드 안에서 프래그먼트 인스턴스 만드는거 빼고 코드가 중복되는것 같아 간결하게 하고 싶어서

메소드 한개를 만들어 담을려구 합니다

button1.setOnClickListener(new View.OnClickListener() {
    // private No1Fragment fragment1; // private Class fragment1;
    // pirvate No2Fragment fragment2; // private Class fragment2;
    @Override
    public void onClick(View v) {
        startFragment(fragment1);
    }
});

button2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        startFragment(fragment2);
    }
}); 
public startFragment() {
}

제가 생각했던 방식이 이런 코드였는데요!

 

 

private No1Fragment fragment1;​

No1Fragment 객체 그대로 선언을 하면

startFragment(No1Fragment a, No2Fragment b)

startFragment의 매개변수를 객체 그대로 받아야하니까

틀린 방식인 것 같구....

 

 

private Class fragment1;

Class타입의 인스턴스 객체로 선언을 하면

startFragment(Class getFragment)

이런식으로 한 개만 받을 수 있어서 좋지만

버튼 클릭에 따라 메소드 안에서 getFragment를 No1Fragment No2Fragment로 각각 지정하는건 무리가 있어보여서요...

 

잘모르겠습니다 선배님.... 선배님들의 지식을 저에게 좀만 빌려주세요 ㅠㅠ

popoplz (160 포인트) 님이 2020년 5월 13일 질문

2개의 답변

0 추천
button1.setOnClickListener(mOnClickListener);
button2.setOnClickListener(mOnClickListener);

View.OnClickListener mOnClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
		switch (view.getId()) {
			case R.id.button1:
			    startFragment(fragment1);
				break;
				
			case R.id.button2:
			   startFragment(fragment2);
				break;
		}
    }
});

startFragment(Fragment fragment) {
...
}

를 의도하신게 아닐까요?

 

다음과 같이도 가능합니다.

        class StartFragmentOnClickListener implements View.OnClickListener {
            private Class<? extends Fragment> mFragment;

            public StartFragmentOnClickListener(Class<? extends Fragment> fragmentClass) {
                mFragment = fragmentClass;
            }

            @Override
            public void onClick(View v) {
                try {
                    startFragment(mFragment.newInstance());
                } catch (Exception e) {

                }
            }
        }

        button1.setOnClickListener(new StartFragmentOnClickListener(No1Fragment.class));
        button2.setOnClickListener(new StartFragmentOnClickListener(No2Fragment.class));
    }

 

디자이너정 (42,810 포인트) 님이 2020년 5월 13일 답변
디자이너정님이 2020년 5월 13일 수정
0 추천
No1Fragment와 No2Fragment 부모 클래스를 매개변수로 사용하면 됩니다.
노예의집 (23,370 포인트) 님이 2020년 5월 14일 답변
...