2017-01-19 10 views
0

PreferenceActivity에 2 SwitchPreference을 사용하려고했습니다. PreferenceActivity의 처음 시작에서 모든 것이 정상적으로 작동합니다. 활동이 문제없이 시작되면 settings.xml이 표시됩니다. ClassCastException으로 앱을 닫을 때마다 PreferenceActivity을 닫거나 SwitchPreference의 상태를 변경하려면 문제가 발생합니다. 이것은 dafaultValue 세트가 없어도 발생합니다. 그 후 앱이 PreferenceActivity을 열려고 시도하면 앱이 종료됩니다. 지금까지는 저장된 값을 프로그래밍 방식으로 액세스/영향을 미치지 않습니다. 지금은 테스트 목적으로 설정 화면을 표시하기 만하면됩니다. 메뉴 항목이SwitchPreference는 어떻게 사용 되나요? (ClassCastException)

final Intent i = new Intent(this, SettingsActivity.class); 
       startActivity(i); 

를 통해 호출 활동에 클릭 된 경우 활동은 내가 부울 능숙를 정의하고 SwitchPreference의의 DEFAULTVALUE을 설정을 사용하거나 방법을 사용하는 등 여기에 명시된 다른 제안 방법을 시도 시작됩니다

PreferenceManager.setDefaultValues(this, R.xml.settings, false); 

주요 활동 그 접근법 중 어느 것도 효과가 없었습니다. SwitchPreference가 예외를 초래하지 않고 하나의 상태를 저장할 수 없다면 어떻게 사용하려고합니까? 환경 설정이 작동하도록 특정 xml 속성을 정의해야합니까?

ClassCastException이

E/AndroidRuntime: FATAL EXCEPTION: main 
         java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean 
          at android.app.SharedPreferencesImpl.getBoolean(SharedPreferencesImpl.java:242) 
          at android.preference.Preference.getPersistedBoolean(Preference.java:1637) 
          at android.preference.Preference.persistBoolean(Preference.java:1608) 
          at android.preference.TwoStatePreference.setChecked(TwoStatePreference.java:79) 
          at android.preference.SwitchPreference$Listener.onCheckedChanged(SwitchPreference.java:54) 
          at android.widget.CompoundButton.setChecked(CompoundButton.java:126) 
          at android.widget.Switch.setChecked(Switch.java:688) 
          at android.widget.CompoundButton.toggle(CompoundButton.java:87) 
          at android.widget.CompoundButton.performClick(CompoundButton.java:99) 
          at android.view.View$PerformClick.run(View.java:16966) 
          at android.os.Handler.handleCallback(Handler.java:615) 
          at android.os.Handler.dispatchMessage(Handler.java:92) 
          at android.os.Looper.loop(Looper.java:137) 
          at android.app.ActivityThread.main(ActivityThread.java:4745) 
          at java.lang.reflect.Method.invokeNative(Native Method) 
          at java.lang.reflect.Method.invoke(Method.java:511) 
          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
          at dalvik.system.NativeStart.main(Native Method) 

PreferenceActivity를

public class SettingsActivity extends PreferenceActivity{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.addPreferencesFromResource(R.xml.settings); 
    } 
} 

Settings.XML의

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    [...] 
    <PreferenceCategory 
     android:title="@string/sett_not_header"> 
     <SwitchPreference 
      android:key="@+id/sett_not_on" 
      android:title="@string/sett_not_act_header" 
      android:summary="@string/sett_not_act_summ" 
      android:defaultValue="true"/> 
     <SwitchPreference 
      android:key="@+id/sett_not_mute" 
      android:title="@string/sett_not_mute_header" 
      android:summary="@string/sett_not_mute_summ" 
      android:defaultValue="true"/> 
    [...] 
    </PreferenceCategory> 

</PreferenceScreen> 
+0

'string.xml'에서 환경 설정을 선언했습니다. res 폴더에 xml 폴더를 만들고 환경 설정 xml을 추가하십시오. –

+0

settings.xml은 res/xml 폴더에 있습니다. – SilverMonkey

답변

0

나는 예외의 원인을 추적 할 수 있었다 : 내가 잘못 사용되는 필드 android:key에서 을 표현은 @+id/은 ID 선언이 작동하는 것과 같은 방식으로 키 선언이 작동한다는 가정하에 사용됩니다. @+id/ 표현식을 제거하면 오류없이 SwitchPreference를 사용할 수있었습니다.