2017-01-22 3 views
0

누군가 나를 도울 수 있습니까?Android 환경 설정 NullException

나는 안드로이드에서 begginer이고 어디에 내 잘못인지 모르겠다.

미리 감사드립니다.

오류 로그

01-22 11:45:32.722 13037-13037/com.example.android.sunshine.app E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.android.sunshine.app, PID: 13037 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.sunshine.app/com.example.android.sunshine.app.SettingsActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.preference.Preference.setOnPreferenceChangeListener(android.preference.Preference$OnPreferenceChangeListener)' on a null object reference 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2491) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2564) 
at android.app.ActivityThread.access$800(ActivityThread.java:170) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1441) 
at android.os.Handler.dispatchMessage(Handler.java:111) 
at android.os.Looper.loop(Looper.java:194) 
at android.app.ActivityThread.main(ActivityThread.java:5576) 
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:956) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:751) 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.preference.Preference.setOnPreferenceChangeListener(android.preference.Preference$OnPreferenceChangeListener)' on a null object reference 
at com.example.android.sunshine.app.SettingsActivity.bindPreferenceSummaryToValue(SettingsActivity.java:40) 
at com.example.android.sunshine.app.SettingsActivity.onCreate(SettingsActivity.java:30) 
at android.app.Activity.performCreate(Activity.java:6041) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1111) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2437) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2564)  
at android.app.ActivityThread.access$800(ActivityThread.java:170)  
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1441)  
at android.os.Handler.dispatchMessage(Handler.java:111)  
at android.os.Looper.loop(Looper.java:194)  
at android.app.ActivityThread.main(ActivityThread.java:5576)  
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:956)  
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:751)  

strings.xml의

<string name="app_name">Sunshine</string> 
<string name="hello_world">Hello world!</string> 
<string name="action_settings">Settings</string> 
<string name="action_refresh" translatable="false">Refresh</string> 
<string name="title_activity_detail">Details</string> 
<string name="title_activity_settings">Settings</string> 


<string name="pref_location_label" >Location</string> 

<string name="pref_location_key" translatable="false">location</string> 

<string name="pref_location_default" translatable="false">94043</string> 

SettingsActivity.java

import android.os.Bundle; 
import android.preference.ListPreference; 
import android.preference.Preference; 
import android.preference.PreferenceActivity; 
import android.preference.PreferenceManager; 

public class SettingsActivity extends PreferenceActivity 
     implements Preference.OnPreferenceChangeListener { 

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

     addPreferencesFromResource(R.xml.pref_general); 

     bindPreferenceSummaryToValue(findPreference(getString(R.string.pref_location_key))); 
    } 

    private void bindPreferenceSummaryToValue(Preference preference) { 

     preference.setOnPreferenceChangeListener(this); 

     onPreferenceChange(preference, 
       PreferenceManager 
         .getDefaultSharedPreferences(preference.getContext()) 
         .getString(preference.getKey(), "")); 
    } 

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

     if (preference instanceof ListPreference) { 
      // For list preferences, look up the correct display value in 
      // the preference's 'entries' list (since they have separate labels/values). 
      ListPreference listPreference = (ListPreference) preference; 
      int prefIndex = listPreference.findIndexOfValue(stringValue); 
      if (prefIndex >= 0) { 
       preference.setSummary(listPreference.getEntries()[prefIndex]); 
      } 
     } else { 
      // For other preferences, set the summary to the value's simple string representation. 
      preference.setSummary(stringValue); 
     } 
     return true; 
    } 

} 
내 pref_general.xml

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
    > 

    <EditTextPreference 
     android:key="pref_location_key" 
     android:title="@string/pref_location_label" 
     android:defaultValue="@string/pref_location_default" 
     android:inputType="text" 
     android:singleLine="true" /> 
</PreferenceScreen> 

의 17,451,515,

나는이 문제를 해결하는 몇 가지 방법을 시도했지만 성공하지. 이 오류는 "설정"버튼을 누른 다음 내 앱을 닫고 오류 메시지를 표시 할 때 발생합니다. 상기 이미지에서

답변

1

Look at the image

룩은 bindPreferenceSummaryToValue 내부 preference 오브젝트가 null 있는지. 이 라인은

preference.setOnPreferenceChangeListener 

방법

  1. 가 findPreference 실제로 뭔가하지 null 값을 반환해야합니다 디버깅하는 것이 더 정확합니다. 그것을 보려면 log 문을 사용하십시오.
  2. 첫 번째 단계에서 NULL 값을 얻는 경우 pref_location_key가 실제로 존재하는지 확인한 다음 bind 메소드에 전달하십시오.
  3. 이 기능에 대한 javadoc을 읽으십시오.

    findPreference - Javadoc

+0

덕분에, 문제가 해결! 방금 ​​전에 @ string /을 내 pref_general.xml에 삽입했습니다. –

+0

좋습니다. 그 대답을 받아 들여 다른 사람들이 그것이 도움이되었다는 것을 알게하십시오. – cafebabe1991