2016-09-06 2 views
0

Я пытаюсь создать приложение внутренней связи, но когда я пытаюсь запустить его, он продолжает давать мне ошибку, которая равна getContext() is null.
Может ли кто-нибудь помочь мне с этим?PreferenceManager.getDefaultSharedPreferences (getContext()) null

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

Пожалуйста, покажите ваш Manifest XML –

+0

Согласовано. Вероятно, у вас нет вашего подкласса 'Application', зарегистрированного в манифесте. – CommonsWare

+0

отредактировал, очень ценю за помощь –

ответ

1

It казаться S вам не хватает приложения в манифесте, так что контекст является пустым

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

Sidenote: 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

Вы определили это вверху: частный контекст контекста; –

Смежные вопросы