2015-11-04 10 views
7

Jestem nowy na Androida i śledzę kurs programowania deweloperów Udacity Android. Jestem w rozdziale 3, gdzie uczą o dodawaniu ustawień w swojej aplikacji. Dodałem SettingActivity ze studia Android. Kiedy klikam menu ustawień, moja aplikacja ulega awarii. To jest mój plik pref_general.xmlWyjątek czasu wykonywania podczas korzystania z Ustawień w systemie Android (podążam za kursami programistycznymi udacity Android)

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 

<!-- NOTE: EditTextPreference accepts EditText attributes. --> 
<!-- NOTE: EditTextPreference's summary should be set to its value by the activity code. --> 
<EditTextPreference 
    android:key="@string/pref_location_key" 
    android:defaultValue="@string/pref_location_default" 
    android:maxLines="1" 
    android:inputType="text" 
    android:selectAllOnFocus="true" 
    android:singleLine="true" 
    android:title="@string/pref_location_label" /> 

dokonaniu tych zmian w SettingActivity

protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setupActionBar(); 
addPreferencesFromResource(R.xml.pref_general); 
bindPreferenceSummaryToValue(findPreference(getString(R.string.pref_location_key)));} 

jestem coraz następujący wyjątek po kliknięciu menu Ustawienia

Process: com.example.android.sunshine.app, PID: 10131 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.sunshine.app/com.example.android.sunshine.app.SettingsActivity}: java.lang.RuntimeException: Modern two-pane PreferenceActivity requires use of a PreferenceFragment 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2339) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413) 
at android.app.ActivityThread.access$800(ActivityThread.java:155) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5343) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) 

Caused by: java.lang.RuntimeException: Modern two-pane PreferenceActivity requires use of a PreferenceFragment 
at android.preference.PreferenceActivity.requirePreferenceManager(PreferenceActivity.java:1441) 
at android.preference.PreferenceActivity.addPreferencesFromResource(PreferenceActivity.java:1511) 
at com.example.android.sunshine.app.SettingsActivity.onCreate(SettingsActivity.java:124) 
at android.app.Activity.performCreate(Activity.java:6010) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2292) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413)  
at android.app.ActivityThread.access$800(ActivityThread.java:155)  
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317)  
at android.os.Handler.dispatchMessage(Handler.java:102)  
at android.os.Looper.loop(Looper.java:135)  
at android.app.ActivityThread.main(ActivityThread.java:5343)  
at java.lang.reflect.Method.invoke(Native Method)  
at java.lang.reflect.Method.invoke(Method.java:372)  
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)  
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) 

Każda pomoc? Przepraszam, jeśli to była bardzo naiwna rzecz:

Odpowiedz

4

Udało mi się to rozwiązać.
Zmieniam ustawienie OnCreate w mojej SettingActivity zamiast zmieniać moją OnCreate of SettingFragment, która jest statyczną prywatną klasą SettingActivity.

+0

Cna Państwo podzielić się przykładem dla niego? –

0

@mayank Agrawal

Miał na myśli, że zmiany mają być wykonane w klasie, która rozciąga PreferenceFragment. tzn. musisz albo rozszerzyć PreferenceFragment.

Mimo że kod jest dość objaśniający na Developers site, tutaj podjąłem część tego, by wspomnieć o tym, co miał na myśli (umieszczając komentarze w kodzie).

public class PreferenceWithHeaders extends PreferenceActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ...   
    } 
      //static class extending PreferenceFragment 

    public static class Prefs1Fragment extends PreferenceFragment { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      PreferenceManager.setDefaultValues(getActivity(), 
        R.xml.advanced_preferences, false); 

      // Here's where you've to load the preferences from an XML resource 
      addPreferencesFromResource(R.xml.fragmented_preferences); 
     } 
    } 


    private void private void bindPreferenceSummaryToValue(Preference preference) { 
     ... 
    } 
} 

Jeśli Twoja aplikacja obsługuje interfejs API 10 lub ma niską wartość, konieczne jest użycie działania preferencji. Możesz jednak użyć tego nieaktualnego sposobu również na nowym interfejsie API. Oto nice explanation in details dla początkujących.

(ja też uczę się. Więc jeśli ekspert ktoś znajdzie jakiś błąd to proszę dać mi znać.)

Powiązane problemy