2012-01-04 89 views
0

これは非常にシンプルなので、私は並べ替えると期待しています。NullPointerException - onPause()

私は画面に複数のタブがあります。次のコードでは、別のタブが選択されているときにテキスト入力を読み込み、その値をShared Preferencesに割り当てる必要があります。しかし、私は別のタブに変更するたびに私のコードはNullPointerExceptionで失敗します - 私はそれを下のコードのonPause()に追跡したと信じて、私は変数内のデータを正しく渡すことに失敗していると考えています。

package com.androidbook.epcsn; 

import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileWriter; 
import java.io.IOException; 

import android.app.Activity; 
import android.content.Context; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.os.Bundle; 
import android.os.Environment; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

@SuppressWarnings("unused") 
public class jobActivity extends Activity { 

public static final String SN_PREFERENCES = "SiteNotePrefs"; 

SharedPreferences mPrefSettings; 
String jobID; 
String jobAddress ; 
String jobPostcode ; 

public void onCreate(Bundle savedInstanceState) {   
    super.onCreate(savedInstanceState);   
    setContentView(R.layout.joblayout); 

    final SharedPreferences mPrefSettings = getSharedPreferences (SN_PREFERENCES, Context.MODE_WORLD_WRITEABLE); 

    initjobID(); 
    initjobaddress(); 
    initjobpostcode(); 
} 

private void initjobpostcode() { 
    EditText jobPostcode = (EditText)findViewById(R.id.jobPostcodeText); 
} 

private void initjobaddress() { 
    EditText jobAddress = (EditText)findViewById(R.id.jobAddressText); 
} 

private void initjobID() { 
    EditText jobID = (EditText)findViewById(R.id.jobIDText); 
} 

@Override 
protected void onPause(){ 
    super.onPause(); 

    String strjobID = jobID; 
    String strjobAddress = jobAddress; 
    String strjobPostcode = jobPostcode; 

    Editor editor = mPrefSettings.edit(); 
    editor.putString("jobID", strjobID); 
    editor.putString("jobAddress", strjobAddress); 
    editor.putString("jobPostcode", strjobPostcode); 
    editor.commit(); 
} 
} 
+2

実際のエラー(スタックトレース)を入力してください。それは言及された脚注を持っている必要がありますので、また、どの行が上記の行番号であるか教えてください – Nanne

+0

あなたは私たちにlogtcatを見せてもらえますか? exceptinは何ですか? –

答えて

4

意図したとおりにあなたがinit方法ではなく、クラスのプロパティ内のローカル変数に値を設定し、例えば:

EditText jobID; 

// Then later... it's clobberin' time. 
private void initjobID() { 
    EditText jobID = (EditText)findViewById(R.id.jobIDText); 
} 

プロパティjobIDは、メソッド内で宣言ローカルjobIDによってshadowedです。

(Javaの表記法は、initJobId、プロパティはjobIdとなります)。

に、initメソッドでインスタンスのプロパティを設定するローカル宣言を削除して、このパターンを使用するには:

EditText jobID; 
private void initjobID() { 
    jobID = (EditText)findViewById(R.id.jobIDText); 
} 
+0

おかげさま - 私はすごく学びました! – CornishDibley

+0

@CornishDibley同じように我々:) –

0

私はあなたの代わりにローカル変数に

final SharedPreferences mPrefSettings = getSharedPreferences (SN_PREFERENCES, Context.MODE_WORLD_WRITEABLE); 

を設定しているからだと想像しますクラスメンバーフィールドの

したがって例外はでおそらくです:まだ(init方法で設定したことはありません)nullであるので

mPrefSettings.edit(); 

は、それを変更してみてください:

mPrefSettings = getSharedPreferences (SN_PREFERENCES, Context.MODE_WORLD_WRITEABLE); 

また、彼らは同じ間違いをしているようinitjobIDを例えば、あなたの他のinitメソッドに注意してください。

にあなたのクラスを変更し

package com.androidbook.epcsn; 

import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileWriter; 
import java.io.IOException; 

import android.app.Activity; 
import android.content.Context; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.os.Bundle; 
import android.os.Environment; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

@SuppressWarnings("unused") 
public class jobActivity extends Activity { 

public static final String SN_PREFERENCES = "SiteNotePrefs"; 

SharedPreferences mPrefSettings; 
String jobID; 
String jobAddress ; 
String jobPostcode ; 

public void onCreate(Bundle savedInstanceState) {   
    super.onCreate(savedInstanceState);   
    setContentView(R.layout.joblayout); 

    mPrefSettings = getSharedPreferences (SN_PREFERENCES, Context.MODE_WORLD_WRITEABLE); 

    initjobID(); 
    initjobaddress(); 
    initjobpostcode(); 
} 

private void initjobpostcode() { 
    jobPostcode = (EditText)findViewById(R.id.jobPostcodeText); 
} 

private void initjobaddress() { 
    jobAddress = (EditText)findViewById(R.id.jobAddressText); 
} 

private void initjobID() { 
    jobID = (EditText)findViewById(R.id.jobIDText); 
} 

@Override 
protected void onPause(){ 
    super.onPause(); 

    String strjobID = jobID; 
    String strjobAddress = jobAddress; 
    String strjobPostcode = jobPostcode; 

    Editor editor = mPrefSettings.edit(); 
    editor.putString("jobID", strjobID); 
    editor.putString("jobAddress", strjobAddress); 
    editor.putString("jobPostcode", strjobPostcode); 
    editor.commit(); 
} 
} 
0

あなたはonCreate()時に設定された変数を使用すると、クラスレベルで宣言されたものと同じではありません。これは、Javaで変数の内容を宣言して変更する方法の基本的な誤解です。次のリンクを参照してください。おそらく理解を深めるのに役立ちます。

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html