我的Activity
应该显示用户的姓名和邮件地址(如果SharedPreferences
中可用)。如果不是,则启动Dialog
来向用户请求信息。
弹出Dialog
,但是当单击“确定”按钮时,活动会抛出NullPointerException
,其中包含以下日志,该日志指向else
语句:
10-29 10:36:59.745: E/AndroidRuntime(16518): FATAL EXCEPTION: main
10-29 10:36:59.745: E/AndroidRuntime(16518): java.lang.NullPointerException
10-29 10:36:59.745: E/AndroidRuntime(16518): at de.blubb.blubb.Blubb$1.onClick(Blubb.java:79)
10-29 10:36:59.745: E/AndroidRuntime(16518): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
10-29 10:36:59.745: E/AndroidRuntime(16518): at android.os.Handler.dispatchMessage(Handler.java:99)
10-29 10:36:59.745: E/AndroidRuntime(16518): at android.os.Looper.loop(Looper.java:137)
10-29 10:36:59.745: E/AndroidRuntime(16518): at android.app.ActivityThread.main(ActivityThread.java:4759)
10-29 10:36:59.745: E/AndroidRuntime(16518): at java.lang.reflect.Method.invokeNative(Native Method)
10-29 10:36:59.745: E/AndroidRuntime(16518): at java.lang.reflect.Method.invoke(Method.java:511)
10-29 10:36:59.745: E/AndroidRuntime(16518): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
10-29 10:36:59.745: E/AndroidRuntime(16518): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
10-29 10:36:59.745: E/AndroidRuntime(16518): at dalvik.system.NativeStart.main(Native Method)
我的代码:
public class Blubb extends Activity {
public static final String username = "nameKey"; // for Shared Preferences
public static final String mailaddress = "mailKey"; // for Shared Preferences
public static final String BlubbPrefs = "preferences" ;
private static final int DIALOG_ALERT = 10; // constant for identifying the preference dialog
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//addPreferencesFromResource(R.xml.preferences);
setContentView(R.layout.activity_blubb);
TextView viewUserName = (TextView) findViewById(R.id.viewUserNamen);
TextView viewUserMail = (TextView) findViewById(R.id.viewMailAdresse);
SharedPreferences settings = getSharedPreferences(BlubbPrefs, Context.MODE_PRIVATE);
String name = settings.getString(username, "");
String mail = settings.getString(mailaddress, "");
/* Test if user settings are available */
if ("".equals(name) || !"".equals(mail)) {
System.out.println("Nutzerangaben fehlen");
/* Requesting user settings with a Dialog */
showDialog(DIALOG_ALERT);
}
if (settings.contains(username)){
viewUserName.setText(settings.getString(username, ""));
}
if (settings.contains(mailaddress)){
viewUserMail.setText(settings.getString(mailaddress, ""));
}
}
public Dialog onCreateDialog(int id) {
switch (id) {
case DIALOG_ALERT:
/* Create the new Dialog. */
Context context = Blubb.this;
AlertDialog.Builder builder = new AlertDialog.Builder(context);
//Builder builder = new AlertDialog.Builder(this);
LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
builder.setView(inflater.inflate(R.layout.dialog_settings, null));
builder.setCancelable(false);
/* OK-Button */
builder.setPositiveButton(R.string.button_send, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int arg1) {
final EditText editName = (EditText)findViewById(R.id.editUserNamen);
final EditText editMail = (EditText)findViewById(R.id.editMailAdresse);
/* Prove user settings */
if (editName.getText().toString().trim().length() <= 0 ){
editName.setError("Name missing");
Toast.makeText(getApplicationContext(), "Name missing", Toast.LENGTH_LONG).show();
//showAlertNameMissing();
}
/*if (!inputMailAdresse.contains(".") || !inputMailAdresse.contains("@")) { */
if (editMail.getText().toString().trim().contains(".") || editMail.getText().toString().trim().contains("@")){
editMail.setError("Mail incorrect");
Toast.makeText(getApplicationContext(), "Mail incorrect", Toast.LENGTH_LONG).show();
//showAlertMailMissing();
}
else {
final String inputUserNamen = editName.getText().toString().trim();
final String inputMailAdresse = editMail.getText().toString().trim();
/* Reading access on preferences.xml */
SharedPreferences settings = getSharedPreferences(BlubbPrefs, Context.MODE_PRIVATE); // MODE_PRIVATE => can only be accessed by this application
/* Object of type editor to get writing access on preferences.xml */
SharedPreferences.Editor editor = settings.edit();
/* Saving key/value pairs to preferences.xml */
editor.putString(username, inputUserNamen);
editor.putString(mailaddress, inputMailAdresse);
/* Writing key/value pairs to preferences.xml */
editor.commit();
Toast.makeText(getApplicationContext(), R.string.alert_saved, Toast.LENGTH_SHORT).show();
//return;
}
dialog.dismiss();
}
}
);
/* Cancel-Button */
builder.setNegativeButton(R.string.button_cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int arg1) {
dialog.dismiss();
Toast.makeText(getApplicationContext(), "Input cancelled", Toast.LENGTH_LONG).show();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
return super.onCreateDialog(id);
}
}
作为编程的新手,当然还有Java,我一直试图通过搜索互联网并改变我的代码来寻找解决方案2周。但现在我很困惑。
解决了这个问题后,我还会遇到描述here的Dialog关闭问题吗?有人能帮助我吗?
答案 0 :(得分:0)
空指针在编辑文本中最有可能。在您的代码的早期,您将相同的ID转换为textViews,现在您将它们转换为EditTexts,相同的布局对于两种不同类型的视图不能具有相同的ID。
TextView viewUserName = (TextView) findViewById(R.id.editUserNamen); //on your activity
EditText editName = (EditText)findViewById(R.id.editUserNamen); //on your dialog
这是最可能的错误。