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
-
댓글 입력