2013-03-08 1 views
1

필자는 안드로이드 앱에서 PreferenceActivty를 사용합니다. 호환성 이유 때문에 getPreferenceScreen() 메서드 및 코드에서 주로 CheckBoxPreference 및 SwitchPreference로 생성하는 일부 기본 설정 개체를 통해 사용합니다.기본 설정 자체가 PreferenceActivity에서 비활성화 됨

내 앱의 이전 버전까지 총 8 개의 환경 설정이 있었지만 모든 것이 정상적으로 작동했지만 이제 2 개의 환경 설정이 추가되었으며 정말 이상한 문제가 발생했습니다.

두 번째로 선호하는 것은 SwitchPreference입니다. 활동을 열면 그 활동이 점검됩니다. 실제로 아무 것도 변경하지 않고 화면을 스크롤하면 갑자기 값이 자동으로 OFF로 설정됩니다. PreChangeListener를 Preference에 추가하고 OnSharedPreferenceChangeListener를 구현하려고 시도했지만 결과가 동일합니다. 일단 해당 Preference가 화면에서 사라지면 OFF로 설정됩니다. OFF로 설정하면 값은 유지되고 변경 리스너는 호출되지 않습니다.

왜 이런 일이 일어날 수 있습니까? 나는 완전히 잃어버린 ...

미리 감사드립니다! 내가 호출 onResume 방법에 환경 설정이 TabActivity 안에 있기 때문에

controlWifiPreference = new CheckBoxPreference(this); 
controlWifiPreference.setKey(Constants.PREF_1_KEY); 
getPreferenceScreen().addPreference(controlWifiPreference); 

wifiPreference = new SwitchPreference(this); 
wifiPreference.setKey(Constants.PREF_2_KEY); 
getPreferenceScreen().addPreference(wifiPreference); 

:


내 환경 설정의 코드는 기본적으로 이쪽은에서 onCreate 방식에, 5 가지 설정을 5 회 반복 실시 모든 환경 설정에 대해 setChecked()가 값을 다시 설정하지만 꼭 필요한 것은 아닌지 잘 모르겠습니다.

그리고 마지막으로 setDependency 메서드를 작동시킬 수 없기 때문에 다른 것이 클릭 될 때 기본 설정을 활성화/비활성화하는 onSharedPreferenceChanged 메서드가 있습니다. 그것은이 같은 일이 (다시, 5 회 반복)입니다 :

당신이 TabActivity 내부 환경을 구현 나는 PreferenceActivity를 안에 내 자신의 IDE에서 코드를 확인하고 자사의 charm.If 같은 작업이 일부있을 필요가 어떻게
if (key.equals(controlWifiPreference.getKey())) { 
    wifiPreference.setEnabled(controlWifiPreference.isChecked()); 
} 
+0

환경 설정 코드를 표시하십시오. 이클립스에서 프로젝트 정리를 시도 했습니까? 다른 Android 버전을 사용해 보셨습니까? onScroll 리스너를 설치 했습니까? –

+0

답장 afterburner 주셔서 감사합니다, 원래 질문에 코드를 추가했습니다. 나는 같은 결과로 안드로이드 4.0, 4.1 및 4.2를 시도했다. SwitchPreference를 사용하고 있기 때문에 더 낮은 Android 버전을 사용하지 않았습니다. 그리고 나는 더 많은 것을 발견했습니다 ...SwitchPreference를 CheckBoxPreference로 바꾸면 값이 변경되지 않습니다. SwitchPreference 자체의 버그 일 수 있습니까? – LuTHieR

+0

TabActivity에서 환경 설정을 어떻게 구현 했습니까? –

답변

0

? 귀하의 활동 내부 pseudo prefences, 당신은 prefernces을 사용하지 말고 대신, 당신은 정상적인 양식 항목을 사용하여 수동으로 환경 설정에 그 값을 저장해야합니다. 내가 테스트 한 코드와 그 작동 ok :

public class PreferencesFromCode extends PreferenceActivity implements OnSharedPreferenceChangeListener {

private SwitchPreference switchPref; 
private CheckBoxPreference checkboxPref; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setPreferenceScreen(createPreferenceHierarchy()); 
} 

private PreferenceScreen createPreferenceHierarchy() { 
    // Root 
    @SuppressWarnings("deprecation") 
    PreferenceScreen root = getPreferenceManager().createPreferenceScreen(
      this); 

    // Inline preferences 
    PreferenceCategory inlinePrefCat = new PreferenceCategory(this); 
    inlinePrefCat.setTitle(R.string.inline_preferences); 
    root.addPreference(inlinePrefCat); 

    // Checkbox preference 
    checkboxPref = new CheckBoxPreference(this); 
    checkboxPref.setKey("checkbox_preference"); 
    checkboxPref.setTitle(R.string.title_checkbox_preference); 
    checkboxPref.setSummary(R.string.summary_checkbox_preference); 
    inlinePrefCat.addPreference(checkboxPref); 

    // Switch preference 
    switchPref = new SwitchPreference(this); 
    switchPref.setKey("switch_preference"); 
    switchPref.setTitle(R.string.title_switch_preference); 
    switchPref.setSummary(R.string.summary_switch_preference); 
    inlinePrefCat.addPreference(switchPref); 

    /* 
    * The Preferences screenPref serves as a screen break (similar to page 
    * break in word processing). Like for other preference types, we assign 
    * a key here so that it is able to save and restore its instance state. 
    */ 
    // Screen preference 
    PreferenceScreen screenPref = getPreferenceManager() 
      .createPreferenceScreen(this); 
    screenPref.setKey("screen_preference"); 
    screenPref.setTitle(R.string.title_screen_preference); 
    screenPref.setSummary(R.string.summary_screen_preference); 

    return root; 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    PreferenceManager.getDefaultSharedPreferences(this) 
      .registerOnSharedPreferenceChangeListener(this); 
    /* 
    * getPreferenceScreen().getSharedPreferences() 
    * .registerOnSharedPreferenceChangeListener(this); 
    */ 

} 

@Override 
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, 
     String key) { 
    Log.i("ghjg", "changed key is : " + key); 
    if (key.equals(checkboxPref.getKey())) { 
     switchPref.setEnabled(checkboxPref.isChecked()); 
    } 
} 
} 

그러나 onContentChanged()을 무시하고 어떤 결과가 발생하는지 확인할 수 있습니다.

관련 문제