我是Android的新手,这是我的问题,我有一个弹出的对话框,假设使用android Http post将表单提交到URL,当我单击表单的提交按钮时,它强制关闭应用程序,我从logcat收到一条错误消息,说它是一个空指针。
protected Dialog onCreateDialog(int id) {
switch (id) {
case DIALOG_TEXT_ENTRY:
//This shows how to add a custom layout to an AlertDialog
LayoutInflater factory = LayoutInflater.from(this);
final View textEntryView = factory.inflate(R.layout.commentlayout, null);
return new AlertDialog.Builder(HomeActivity.this)
.setIcon(R.drawable.ic_launcher)
.setTitle(R.string.app_name)
.setView(textEntryView)
.setPositiveButton(R.string.Submit, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
postComment();
}
})
.setNegativeButton(R.string.cancal, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
/* User clicked cancel so do some stuff */
}
}).create();
}
return null;
}
//this comes after the setContentView(R.Layout.view)
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.view);
public void postComment() {
nameField = (EditText) findViewById(R.id.editText1);
countryField = (EditText) findViewById(R.id.editText2);
commentField = (EditText) findViewById(R.id.commentField);
//get message from message fields
String name = nameField.getText().toString();
String count = countryField.getText().toString();
String comm = commentField.getText().toString();
//check whether the name field is empty or not
if (name.length() > 0) {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://_______");
try {
List < NameValuePair > nameValuePairs = new ArrayList < NameValuePair > (3);
nameValuePairs.add(new BasicNameValuePair("namet", name));
nameValuePairs.add(new BasicNameValuePair("countryt", count));
nameValuePairs.add(new BasicNameValuePair("commentt", comm));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
httpclient.execute(httppost);
nameField.setText(""); //reset the message text field
countryField.setText("");
commentField.setText("");
Toast.makeText(getBaseContext(), "Sent", Toast.LENGTH_SHORT).show();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} else {
//display message if text field is empty
Toast.makeText(getBaseContext(), "All fields are required", Toast.LENGTH_SHORT).show();
}
答案 0 :(得分:0)
只需使用以下代码替换您的nameField = (EditText) findViewById(R.id.editText1);
和其他2。
nameField = (EditText) textEntryView.findViewById(R.id.editText1);
countryField = (EditText) textEntryView.findViewById(R.id.editText2);
commentField = (EditText) textEntryView.findViewById(R.id.commentField);
修改强>
为什么添加了textEntryView?
答案是,当您使用任何布局时,它具有 root 视图。该根视图用于根据其“资源ID”获取其子项。
当您在活动中选择两个不同的布局时,表示有两个根视图,一个由your Activity
使用,可以通过ActivityName.this.findViewById()
活动方法访问。但是,如果要使用其他布局,则需要添加另一个根视图的引用,该视图位于您的情况textEntryView
中。所以只在那个根中搜索孩子。
答案 1 :(得分:0)
假设以下视图来自R.layout.commentlayout
Dialog dialog=new Dialog(getApplicationContext);
替换以下内容,
nameField = (EditText) findViewById(R.id.editText1);
countryField = (EditText) findViewById(R.id.editText2);
commentField = (EditText) findViewById(R.id.commentField);
带
nameField = (EditText)dialog.findViewById(R.id.editText1);
countryField = (EditText)dialog.findViewById(R.id.editText2);
commentField = (EditText)dialog.findViewById(R.id.commentField);