警报对话框中的EditText框上的空验证 - Android

时间:2010-04-05 19:27:36

标签: java android validation alert

我正在尝试向位于警告对话框中的编辑文本字段添加一些文本验证。它会提示用户输入名称。

我想添加一些验证,以便如果他们输入的内容为空或空,除了创建Toast说错误之外,它不会做任何事情。

到目前为止,我有:

    AlertDialog.Builder alert = new AlertDialog.Builder(this);
    alert.setTitle("Record New Track");
    alert.setMessage("Please Name Your Track:");
    // Set an EditText view to get user input
    final EditText trackName = new EditText(this);
    alert.setView(trackName);
    alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {

            String textString = trackName.getText().toString(); // Converts the value of getText to a string.
            if (textString != null && textString.trim().length() ==0)
            {   

                Context context = getApplicationContext();
                CharSequence error = "Please enter a track name" + textString;
                int duration = Toast.LENGTH_LONG;

                Toast toast = Toast.makeText(context, error, duration);
                toast.show();


            }
            else 
            {

                SQLiteDatabase db = waypoints.getWritableDatabase();
                ContentValues trackvalues = new ContentValues();
                trackvalues.put(TRACK_NAME, textString);
                trackvalues.put(TRACK_START_TIME,tracktimeidentifier );
                insertid=db.insertOrThrow(TRACK_TABLE_NAME, null, trackvalues);

            }

但这只是关闭警报对话框然后显示Toast。我希望警报对话框仍然在屏幕上。

由于

6 个答案:

答案 0 :(得分:3)

我认为你应该重新创建Dialog,因为在DialogInterface中作为参数给出的onClick()似乎没有给你一个选项来阻止{{1}的关闭}}

我还有一些提示:

尝试使用DialogActivity.onCreateDialog(),当然还有Activity.onPrepareDialog()。它们使对话框的使用变得更加容易(至少对我而言),对话框的使用看起来更像菜单用法。使用这些方法,您还可以更加轻松地再次显示对话框。

我想给你一个提示。这不是你问题的答案,但在答案中这样做更具可读性。

您可以简单地执行以下操作,而不是保留对Activity.showDialog()对象的引用:

AlertDialog.Builder()

为您保存参考和大量输入;)。 (几乎?)new AlertDialog.Builder(this) .setTitle("Record New Track") .setMessage("Please Name Your Track:") //and some more method calls .create(); //or .show(); 的所有方法都返回一个AlertDialog.Builder对象,您可以直接调用该方法。

同样适用于AlertDialog.Builder s:

Toast

答案 1 :(得分:3)

我在我的类中创建了一个新方法,该方法显示警报并在该方法中放置用于创建警报的所有代码。然后在调用Toast之后我调用该方法。假设我将该方法命名为createAlert(),然后我将其命名为

  createAlert(){

 AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Record New Track");
alert.setMessage("Please Name Your Track:");
// Set an EditText view to get user input
final EditText trackName = new EditText(this);
alert.setView(trackName);
alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {

        String textString = trackName.getText().toString(); // Converts the value of getText to a string.
        if (textString != null && textString.trim().length() ==0)
        {   

            Context context = getApplicationContext();
            CharSequence error = "Please enter a track name" + textString;
            int duration = Toast.LENGTH_LONG;

            Toast toast = Toast.makeText(context, error, duration);
            toast.show();
            createAlert();



        }
        else 
        {

            SQLiteDatabase db = waypoints.getWritableDatabase();
            ContentValues trackvalues = new ContentValues();
            trackvalues.put(TRACK_NAME, textString);
            trackvalues.put(TRACK_START_TIME,tracktimeidentifier );
            insertid=db.insertOrThrow(TRACK_TABLE_NAME, null, trackvalues);

        }
}

答案 2 :(得分:1)

您应该做的是创建一个自定义xml布局,包括文本框和“确定”按钮,而不是使用.setPositiveButton。 然后,您可以向按钮添加单击侦听器,以验证数据并关闭对话框。

应该在CreateDialog中使用:

protected Dialog onCreateDialog(int id) 
{
            LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

if (id==EDIT_DIALOG)
{
            final View layout = inflater.inflate(R.layout.edit_dialog, (ViewGroup) findViewById(R.id.Layout_Edit));

            final Button okButton=(Button) layout.findViewById(R.id.Button_OkTrack);
            final EditText name=(EditText) layout.findViewById(R.id.EditText_Name);
            okButton.setOnClickListener(new View.OnClickListener() 
            {
                public void onClick(View v) {
                    String textString = trackName.getText().toString(); 
                    if (textString != null && textString.trim().length() ==0)
                    {
                        Toast.makeText(getApplicationContext(), "Please enter...", Toast.LENGTH_LONG).show();
                    } else
                        removeDialog(DIALOG_EDITTRACK);
                }
            });            
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setView(layout);
            builder.setTitle("Edit text");

            AlertDialog submitDialog = builder.create();            
            return submitDialog;
}

答案 3 :(得分:0)

使用此代码显示对话框。

 public void onClick(DialogInterface dialog, int whichButton) {

            String textSt`enter code here`ring = trackName.getText().toString(); // Converts the value of getText to a string.
            if (textString != null && textString.trim().length() ==0)
            {       
                Context context = getApplicationContext();
                CharSequence error = "Please enter a track name" + textString;
                int duration = Toast.LENGTH_LONG;

                Toast toast = Toast.makeText(context, error, duration);
                toast.show();

                new AlertDialog.Builder(this)
                .setTitle("Message")
                .setMessage("please enter valid field")
                .setPositiveButton("OK", null).show();            
            }

这将为您创建一个对话框,editText为空或您想要的条件。

答案 4 :(得分:0)

//如果未实例化视图,则它始终为edittext值返回null。

View v = inflater.inflate(R.layout.new_location_dialog, null);
builder.setView(v); 



final EditText titleBox = (EditText)v.findViewById(R.id.title);
final EditText descriptionBox = (EditText)v.findViewById(R.id.description); 

答案 5 :(得分:0)

即使这是一篇老文章,下面的代码也会对某些人有所帮助。我使用了自定义的布局和扩展的DialogFragment类。

    // put each link text and href in the linkUrls array
    $(links).each( (i, link) => {
        linkUrls[String($(link).text())] = $(link).attr('href');
    })

    let results = {};
    results['title'] = pageTitle;

    let num = 0;

    for (const linkText in linkUrls) {

        const response = await axios.get(linkUrls[linkText])
        .then( (r) => {
            if (r.status != 200) {
                num += 1;
                results[ 'broken link ' + String(num)] = {
                    'text': linkText,
                    'url': linkUrls[linkText],
                    'status code': r.status
                }
            }

        })
        .catch( (err) => {
            num += 1;
            results[ 'broken link ' + String(num)] = {
                'text': linkText,
                'url': linkUrls[linkText],
                'status code': err.response.status
            }
        })
    }

    console.log('results: ', results);

    return results;