액티비티와 프레그먼트의 아주 클래식컬한 메세지 교환방식은 interface를 사용하는 겁니다.
public class MyActivity extends AppCompatActivity implements MyFragmentListener {
@Override
public void onCheckBoxChecked() {
updateListView();
}
}
public class MyFragment extends Fragment {
private MyFragmentListener myFragmentListener;
@Override
public void onAttach (Context context) {
if (context instanceof MyFragmentListener) {
myFragmentListener = (FragmentListener) context;
return;
}
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean checked) {
if (myFragmentListener == null) {
Log.w("MyFragment", "Please implement interface if you want to talk to fragment");
return;
}
if (checked) {
myFragmentListener.onCheckBoxChecked();
}
}
}
public interface MyFragmentListener {
//님의 상황에 맞게 좀더 명료한 이름을 사용하세요.
public void onCheckBoxClicked() ;
}
다른 방법으로는 EventBus같은 전역적인 메세지 교환 방식을 사용하셔도 되는데, 이건 남용하면 곤란한 방식이고, 만약 ViewModel을 사용하신다면 액티비티와 ViewModel을 공유할 수도 있습니다.
질문과는 상관없지만, 눈에 띄어서... 아래처럼 유틸리티 메소드를 사용하시면 중복코드를 줄일 수 있을 것 같네요.
public static String checkedString(CompoundButton button) {
return button.isChecked() ? button.getText().toString() : "";
}
String checkedStrings = checkeString(cb_f1) + checkeString(cb_f2) + checkeString(cb_f3);