Switch Preference의 상태를 Bind로 받을경우 다른 preference에 간섭하려면 어떻게 해야하나요?

조회수 1431회

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

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

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

public class SettingsActivity extends AppCompatPreferenceActivity {

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


    @Override
    public boolean onPreferenceChange(Preference preference, Object value) {
        //String stringValue = value.toString();
        //preference.setSummary(stringValue);


        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 boolean isXLargeTablet(Context context) {
    return (context.getResources().getConfiguration().screenLayout
            & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE;
}// isXLargeTablet(Context)


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)

private void setupActionBar() {
    ActionBar actionBar = getSupportActionBar();
    if (actionBar != null) {
        // Show the Up button in the action bar.
        actionBar.setDisplayHomeAsUpEnabled(true);
    }
}// setupActionBar()

@Override
public boolean onIsMultiPane() {
    return isXLargeTablet(this);
}// onIsMultiPane()


@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);

        //Preference startPrefrence = findPreference("select_start_map");
        //startPrefrence.setSelectable(false);
        //startPrefrence.setEnabled(false);

(SwitchPreference)findPreference("start_map_switch");

        setHasOptionsMenu(true);

        bindPreferenceSummaryToValue(findPreference("start_map_switch"));
    }// onCreate(Bundle)

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == android.R.id.home) {
            Log.d("TAG", "SettingsActivity -> Settings -> onOptionsItemSelected <- 클릭됨");
            startActivity(new Intent(getActivity(), MainActivity.class));
            return true;
        }
        return super.onOptionsItemSelected(item);
    }


    @TargetApi(Build.VERSION_CODES.M)
    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
        Log.e("TAG", "onPreferenceTreeClick::" + preference.getKey());

// Context context = getContext(); // context.startActivity(SettingsActivity.class); // startActivity(new Intent(Intent.ac, SettingsActivity.class));

        if (preference.getKey().equals("select_start_map")) {
            Log.e("TAG", "onPreferenceTreeClick:: preference.getKey().equals(select_start_map) 동일합니다");
        }

// return super.onPreferenceTreeClick(preferenceScreen, preference); return false; } } }

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • getPreferenceManager() 를 통해 findPreference() 를 호출 할 수 있습니다.

    private final Preference.OnPreferenceChangeListener l = new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                preference.getPreferenceManager().findPreference("your_preference")
                return false;
            }
        };
    
    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 감사합니다 위젯의 id를 찾는것처럼 preference.findPreference()로 찾는줄 알았는데 메니저 메소드를 한번더 호출해야 하네요 다시한번 감사드립니다 알 수 없는 사용자 2018.12.18 17:43

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)