2016-09-06 239 views
0

我試圖創建一個對講應用程序,但是當我嘗試運行它時,它總是給我一個錯誤,它是getContext() is null
任何人都可以幫助我嗎?PreferenceManager.getDefaultSharedPreferences(getContext())爲空

public class intercomApp extends Application { 

protected static final String SHARED_PREFS_REFERENCE_LABEL = "ComeNChat"; 

protected static final String DEFAULT_NAME = "Default_Name"; 

private static intercomApp instance; 

public static intercomApp getInstance() { 
    return instance; 
} 

public static Context getContext() { 
    return instance; 
} 

@Override 
public void onCreate() { 
    instance = this; 
    super.onCreate(); 
} 

// store our name to shared prefs 
public static void storeName(String name) { 
    PreferenceManager.getDefaultSharedPreferences(getContext()).edit().putString(SHARED_PREFS_REFERENCE_LABEL, name).commit(); 
} 

// get our name from shared prefs 
public static String getName() { 
    return PreferenceManager.getDefaultSharedPreferences(getContext()).getString(SHARED_PREFS_REFERENCE_LABEL, DEFAULT_NAME); //(intercomApp.java:45) 
} 

這是我的logcat

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.ricky.comenchat/com.example.ricky.comenchat.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2450) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2520) 
                      at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5466) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
                      Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference 
                      at android.preference.PreferenceManager.getDefaultSharedPreferencesName(PreferenceManager.java:375) 
                      at android.preference.PreferenceManager.getDefaultSharedPreferences(PreferenceManager.java:370) 
                      at com.example.ricky.comenchat.util.intercomApp.getName(intercomApp.java:45) 
                      at com.example.ricky.comenchat.MainActivity.getClientNameList(MainActivity.java:383) 
                      at com.example.ricky.comenchat.MainActivity.setupClientListAdapter(MainActivity.java:214) 
                      at com.example.ricky.comenchat.MainActivity.onCreate(MainActivity.java:149) 
                      at android.app.Activity.performCreate(Activity.java:6251) 

雖然這是MainActivity

public class MainActivity extends AppCompatActivity { 

@Overide 
protected void onCreate(Bundle savedInstanceState){ 
    setupList; //(MainActivity.java:149) 
} 

private void setupList{ 
    nameList = getNamelist(); //(MainActivity.java:214) 
} 

private String[] getNamelist(){ 
    ArrayList<String> names = new ArrayList<>(); 
    names.add(intercomApp.getName()); //(MainActivity.java:383) 
} 

使用的函數編輯: 下面是我的manifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.ricky.comenchat"> 

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="android.permission.NETWORK" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 

     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 
+2

請顯示您的清單XML –

+0

同意。您可能沒有在清單中註冊您的'Application'子類。 – CommonsWare

+0

編輯,非常感謝您的幫助 –

回答

1

它似乎就是你缺少你的清單中的應用程序,這樣的背景下空

<application 
    android:name=".util.intercomApp" 
    android:allowBackup="true" 

旁註:Java約定 - 類名稱應該以大寫字母開頭

+0

這也不適合我,它顯示無法解析符號'IntercomApp'。感謝您的建議,我還是Android和Java的新手。 –

+0

我從來沒有輸入過'IntercomApp'。你的班級名稱是'intercomApp',這就是我回答的 –

+0

對不起,我沒有告訴你,我改變了我的班級名稱,以大寫字母開頭,作爲您的建議。 –

-1

比而產生這樣

public static intercomApp getInstance() { 
    return instance; 
} 

public static Context getContext() { 
    return instance; 
} 
瞬間

你可以做以下,使IntercomApp類一般像如下

public class IntercomApp { 

    protected static final String SHARED_PREFS_REFERENCE_LABEL = "ComeNChat"; 
    protected static final String DEFAULT_NAME = "Default_Name"; 

    // store our name to shared prefs 
    public static void storeName(String name, Context context) { 
     PreferenceManager.getDefaultSharedPreferences(context).edit().putString(SHARED_PREFS_REFERENCE_LABEL, name).commit(); 
    } 

    // get our name from shared prefs 
    public static String getName(Context context) { 
     return PreferenceManager.getDefaultSharedPreferences(context).getString(SHARED_PREFS_REFERENCE_LABEL, DEFAULT_NAME); //(intercomApp.java:45) 
    }   
} 

並在您的任何活動中使用它如下

public class MainActivity extends AppCompatActivity { 
    private Context context; 

    @Overide 
    protected void onCreate(Bundle savedInstanceState){ 
     context = this; 
     setupList(); //(MainActivity.java:149) 
    } 

    private void setupList() { 
     nameList = getNamelist(); //(MainActivity.java:214) 
    } 

    private String[] getNamelist(){ 
     ArrayList<String> names = new ArrayList<>(); 
     names.add(IntercomApp.getName(context)); //(MainActivity.java:383) 
    } 
} 
+0

你錯過了他想要做的事 - 他想要做到這一點,所以他可以得到他的全局應用程序對象,並將其用作上下文,而不是傳入一個有時會很尷尬的上下文(它可能需要通過通過多層的上下文)。 –

+0

這對我不起作用,它使無法解析符號'上下文' –

+0

您是否在頂部定義了這一點:private context context; –

相關問題