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

스위치로 다른 클래스 버튼 조작하기

0 추천

스위치는 MainActivity에 만들었고, 버튼은 Fragment에서 생성했습니다.

스위치를 클릭할 때, 버튼을 나타나거나 또는 다시 사라지도록 하려고 하는데 어떻게 해야 할까요?

(참고로 프래그먼트에서는 버튼을 onCreateView 내부에 view 객체를 이용해서 생성했습니다.)

대충 아래처럼 생각하긴 했는데 잘 안되네요.

Fragment fragment = new Fragment();
switchView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked){
            fragment.btn.setVisibility(View.INVISIBLE);
        }else {
            fragment.btn.setVisibility(View.VISIBLE);
        }
    }
});
걍 취미로 (230 포인트) 님이 2022년 8월 31일 질문

3개의 답변

0 추천
먼저 스위치가 같은 프레그먼트에 위치하면 안되는 것인지 궁금하네요. 안된다면,
FragmentManager를 통해 해당 프레그먼트를 찾으세요. 찾은 다음에는 그 프레그먼트의  public method를 호출하세요. 이 public method에 필요한 동작을 넣으시면 됩니다. FragmentManager 사용은 개발자 문서를 찾조하세요.
https://developer.android.com/guide/fragments/fragmentmanager
spark (224,800 포인트) 님이 2022년 8월 31일 답변
spark님이 2022년 8월 31일 수정
답변 감사합니다. 스위치를 main에서 사용한 이유는, 스위치 클릭 한번으로 여러 프래그먼트에 접근하기 위해서, 저렇게 만들었습니다.
2종류의 method가 main에 있고, 이 메소드를 여러 프래그먼트에서 접근해서 사용을 하는데요. 스위치를 이용해서 토글을 할 때, 각각 다른 메소드가 프래그먼트에서 적용될 수 있도록 하기 위해서 조금 이상하게 만들었습니다.
0 추천
Fragment fragment = new Fragment();

이렇게 호출하시면 새로운 프래그먼트를 만들게 됩니다.

이미 만들어 놓으신 버튼이 있는 프래그먼트가 있다면 다른분이 말씀해주셨듯 FragmentManager를 통해 버튼이 있는 프래그먼트를 찾으시는게 좋을 것 같습니다.

want8607 (260 포인트) 님이 2022년 8월 31일 답변
안되는 것 같아요... 위에 내용에 보시면 Fragment fragment = new Fragment();
선언해서 하는 방법으로 이미 해보았습니다.
안 될리가요... getSupportFragmentManager().findFragmentBy... 를 사용해서 해보셨냐는 말인데.
0 추천

FragmentManager가 어려우면 액티비티를 특정 인터페이스를 등록할 수 있는 오저버블로 만드세요.

public interface MyObserver {
     void onToggleChanged(boolean isChecked);
}

public interface MyObserable {
     void addObserver(MyObserver observer);
     void removeObserve(MyObserver observer);
}

public class MyActivity implements MyObserable {
    private Set<MyObserver> observers = new HashSet<>();


    ...
    
    switchView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        notifyToggleChanged(isChecked);
    }
});
     ...

    @Override
    public void addObserver(MyObserver observer) {
          observers.add(observer);
    }

   @Override
    public void removeObserve(MyObserver observer) {
          observers.remove(observer);
    }

    private void notifyToggleChanged(boolean isChecked) {
          for (Myobserver observer : observers) {
               observer.onToggleChanged(isChecked);
          }
    }
}

 

그리고 프레그먼트들은 observer로 등록하게 하세요.

public class MyFragment extends Fragment implements MyObserver {
     
      private MyObservable observable;

     @Override
     public void onAttach(Context context) {
            super.onAttach(context);
           observable = (MyObservable) context;
     }


    @Override
    public void onViewCreated(...) {
         super.onCreated(...)
         observable.addObserver(this);
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        observable.removeObserver(this);
    }

     @Override
     public void onToggleChanged(boolean isChecked) {
           int visibiity = isChecked ? View.INVISIBLE : View.VISIBLE;
           btn.setVisibiity(visibiity);
     }
}

 

spark (224,800 포인트) 님이 2022년 9월 2일 답변
...