在警报对话框中性按钮上单击将日期分配给 EditText

On Alert Dialog Neutral Button Click Assign Date to EditText

我已经为此苦苦挣扎了一段时间。我在我的警报对话框中添加了一个中性按钮,该按钮基本上是在不关闭对话框的情况下将今天的日期插入对话框的输入区域。让用户有机会自定义输入。

中性按钮出现在对话框中,但当它被单击时,它会像取消按钮一样从对话框中取消。

我浏览了本网站和其他网站上的许多不同帖子。但是我找不到与我正在尝试做的事情相关的任何内容。我知道这不是火箭科学,但我不知道如何解决这个问题。任何帮助,将不胜感激。 这是我创建警报对话框的代码

//Show Alert Dialog With EditText Options to Enter/Edit A Series
    //When shouldUpdate = true, It Will Automatically Display Old Series Name And Change The Button Text To UPDATE
    private void showSeriesDialog(final boolean shouldUpdate, final Series series, final int position) {
        LayoutInflater layoutInflaterAndroid = LayoutInflater.from( getApplicationContext() );
        final View view = View.inflate( this, R.layout.dialog_series, null );

        AlertDialog.Builder alertDialogBuilderUserInput = new AlertDialog.Builder( SeriesActivity.this );
        alertDialogBuilderUserInput.setView( view );

        final EditText inputSeries = view.findViewById( R.id.etSeriesNameInput );
        leagueId.setText( savedLeagueId );
        bowlerId.setText( savedBowlerId );
        TextView dialogTitle = view.findViewById( R.id.dialog_title );
        dialogTitle.setText( !shouldUpdate ? getString( R.string.lbl_new_series_title ) : getString( R.string.lbl_edit_series_title ) );

        if (shouldUpdate && series != null) {
            inputSeries.setText( series.getName() );
            leagueId.setText( series.getLeagueId() );
            bowlerId.setText( series.getBowlerId() );

        }
        alertDialogBuilderUserInput.setCancelable( false ).setPositiveButton( shouldUpdate ? "update" : "save", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialogBox, int id) {

            }
        } ).setNegativeButton( "cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialogBox, int id) {
                dialogBox.cancel();
            }
        } ) .setNeutralButton("use date",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialogBox, int id) {
                        String dateNow = getDateNow();
                        inputSeries.setText(dateNow);

                    }
                });

        final AlertDialog alertDialog = alertDialogBuilderUserInput.create();
        alertDialog.show();

        alertDialog.getButton( AlertDialog.BUTTON_POSITIVE ).setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //Show Toast Message When No Text Is Entered
                if (TextUtils.isEmpty( inputSeries.getText().toString() )) {
                    Toast.makeText( SeriesActivity.this, "Enter Series!", Toast.LENGTH_SHORT ).show();
                    return;
                } else {
                    alertDialog.dismiss();
                }


                //Check If User Is Updating Series
                if (shouldUpdate && series != null) {

                    //Updating Series By Its Id
                    updateSeries( inputSeries.getText().toString(), position );

                } else {
                    //Creating New Series
                    createSeries( leagueId.getText().toString(), bowlerId.getText().toString(), inputSeries.getText().toString() );
                }
            }
        } );
    }



    private String getDateNow() {
            Calendar cal = Calendar.getInstance();
            SimpleDateFormat sdf = new SimpleDateFormat("d-MM-yyyy", Locale.ENGLISH);
            return sdf.format(cal.getTime());
        }

此问题与单击按钮时关闭警报对话框无关,而是与如何从 getDateNow 获取日期值以显示在输入字段中有关 "Enter Series Name",而不是每次都必须手动输入日期你想添加一个系列。

我能够使用以下代码获得 "USE DATE" 按钮来填充 EDITTEXT 字段:

alertDialog.getButton( AlertDialog.BUTTON_NEUTRAL ).setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //Show Toast Message When No Text Is Entered
                if (TextUtils.isEmpty( inputSeries.getText().toString() )) {
                    String dateNow = getDateNow();
                    inputSeries.setText(dateNow);
                    return;
                } else {
                    alertDialog.dismiss();
                }


                //Check If User Is Updating Series
                if (shouldUpdate && series != null) {

                    //Updating Series By Its Id
                    updateSeries( inputSeries.getText().toString(), position );

                } else {
                    //Creating New Series
                    createSeries( leagueId.getText().toString(), bowlerId.getText().toString(), inputSeries.getText().toString() );
                }
            }
        } );


        alertDialog.getButton( AlertDialog.BUTTON_POSITIVE ).setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //Show Toast Message When No Text Is Entered
                if (TextUtils.isEmpty( inputSeries.getText().toString() )) {
                    Toast.makeText( SeriesActivity.this, "Enter Series!", Toast.LENGTH_SHORT ).show();
                    return;
                } else {
                    alertDialog.dismiss();
                }


                //Check If User Is Updating Series
                if (shouldUpdate && series != null) {

                    //Updating Series By Its Id
                    updateSeries( inputSeries.getText().toString(), position );

                } else {
                    //Creating New Series
                    createSeries( leagueId.getText().toString(), bowlerId.getText().toString(), inputSeries.getText().toString() );
                }
            }
        } );
    }

问题是以下代码必须为空才能使其正常工作。有没有另一种写法,无论 EDITTEXT 字段是否为空,它都会起作用?

if (TextUtils.isEmpty( inputSeries.getText().toString() )) {
                        String dateNow = getDateNow();
                        inputSeries.setText(dateNow);
                        return;
                    } else {
                        alertDialog.dismiss();
                    }

根据文档,中性按钮为 -

中性 - 当用户可能不想继续操作但不一定要取消时,您应该使用它。它出现在正负按钮之间。例如,操作可能是 "Remind me later."

您只能将每种按钮类型中的一种添加到 AlertDialog。也就是说,您不能有一个以上的 "positive" 按钮。

因此,您不能直接将它用于您的工作,因为它会在单击时关闭对话框。您需要对其进行自定义,或者您可以创建自己的对话框。

以防将来有人试图完成类似的事情。

“中立”按钮可用于上述以外的其他用途。它可以作为一个肯定按钮来从一个函数中捕获一些输入,在我的例子中它是获取今天的日期并通过添加一个 return 而不是关闭对话框我能够为用户保持打开状态修改日期,然后单击 "save"。

这是我用来完成此操作的代码:

alertDialog.getButton( AlertDialog.BUTTON_NEUTRAL ).setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //Show Toast Message When No Text Is Entered
                if (inputSeries.getText().toString() !=null && !inputSeries.getText().toString().isEmpty() ) {
                    String dateNow = getDateNow();
                    inputSeries.setText(dateNow);
                    return;
                } else {
                    alertDialog.dismiss();
                }


                //Check If User Is Updating Series
                if (shouldUpdate && series != null) {

                    //Updating Series By Its Id
                    updateSeries( inputSeries.getText().toString(), position );

                } else {
                    //Creating New Series
                    createSeries( leagueId.getText().toString(), bowlerId.getText().toString(), inputSeries.getText().toString() );
                }
            }
        } );

查看我在问题中发布的最后一张图片以查看结果。