2010-08-06 58 views
52

我想在android中使用警告对话框提示输入用户名和密码。我发现这个代码here:如何在警报对话框中添加两个编辑文本字段

if (token.equals("Not Found")) 
    { 
     LayoutInflater factory = LayoutInflater.from(this);    
     final View textEntryView = factory.inflate(R.layout.userpasslayout, null); 

     AlertDialog.Builder alert = new AlertDialog.Builder(this); 

     alert.setTitle("Please Login to Fogbugz"); 
     alert.setMessage("Enter your email and password"); 
     // Set an EditText view to get user input 
     alert.setView(textEntryView); 
     AlertDialog loginPrompt = alert.create(); 

     final EditText input1 = (EditText) loginPrompt.findViewById(R.id.username); 
     final EditText input2 = (EditText) loginPrompt.findViewById(R.id.password); 

     alert.setPositiveButton("Login", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int whichButton) { 
      input1.getText().toString(); **THIS CRASHES THE APPLICATION** 


     } 
     }); 

     alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
      // Canceled. 
      } 
     }); 

     alert.show(); 

    } 

编辑:我是能够建立适当的布局,但是当我尝试访问该文本字段收到错误信息。这里有什么问题?

回答

25

在Android SDK中的API Demos有一个例子。

它在DIALOG_TEXT_ENTRY之下。他们有一个布局,用LayoutInflater夸大它,并用它作为视图。

编辑:我在原来的答案中链接到的是陈旧的。这是一个mirror

+0

这个工作,但是当我尝试访问的EditText我仍然收到一个错误。我编辑了我的答案,是否有一些问题,因为这些字段尚未构建? – mbauer14 2010-08-06 21:13:23

+3

什么是“错误”? – EboMike 2010-12-05 02:19:34

+0

此网站上不再有此示例代码或最新样品 – conners 2012-07-18 08:42:21

1

看看AlertDialog docs。由于它指出,到一个自定义视图添加到您的警告对话框,你需要找到的FrameLayout,并添加您的视图,像这样:

FrameLayout fl = (FrameLayout) findViewById(android.R.id.custom); 
fl.addView(myView, new LayoutParams(MATCH_PARENT, WRAP_CONTENT)); 

最有可能你会希望创造一个布局xml文件的查看并膨胀它:

LayoutInflater inflater = getLayoutInflater(); 
View twoEdits = inflater.inflate(R.layout.my_layout, f1, false); 
19

在代码中使用这些行,因为textEntryView是用户名edittext和密码edittext的父级。

final EditText input1 = (EditText) textEntryView .findViewById(R.id.username); 
    final EditText input2 = (EditText) textEntryView .findViewById(R.id.password); 
+0

已经停留了这么久。我以为我没有正确充气,但事实证明我使用了错误的父母。感谢您的输入南迪! – Kitteh 2011-09-21 09:20:16

62

检查此警告框中的代码有编辑textview时单击确定它使用吐司显示在屏幕上。

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

    final AlertDialog.Builder alert = new AlertDialog.Builder(this); 
    final EditText input = new EditText(this); 
    alert.setView(input); 
    alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int whichButton) { 
      String value = input.getText().toString().trim(); 
      Toast.makeText(getApplicationContext(), value, 
       Toast.LENGTH_SHORT).show(); 
     } 
    }); 

    alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int whichButton) { 
      dialog.cancel(); 
     } 
    }); 
    alert.show();    
} 
+15

他想要两个EditText字段..不是一个 – Dediqated 2013-09-13 08:33:17

+0

只需添加另一个名为input2,然后alert.setView(input2); – Nepster 2014-05-08 06:05:58

+6

@Nepster - 'set'表示新视图(input2)将覆盖旧视图(input1)。 – 2014-06-09 11:58:26

0

我发现了另外一组例子来自一个名叫Mossila的男人定制AlertDialog。我认为他们比谷歌的例子更好。要快速查看Google的API演示,您必须将他们的演示jar导入到您的项目中,这可能不需要。

但是Mossila的示例代码是完全独立的。它可以直接剪切并粘贴到您的项目中。它只是工作!那么你只需要调整它以满足你的需求。请参阅here

10
LayoutInflater factory = LayoutInflater.from(this); 
final View textEntryView = factory.inflate(R.layout.text_entry, null); 
//text_entry is an Layout XML file containing two text field to display in alert dialog 
final EditText input1 = (EditText) textEntryView.findViewById(R.id.EditText1); 
final EditText input2 = (EditText) textEntryView.findViewById(R.id.EditText2);    
input1.setText("DefaultValue", TextView.BufferType.EDITABLE); 
input2.setText("DefaultValue", TextView.BufferType.EDITABLE); 
final AlertDialog.Builder alert = new AlertDialog.Builder(this); 

alert.setIcon(R.drawable.icon) 
    .setTitle("Enter the Text:") 
    .setView(textEntryView) 
    .setPositiveButton("Save", 
     new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
        Log.i("AlertDialog","TextEntry 1 Entered "+input1.getText().toString()); 
        Log.i("AlertDialog","TextEntry 2 Entered "+input2.getText().toString()); 
        /* User clicked OK so do some stuff */ 
      } 
     }) 
    .setNegativeButton("Cancel", 
     new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, 
        int whichButton) { 
      } 
     }); 
alert.show(); 
2

请检查以下代码。它以编程方式显示了2个编辑文本字段,没有任何布局xml。如果您在片段中使用它,请将'this'更改为'getActivity()'。

棘手的是,我们必须在创建警报对话框后设置第二个文本字段的输入类型,否则第二个文本字段将显示文本而不是点。

public void showInput() { 
     OnFocusChangeListener onFocusChangeListener = new OnFocusChangeListener() { 
      @Override 
      public void onFocusChange(final View v, boolean hasFocus) { 
       if (hasFocus) { 
        // Must use message queue to show keyboard 
        v.post(new Runnable() { 
         @Override 
         public void run() { 
          InputMethodManager inputMethodManager= (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
          inputMethodManager.showSoftInput(v, 0); 
         } 
        }); 
       } 
      } 
     }; 

     final EditText editTextName = new EditText(this); 
     editTextName.setHint("Name"); 
     editTextName.setFocusable(true); 
     editTextName.setClickable(true); 
     editTextName.setFocusableInTouchMode(true); 
     editTextName.setSelectAllOnFocus(true); 
     editTextName.setSingleLine(true); 
     editTextName.setImeOptions(EditorInfo.IME_ACTION_NEXT); 
     editTextName.setOnFocusChangeListener(onFocusChangeListener); 

     final EditText editTextPassword = new EditText(this); 
     editTextPassword.setHint("Password"); 
     editTextPassword.setFocusable(true); 
     editTextPassword.setClickable(true); 
     editTextPassword.setFocusableInTouchMode(true); 
     editTextPassword.setSelectAllOnFocus(true); 
     editTextPassword.setSingleLine(true); 
     editTextPassword.setImeOptions(EditorInfo.IME_ACTION_DONE); 
     editTextPassword.setOnFocusChangeListener(onFocusChangeListener); 

     LinearLayout linearLayout = new LinearLayout(this); 
     linearLayout.setOrientation(LinearLayout.VERTICAL); 
     linearLayout.addView(editTextName); 
     linearLayout.addView(editTextPassword); 

     DialogInterface.OnClickListener alertDialogClickListener = new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       switch (which){ 
       case DialogInterface.BUTTON_POSITIVE: 
        // Done button clicked 
        break; 
       case DialogInterface.BUTTON_NEGATIVE: 
        // Cancel button clicked 
        break; 
       } 
      } 
     }; 
     final AlertDialog alertDialog = (new AlertDialog.Builder(this)).setMessage("Please enter name and password") 
       .setView(linearLayout) 
       .setPositiveButton("Done", alertDialogClickListener) 
       .setNegativeButton("Cancel", alertDialogClickListener) 
       .create(); 

     editTextName.setOnEditorActionListener(new OnEditorActionListener() { 
      @Override 
      public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
       editTextPassword.requestFocus(); // Press Return to focus next one 
       return false; 
      } 
     }); 
     editTextPassword.setOnEditorActionListener(new OnEditorActionListener() { 
      @Override 
      public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
       // Press Return to invoke positive button on alertDialog. 
       alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick(); 
       return false; 
      } 
     }); 

     // Must set password mode after creating alert dialog. 
     editTextPassword.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD); 
     editTextPassword.setTransformationMethod(PasswordTransformationMethod.getInstance()); 
     alertDialog.show(); 
    } 
7
   /* Didn't test it but this should work "out of the box" */ 

       AlertDialog.Builder builder = new AlertDialog.Builder(this); 
       //you should edit this to fit your needs 
       builder.setTitle("Double Edit Text"); 

       final EditText one = new EditText(this); 
       from.setHint("one");//optional 
       final EditText two = new EditText(this); 
       to.setHint("two");//optional 

       //in my example i use TYPE_CLASS_NUMBER for input only numbers 
       from.setInputType(InputType.TYPE_CLASS_NUMBER); 
       to.setInputType(InputType.TYPE_CLASS_NUMBER); 

       LinearLayout lay = new LinearLayout(this); 
       lay.setOrientation(LinearLayout.VERTICAL); 
       lay.addView(one); 
       lay.addView(two); 
       builder.setView(lay); 

       // Set up the buttons 
       builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         //get the two inputs 
         int i = Integer.parseInt(one.getText().toString()); 
         int j = Integer.parseInt(two.getText().toString()); 
        } 
       }); 

       builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         dialog.cancel(); 
       } 
       }); 
       builder.show();