2015-06-12 4 views
1

Я пытаюсь сохранить целое число, которое будет хранить сколько раз пользователь использовал на ImageView, используя интерфейс SharedPreferences. Тем не менее, когда я запускаю приложение дает мне исключения нулевого указателя на строку, в которой я декларирующую sharedPreferences, как это:SharedPreferences Исключение нулевого указателя

SharedPreferences mSharedPreferences = this.getPreferences(Context.MODE_PRIVATE); 

Это мой первый раз использовать этот интерфейс и является немного запутанным для меня. Я не знаю, почему это происходит. это бревно:

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{koemdzhiev.com.eggyegg/koemdzhiev.com.eggyegg.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:2236) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
     at android.app.ActivityThread.access$800(ActivityThread.java:151) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5254) 
     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:903) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference 
     at android.content.ContextWrapper.getPackageName(ContextWrapper.java:132) 
     at android.app.Activity.getLocalClassName(Activity.java:4987) 
     at android.app.Activity.getPreferences(Activity.java:5021) 
     at koemdzhiev.com.eggyegg.MainActivity.<init>(MainActivity.java:20) 
     at java.lang.reflect.Constructor.newInstance(Native Method) 
     at java.lang.Class.newInstance(Class.java:1606) 
     at android.app.Instrumentation.newActivity(Instrumentation.java:1066) 
     at 

Это мой код в классе, который простирается от класса Application:

public class EggyEggApplication extends Application { 

@Override 
public void onCreate() { 
    SharedPreferences mSharedPreferences = this.getSharedPreferences(getString(R.string.koemdzhiev_eggyegg_PREFERENCE_FILE_KEY), Context.MODE_PRIVATE); 
    SharedPreferences.Editor mEditor = mSharedPreferences.edit(); 
    if(mSharedPreferences.contains(getString(R.string.koemdzhiev_eggyegg_PREFERENCE_FILE_KEY))== false) { 
     mEditor.putInt(getString(R.string.koemdzhiev_eggyegg_PREFERENCE_FILE_KEY), 0).apply(); 
    } 
} 

Это мой код в основной деятельности:

public class MainActivity extends AppCompatActivity { 
private static final String TAG = MainActivity.class.getSimpleName(); 
private int defaultValue; 
private int i; 
ImageView tapImage; 
SharedPreferences mSharedPreferences = this.getPreferences(Context.MODE_PRIVATE); 
SharedPreferences.Editor mEditor = mSharedPreferences.edit(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    tapImage = (ImageView)findViewById(R.id.tapImage); 
    tapImage.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      i++; 
      mEditor.putInt(getString(R.string.koemdzhiev_eggyegg_PREFERENCE_FILE_KEY),i); 
      mEditor.commit(); 
     } 
    }); 
    defaultValue = getResources().getInteger(R.string.koemdzhiev_eggyegg_PREFERENCE_FILE_KEY); 
    i = mSharedPreferences.getInt(getString(R.string.koemdzhiev_eggyegg_PREFERENCE_FILE_KEY),defaultValue); 



    int defaultValue = getResources().getInteger(R.string.koemdzhiev_eggyegg_PREFERENCE_FILE_KEY); 
    long lastTapNumber = mSharedPreferences.getInt(getString(R.string.koemdzhiev_eggyegg_PREFERENCE_FILE_KEY),defaultValue); 
    i = (int) lastTapNumber; 

} 
private boolean isNetworkAvailable() { 
    ConnectivityManager connectivityManager 
      = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
    return activeNetworkInfo != null && activeNetworkInfo.isConnected(); 
} 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

ответ

1

Ну вы сказали, что вы сохраняете целое число, поэтому они ключевое слово, которое вы ищете, это

 "java.lang.String android.content.Context.getPackageName()" 

Редактировать: Мой плохой! Существует, вероятно, что-то неправильно в Оп метод создания

+0

Я до сих пор не знаю, где я должен применить это change –

2

В деятельности, движение

SharedPreferences mSharedPreferences = this.getPreferences(Context.MODE_PRIVATE); 
SharedPreferences.Editor mEditor = mSharedPreferences.edit(); 

внутри onCreate. Чтобы получить доступ к SharedPreferences, необходимо Context. Внутренне getPreferences(Context.MODE_PRIVATE), звоните getPackageName.

Редактировать

Вы должны избегать использовать локализованные строки в качестве ключа для SharedPreferences

+1

вы не можете использовать 'R.string.koemdzhiev_eggyegg_PREFERENCE_FILE_KEY' с getResource(). getInteger(). R.string для getResources(). GetString() – Blackbelt

4

проблема эта линия в вашем MainActivity:

SharedPreferences mSharedPreferences = this.getPreferences(Context.MODE_PRIVATE); 

исключения сказал, вы получите NullPointer,

этот nullpointer происходит потому, что контекст равен нулю, это происходит потому, что строка выше выполняется перед деятельность закончена с созданием,

так переместить эту строку в вас OnCreate метод должен решить проблему

+0

Я переместил эту строку и объявление редактора внутри метода onCreate, но теперь у меня есть следующее исключение: Вызвано: android.content.res.Resources $ NotFoundException : Идентификатор ресурса # 0x7f060014 тип # 0x3 недействителен на android.content.res.Resources.getInteger (Resources.java:1027) at koemdzhiev.com.eggyegg.MainActivity.onCreate (MainActivity.java:39) –

+1

если строка 39 это: ** getResources(). GetInteger (R.string.koe ...... ** , тогда вам нужно изменить его на getString вместо getInteger, здесь вы смешиваете здесь –

+0

Спасибо.Я пробовал это, но мне пришлось разбирать строку в целое число: defaultValue = Integer.parseInt (getResources(). GetString (R.string.koemdzhiev_eggyegg_PREFERENCE_FILE_KEY)); Но после этого приложение вылетает во время выполнения с помощью: Caused by: java.lang.NumberFormatException: Invalid int: «numberOfClicks»:/ –

0

Try -

public class MainActivity extends AppCompatActivity { 
private static final String TAG = MainActivity.class.getSimpleName(); 
private int defaultValue; 
private int i; 
ImageView tapImage; 
SharedPreferences mSharedPreferences; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mSharedPreferences = this.getPreferences(Context.MODE_PRIVATE); 
    this.editor = mSharedPreferences.edit(); 
    this.editor.commit(); 


    tapImage = (ImageView)findViewById(R.id.tapImage); 
    tapImage.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      i++; 
       setValueToSharedPref("TAP_NUMBER",i); 
     } 
    }); 


long lastTapNumber = mSharedPreferences.getInt("TAP_NUMBER",0); 
i = (int) lastTapNumber; 

} 


    public void setValueToSharedPref(String key, boolean value) { 
     this.editor.putBoolean(key, value); 
     this.editor.commit(); 

    } 


private boolean isNetworkAvailable() { 
    ConnectivityManager connectivityManager 
      = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
    return activeNetworkInfo != null && activeNetworkInfo.isConnected(); 
} 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
}