简体   繁体   中英

How to display Toast from AlertDialog?

When the user clicks on the save button, an AlertDialog appears and asks the user to input text for the file name.

If the user clicks the positive button ("Ok") without specifying a name, I want to display a toast which asks them to do so, and keep the AlertDialog open. But the toast never displays and the dialog closes.

The code for the AlertDialog is here:

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

    alert.setTitle(R.string.save_game);
    alert.setMessage(R.string.request_name);

    // Set an EditText view to get user input 
    final EditText input = new EditText(this);
    input.setHint(R.string.untitled);
    alert.setView(input);

    alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
      String value = input.getText().toString();
      if(value != null){
          // Do something with value      
      }
      else{
          Toast.makeText(context, R.string.no_name_given, Toast.LENGTH_SHORT).show();
      }
    }
    });

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

    alert.show();

How can I make this happen?

Thanks!

Public void showToast() {
    Toast.makeText(this, R.string.no_name_given, Toast.LENGTH_SHORT).show();
} 

Just call this method instead of displaying toast from an alert dialog box like this in your code.

else {
    showToast();
}

To keep it open use this method

public void forceOpen() {

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

    alert.setTitle(R.string.save_game);
    alert.setMessage(R.string.request_name);

    // Set an EditText view to get user input 
    final EditText input = new EditText(this);
    input.setHint(R.string.untitled);
    alert.setView(input);

    alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            String value = input.getText().toString();
            if(value != null) {
                // Do something with value      
            }
            else {
                Toast.makeText(context, R.string.no_name_given, Toast.LENGTH_SHORT).show();
            }
        }
    });

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

    alert.show();

}

Just reopen it.. Not sure why it closes but this will work

Change the code as follows:

if(value != null && value.length()>0){

// Do something with value      
 }else{
          Toast.makeText(context, R.string.no_name_given, Toast.LENGTH_SHORT).show();
}

您可以禁用确定按钮。如果条件成立,则再次启用按钮。

public void alert()
    {
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(R.layout.simple, null);

        final EditText etText = (EditText) v.findViewById(R.id.etName);

        final AlertDialog d = new AlertDialog.Builder(this)
        .setView(v)
        .setTitle("Warning ..")
        .setPositiveButton(android.R.string.ok,
                new Dialog.OnClickListener() {
            @Override
            public void onClick(DialogInterface d, int which) 
            {
                //Do nothing here. We override the onclick
                Toast.makeText(getApplicationContext(), "Enter Text", Toast.LENGTH_LONG).show(); 
            }
        })
        .setNegativeButton(android.R.string.cancel, null)
        .create();
        d.show();
}

A simple way what worked for me to get Context from AlertDialog's OnClick method using DialogInterface:

((Dialog) dialogInterface).getContext()

Using it in OnClick() method:

public void onClick(DialogInterface dialogInterface, int which) {
        Toast.makeText(((Dialog) dialogInterface).getContext(), "Bla-bla" , Toast.LENGTH_SHORT).show();
}

General Solution

If you want to update anything on Activity from a Dialog this solution might help. For example, showing a toast message from a Dialog button click.

Create a listener

public interface YesNoClickListner {

    public void yesClicked();

    public void noClicked();
}

Pass the interface in your dialog

public class FireMissilesDialog extends DialogFragment {

    private YesNoClickListner listner;

    public FireMissilesDialog(YesNoClickListner listner){
        this.listner = listner;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage("This is custom Dialog")
            .setPositiveButton("YES", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    listner.yesClicked();
                }
            })
            .setNegativeButton("NO", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    listner.noClicked();
                }
            });
        return builder.create();
    }
}

Implement the listener in your Activity and override methods

public class MainActivity extends AppCompatActivity implements YesNoClickListner{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FireMissilesDialog fireMissilesDialog = new FireMissilesDialog(this);
        fireMissilesDialog.show(getSupportFragmentManager(),"Dialog");

    }

    @Override
    public void yesClicked() {
        Toast.makeText(this, "Yes Clicked", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void noClicked() {
        Toast.makeText(this, "No Clicked", Toast.LENGTH_SHORT).show();
    }
}

Result:

在此处输入图片说明

This solution may not be exactly what you need to solve this particular question. But this works in general. For example, if you need to update a textView in your Activity on YES button click then just override method this like.

@Override
public void yesClicked() {
   Toast.makeText(this, "Yes Clicked", Toast.LENGTH_SHORT).show();
}

Relevant Link:

Full working code

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM