2016-08-17 4 views
0

これまでに尋ねられたいくつかの同様の質問がありますが、ソリューションごとにすべてがあるにもかかわらず、私のsharedPreferencesはnull値を返します。以下は私のコードです:SharedPreferences nullを返す

以下に示すアプリケーション全体からsharedPrefencesにアクセスするためのMainActivityに2つの静的メソッドを宣言しました。

public static void saveToPreferences(Context context, int i,String key) { 
     mSharedPreferences = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE); 
     SharedPreferences.Editor editor = mSharedPreferences.edit(); 
     editor.putInt(key , i); 
     //used in place of commit as it is faster. This does the task asynchronously 
     editor.commit(); 
    } 

    public static int readFromPreferences(Context context, int i, String key) { 
     mSharedPreferences = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE); 
     int fed_value = mSharedPreferences.getInt(key, i); 
     return fed_value; 
    } 

 static PendingIntent pendingIntent; 
     static Intent alarmIntent; 
     int mMinute; 
     final Calendar calendar = Calendar.getInstance(); 
     int mCurrentHour = calendar.get(calendar.HOUR_OF_DAY); 
     int mCurrentMinute = calendar.get(calendar.MINUTE); 
     int minuteDifference; 
     int mHour; 
// Create the TimePicker 
     @Override 
     public Dialog onCreateDialog(Bundle savedInstanceState) { 
      return new TimePickerDialog(getActivity(), this, mCurrentHour, mCurrentMinute, 
        DateFormat.is24HourFormat(getActivity())); 
     } 

     @Override 
     public void onTimeSet(android.widget.TimePicker view, int hourOfDay, int minute) { 
      mHour = hourOfDay; 
      minuteDifference = Math.abs(mCurrentMinute - mMinute); 
      MainActivity.saveToPreferences(getActivity(),minuteDifference,"set_minute"); 
      mMinute = minute; 
      MainActivity.saveToPreferences(getActivity(), Math.abs(mCurrentHour - mHour), "set_hour"); 


     public int minuteDifference(){ 
      Log.d("tag", String.valueOf(mHour) + " " + String.valueOf(mMinute)); 
      return MainActivity.readFromPreferences(getActivity(),minuteDifference,"set_minute"); 
     } 
     public int HourDifference(){ 
      return MainActivity.readFromPreferences(getActivity(),Math.abs(mCurrentHour - mHour),"set_hour"); 
     } 

minuteDifferenceがnullを返すされているメソッドの下に示したように私は別の方法でそれらの値にアクセスしています。これはonStartメソッドで以下に示すように別のフラグメントから呼び出されています。

以下のコードブロックのボタン(setTime.setOnclickListener(..))をクリックするとtimePickerが表示され、onTimeSetメソッドが呼び出され、データがプリファレンスに保存されます。

2番目のボタン(下のコードブロックのsetAlarm.setOnClickListener(..))は、上記の別のフラグメントで定義されているメソッドのminuteDifferenceメソッドを呼び出します。

これは、sharedPreferencesから必要な値を読み取り、それを返す必要があります。 E/AndroidRuntime com.rs.rishitshah.feedingnemo 47.525 25850から25850 /::05:しかし、それがnull

@Override 
    public void onStart() { 
     super.onStart(); 
     final Button setTime = (Button) getActivity().findViewById(R.id.set_time); 
     final Button setAlarm = (Button) getActivity().findViewById(R.id.set_alarm); 
     alarmIntent = new Intent(getActivity(), AlarmReciever.class); 
     pendingIntent = PendingIntent.getBroadcast(getActivity(), 0, alarmIntent, 0); 
     setAlarm.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       AlarmManager manager; 
       TimePickerFragment tfSchedule = new TimePickerFragment(); 
       int mDifferenceMinute = tfSchedule.minuteDifference(); 
       manager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE); 
       int interval = mDifferenceMinute*60000; 
       Log.d("minuteDifference",String.valueOf(mDifferenceMinute)); 
//    manager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent); 
       manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
         SystemClock.elapsedRealtime() + 
           interval, pendingIntent); 

      } 
     }); 

     setTime.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       TimePickerFragment tfViewTimer = new TimePickerFragment(); 
       tfViewTimer.show(getFragmentManager(), "Tag"); 

       } 

     }); 
    } 
以下

を返すと、エラーログ

8月17日10で致命的な例外:メイン プロセス:com.rs.rishitshah.feedingnemo、PID:25850 java.lang.NullPointerException:仮想メソッド 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String、int)'をnullオブジェクト参照 at com.rs.rishitshah.feedingnemo.MainActivity.readFromPrefe rences(MainActivity.java:265)com.rs.rishitshah.feedingnemo.TimePickerFragment.minuteDifference(TimePickerFragment.java:63)で com.rs.rishitshah.feedingnemo.ScheduleFeed $ 1.onClick(ScheduleFeed.java:51)で android.view.View.performClick(View.java:5204) at android.view.View $ PerformClick.run(View.java:21155) (android.os.Handler.handleCallback(Handler.java:739) )にあります。 android.os.Handler.dispatchMessage(Handler.java:95) とandroid.os.Looper.loop(Looper.java:148) とandroid.app.ActivityThread.main(ActivityThread.java:5422) (ネイティブメソッド) com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(java.lang.reflect.Method.invoke) ZygoteInit.java:616)

PS:重複としてこれをマークするか、私は以下のリンクをたどっこの質問ノートをdownvoting前に、すでにそれらに言及したソリューションごとに私のコードを持っています。このすべてにもかかわらず、私のコードは動作していません。

android - sharedpreferences return null value

SharedPreferences getString returns null though set by editor in AsyncTask

SharedPreferences returns null values

Sharedpreferences in Android returns null when called from another activity

+1

共有設定ではnullが返されません。あなたのコンテキストはnullです。 –

+0

ありがとうございます。なぜこれが起こっているのか、これに対する修正は何ですか? –

+0

[NullPointerExceptionとは何か、それを修正する方法は?](http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) ) –

答えて

3

問題は、これらの行の断片です。

  TimePickerFragment tfSchedule = new TimePickerFragment(); 
      int mDifferenceMinute = tfSchedule.minuteDifference(); 

(それがActivityに付着していないです)何Contextを持っていません。より具体的には、Contextnullです。

Fragmentには添付するまでContextが含まれていないことを知っておく必要があります。また、このような静的メソッドを避ける必要があります。 SharedPreferencesを使用しているため、時間オブジェクトを作成する必要があります。単純に、Contextを渡す場所でヘルパーオブジェクトを作成すると、そこからデータを「セット」または「取得」するときに呼び出されます。

+0

ありがとうございました。私はしかし、質問があります。その場合、saveToPreferencesを呼び出すときに同じ例外がスローされるべきではありませんか? –

+0

完全なコードが投稿されていないため、フラグメントが添付されるまでその呼び出しが行われないためと思います(表示後に何か起こるような音が鳴ります - つまり、フラグメントが添付されていることを意味します) – Jim

+0

アプリケーションコンテキストを使用して問題を解決しました。ありがとう –

3

あなたの共有好みはnullを返していません。あなたのコンテキストはnullです。これは、新規にフラグメントを作成し、それをどのレイアウトにも追加しないで、その上でメソッドを呼び出すためです。それはトランザクションを介してレイアウトに追加されていないため、アクティビティはありません。あなたが断片を乱用しているように見えます。これらの関数はフラグメントに存在すべきではなく、他の場所にあるべきです。おそらくあなたはそれをヘルパークラスから呼び出す、またはヘルパークラスで呼び出すことになるでしょう。フラグメントをレイアウトに追加しない場合は、フラグメントを使用してヘルパー関数にアクセスしないでください。