Reputation: 1507
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!
Upvotes: 7
Views: 24819
Reputation: 18202
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();
}
}
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();
}
Upvotes: 0
Reputation: 829
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();
}
Upvotes: 0
Reputation: 1141
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
Upvotes: 6
Reputation: 21
You can disable the Ok button.If the condition is validate,then enable button again.
Upvotes: 1
Reputation: 6044
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();
}
Upvotes: 2
Reputation: 4382
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();
}
Upvotes: 0