这将是非常简单的,我希望解决,只是我是一个新手在兜圈子。
我的屏幕上有多个选项卡。下面的代码应该读取文本输入,并在选择另一个选项卡时将其值分配给共享首选项。然而,每当我切换到另一个选项卡时,我的代码就会失败,并返回一个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();
}
}发布于 2012-01-04 22:23:18
您可以在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);
}发布于 2012-01-04 22:27:31
我想这是因为你正在设置
final SharedPreferences mPrefSettings = getSharedPreferences (SN_PREFERENCES, Context.MODE_WORLD_WRITEABLE);绑定到局部变量,而不是类成员字段。
因此,例外可能在以下位置:
mPrefSettings.edit();因为它仍然是null (从未在init方法中设置)。
尝试将其更改为:
mPrefSettings = getSharedPreferences (SN_PREFERENCES, Context.MODE_WORLD_WRITEABLE);也要小心你的其他初始化方法,比如initjobID,因为它们也在犯同样的错误。
将您的类更改为:
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();
}
}发布于 2012-01-04 22:28:50
您在onCreate()期间设置的变量与您在类级别声明的变量不同。这实际上是对如何在Java中声明和修改变量内容的基本误解。请看下面的链接,也许它会帮助你理解。
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html
https://stackoverflow.com/questions/8728353
复制相似问题