【问题标题】:Android App crashes when I try to capture from EditText当我尝试从 EditText 捕获时,Android 应用程序崩溃
【发布时间】:2013-01-28 06:08:33
【问题描述】:

所以我试图在从菜单选项打开的警报对话框中制作联系表格。我的表单和 Main.java 中有 3 个 EditText 字段,当按下表单中的“发送”按钮然后我启动电子邮件意图时,我从这些字段中读取,或者至少这就是它应该做的。现在,只要我按下发送按钮,应用程序就会崩溃。现在我已经解决了这个问题,它似乎并不在意图中,但是当我从 EditText 字段中读取时它就会发生。当我取出 EditText 阅读部分并将填充信息放在它的位置时,代码工作正常,但我需要它与 EditTexts 一起使用。谢谢你。 我的菜单选项的全部代码:

case R.id.menu_feedback:

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.menu_feedback);
LayoutInflater inflater = this.getLayoutInflater();

// Inflate and set the layout for the dialog
// Pass null as the parent view because its going in the dialog layout
builder.setView(inflater.inflate(R.layout.feedback, null));
// Add the buttons
builder.setNegativeButton(R.string.send, new DialogInterface.OnClickListener() {
       public void onClick(DialogInterface dialog, int id) {
           // User clicked OK button
           final EditText nameField = (EditText) findViewById(R.id.EditTextName);
           String name = nameField.getText().toString();
           final EditText emailField = (EditText) findViewById(R.id.EditTextEmail);
           String email = emailField.getText().toString();
           final EditText feedbackField = (EditText) findViewById(R.id.EditTextFeedbackBody);
           String feedback = feedbackField.getText().toString();
           final CheckBox responseCheckbox = (CheckBox) findViewById(R.id.CheckBoxResponse);
           boolean bRequiresResponse = responseCheckbox.isChecked();

           /* Create the Intent */
           final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);

           /* Fill it with Data */
           emailIntent.setType("plain/text");
           emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, R.string.send_email);
           emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Subject");
           emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, feedback);

           /* Send it off to the Activity-Chooser */
           startActivity(Intent.createChooser(emailIntent, "Send mail..."));
           dialog.dismiss();

       }
   });
builder.setPositiveButton(R.string.cancel, new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
               dialog.dismiss();
           }
       });

// create alert dialog
AlertDialog alertDialog = builder.create();

// show it
alertDialog.show();

return true;

【问题讨论】:

    标签: android android-intent menu crash


    【解决方案1】:

    好的,我假设你所有的 EditTexts 都写在 feedback layout 文件中用于 AlertDialog,

    View dialogView = inflater.inflate(R.layout.feedback, null);
    builder.setView(dialogView );
    

    和Edittext一样,

    // User clicked OK button
    final EditText nameField = (EditText) dialogView.findViewById(R.id.EditTextName);
    String name = nameField.getText().toString();
    final EditText emailField = (EditText) dialogView.findViewById(R.id.EditTextEmail);
    String email = emailField.getText().toString();
    final EditText feedbackField = (EditText) dialogView.findViewById(R.id.EditTextFeedbackBody);
    String feedback = feedbackField.getText().toString();
    

    实际上,当您膨胀任何视图并且必须使用该视图的子视图时,您必须使用该视图的引用和findViewById() 方法。所以在你的情况下,dialogView.findViewById();

    【讨论】:

    • 所以每次我膨胀一个视图时,我应该膨胀一个子视图而不是原来的东西?
    • 不,您必须只为主视图充气,因为您正在为 AlertDialog 充气,然后使用该视图的引用,您必须定义其他视图,这些视图是充气的子视图意见。
    【解决方案2】:

    使用 builderinflater 实例从 AlertDialog 访问 EditText 或其他视图:

     builder.setNegativeButton(R.string.send, new DialogInterface.OnClickListener() {
      public void onClick(DialogInterface dialog, int id) {
                               // User clicked OK button
       final EditText nameField = (EditText)inflater. findViewById(R.id.EditTextName);
       String name = nameField.getText().toString();
       final EditText emailField = (EditText)inflater. 
                                                     findViewById(R.id.EditTextEmail);
       String email = emailField.getText().toString();
       final EditText feedbackField = (EditText)inflater. 
                                              findViewById(R.id.EditTextFeedbackBody);
       String feedback = feedbackField.getText().toString();
    // your code here..
    

    【讨论】:

    • 我正在尝试这个,但它告诉我“方法 findViewById(int) 对于 LayoutInflater 类型未定义”
    • 对不起,如果我是菜鸟
    • @Zaid : 使用 use builder 而不是 inflater 不是问题
    • @Zaid : as final EditText nameField = (EditText)builder. findViewById(R.id.EditTextName);
    • 感谢您的快速回复,您的更好还是上面的那个更好?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 2017-05-22
    • 2011-08-08
    相关资源
    最近更新 更多