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

Switch Preference의 상태를 Bind로 받을경우 다른 preference의 상태를 변화시키고 싶습니다.

0 추천

안드로이드앱을 만드는 도중 막히는 부분을 해결할 수 없어서 질문드립니다..

스위치의 true false 값에 따라 다른 Preference 의 enable 값을 변경시키고 싶은데 Bind 메소드 부분에서 findPreference 를 사용할 수가 없습니다.

onPreferenceChange 부분에서 넘겨받은 Preference가 SwitchPreference이고 SwitchPreference의 Object가 True라면 다른 Preference의 enable 속성을 false로 바꿔야 하는데 해결 방법을 모르겠습니다..

 

오버라이딩 된 onPreferenceCahnge 메소드에서 if문 2개로 구현을 하다가 막혀 있습니다.. 

 

public class SettingsActivity extends AppCompatPreferenceActivity {

    private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {

        @Override
        public boolean onPreferenceChange(Preference preference, Object value) {
            if (preference instanceof SwitchPreference) {
                String strValue = value.toString();
                if (strValue.equals("true")) {
                    Log.e("TAG", "onPreferenceChange:: " + strValue );
                }
            }
            return true;
        }// onPreferenceChange(Preference, Object)
    };// OnPreferenceChangeListener()


    private static void bindPreferenceSummaryToValue(Preference preference) {
       preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);

        if (preference instanceof SwitchPreference) {
            sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
                    PreferenceManager
                            .getDefaultSharedPreferences(preference.getContext())
                            .getBoolean(preference.getKey(), true));
        } else {
            sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
                    PreferenceManager
                            .getDefaultSharedPreferences(preference.getContext())
                            .getString(preference.getKey(), ""));
        }
    }// bindPreferenceSummaryToValue(Preference)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsPreferenceFragment()).commit();
        setupActionBar();
    }// onCreate(Bundle)
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public static class SettingsPreferenceFragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            Log.e("TAG", "SettingsPreferenceFragment::onCreate 작동함");
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.pref_settings);

            setHasOptionsMenu(true);

            //bindPreferenceSummaryToValue(findPreference("example_text"));
            bindPreferenceSummaryToValue(findPreference("start_map_switch"));
        }// onCreate(Bundle)
        @TargetApi(Build.VERSION_CODES.M)
        @Override
        public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
            Log.e("TAG", "onPreferenceTreeClick::" + preference.getKey());
            return false;
        }
    }
}

 

noway130 님이 2018년 12월 18일 질문
2018년 12월 18일 수정

1개의 답변

0 추천
 
채택된 답변

상위 설정에 의해 enable 값이 변경되는 부분은 보통 preference의 xml 부분에서 dependency 속성을 넣어주면 더 편하게 구현할 수 있습니다.

setting activity 상에서 소스로 구현 하게 하려면 해당 preference값을 pref.setEnabled(true)/pref.setEnabled(false) 상으로 구현하면 됩니다. 

커피콩 (3,640 포인트) 님이 2018년 12월 18일 답변
감사합니다 dependency 속성을 사용하니까 스위치의 true false 상태에 따라서 활성화 비활성화가 됩니다 정말 감사합니다
ㅎㅎ 아닙니다.

preference 구현의 대부분은 xml 파일에서 속성 부여하는 것으로 해결됩니다. 따로 신경쓸 필요도 없을정도로 간단하게 구현되기 때문에 xml 파일의 속성 부여로 구현하시고, 구현이 안되는 특별한 경우에만 settingActivity에서 구현하시면 됩니다.

또한 setting, 즉 preference의 경우는 본래는 PreferenceActivity로 만드는데 depreciate되었기 때문에 Activity 내부에서 Preference Fragment를 넣어서 만들어주시면 됩니다.
...