I am currently working on an android project. I am trying to have an alert dialogue in a standard java class so that the code can be re-used throughout the app.
However, it is returning the alertdialog from the class back to the activity but when I attempt to show the alert dialog it displays the following error:
Unable to add window -- token null is not for an application
Below is the code that I have used to create the alert dialogue
public AlertDialog showAlertDialog(String message, Context context)
{
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage("hello")
.setCancelable(false)
.setPositiveButton("Yes", new OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
return alert;
}
Below is the code from the android activity where I am trying to show the alert dialog
Common cla = new Common();
AlertDialog alert = cla.showAlertDialog("Hello", getApplicationContext());
alert.show();
Common is the name of the class
Please chage your AlerDialogCreation logic to AlertDialog.Builder builder = new AlertDialog.Builder(yourActivity.this);
Related
I am asking the same question which is asked before at below links but the solution proposed in these links is not working for me so I am posting it again.
How to make an AlertDialog disappear?
Android AlertDialog always exits when I click on OK Button
How to navigate to next activity after user clicks on AlertDialog OK button?
Basically, I am creating an AlertDialog builder to notify the user for asking to enable a setting for the Usage Data Access and when the OK button is pressed then the Settings menu gets opened. When I press back button to come back on the app then the AlertDialog is still available there although I expected to be dismissed to be back on my app.
public void show_alert(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("This application requires access to the Usage Stats Service. Please " +
"ensure that this is enabled in settings, then press the back button to continue ");
builder.setCancelable(true);
builder.setPositiveButton(
"OK",
new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int id) {
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
startActivity(intent);
dialog.dismiss();
}
});
builder.show();
return;
}
Any hint what wrong could be going here?
Edit after some testing:
I tested OPs code on 6.0.1 and it behaved as expected - i.e. the dialog was dismissed after clicked 'OK'. I'll leave my initial answer below as an alternative that also works. Additional alternatives can be found here.
You can get a reference to your Alert Dialog it from your builder.show() method:
mMyDialog = builder.show();
In your onClick method:
mMyDialog.dismiss();
Full sample:
AlertDialog mMyDialog; // declare AlertDialog
public void show_alert(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("This application requires access to the Usage Stats Service. Please " +
"ensure that this is enabled in settings, then press the back button to continue ");
builder.setCancelable(true);
builder.setPositiveButton(
"OK",
new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int id) {
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
startActivity(intent);
mMyDialog.dismiss(); // dismiss AlertDialog
}
});
mMyDialog = builder.show(); // assign AlertDialog
return;
}
I couldn't find anything usefull on the internet about my problem. So my question is how do you do a good usage of Android's alert dialogs. Here is an example of code creating and showing an alert dialog just with the title "error", the text "you can't do that" and a "Ok" button :
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setTitle("Error");
alertDialogBuilder.setMessage("You can't do that");
alertDialogBuilder.setCancelable(true);
alertDialogBuilder.setPositiveButton(
getResources().getString("ok"),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
alertDialogError = alertDialogBuilder.create();
alertDialogError.show();
But now, if I have many of this alert dialogs in my application, what should I do ?
Should I set the alertDialogBuilder as an attribute so each time I want to display an error message I can call his function setMessage() and then create() and then show() ?
Should I keep an already configured alertDialog for every single error message I have so I can just call theRightAlertDialog.show() to display my message ?
Something else ?
What's the good usage/cleanest way to do this for you ?
You could do this one of two ways. The first is to create a static method, which you can place in a final utility class:
public final class AlertUtil {
public static void showErrorDialog(Context context, String message) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Error");
builder.setMessage(message);
builder.setCancelable(true);
builder.setPositiveButton(
getResources().getString("ok"),
new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
builder.show();
}
}
Or you can use a DialogFragment which you can create with:
getSupportFragmentManager().beginTransaction().add(ErrorDialogFragment.newInstance(message), "tag").commit()`
I will say though, as a side note; if you are looking to change more than just a few fields for each of the dialogs (i.e. adding more parameters to the showErrorDialog method), then you probably should just stick to the Builder pattern. Considering that is what the Builder pattern is meant for.
Should I set the alertDialogBuilder as an attribute so each time I want to display an error message I can call his function setMessage() and then create() and then show() ?
If the title and the button functionality are the same for all of your alerts, than this would be the best strategy. Create a variable for the alertDialogBuilder, or even just the alertDialog itself, then change the message and show it each time.
Alternatively, you could create a method that builds the dialog, and takes in a string for the message text.
I am getting this error: ShowDialog cannot be resolved to a type
Here is my code:
final CharSequence[] items = {"Low", "Medium", "High"};
AlertDialog.Builder builder = new AlertDialog.Builder(ShowDialog.this);
builder.setTitle("Alert Dialog with ListView");
builder.setIcon(R.drawable.image1);
builder.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
}
});
AlertDialog alert = builder.create();
alert.show();
Any ideas why I am getting this annoying error? I have tried to refresh my code and also clean it and still no luck. Thanks
ShowDialog was most likely the class name you got the AlertDialog example from.
To make it work, you can replace AlertDialog.Builder builder = new AlertDialog.Builder(ShowDialog.this); with AlertDialog.Builder builder = new AlertDialog.Builder(this); if this is of Activity type or AlertDialog.Builder builder = new AlertDialog.Builder(<your_activity_class_name>.this); otherwise.
Note that if you are trying to show the dialog from within an event handler (usually inside an anonymous class), you have to go for the second option, AlertDialog.Builder builder = new AlertDialog.Builder(<your_activity_class_name>.this);.
To understand the changes better: the constructor you're getting the error on is accepting a Context as argument, hence the need to provide either this or <your_activity_class_name>.this to it as context of the Activity you're executing from.
Dialog dialog = new AlertDialog.Builder(Activity01.this)
.setTitle("Login hint")
.setMessage("Here needs your login!")
.setPositiveButton(...)
.setNeutralButton(...
).create();
What kind of grammar it is? I cannot understand why those dots are one by one? And the create() is for Builder() or for setNeutralButton()?
Thanks!
Builder is a static inner class of AlertDialog. Each call returns this allowing you to chain methods. Finally you call create() to create the actual dialog. This is basic Java and has little to do with Android, besides the fact that Android uses this pattern a lot.
setTitle, setMessage are the methods of the DialogBox.
you can also write
Dialog dialog = new AlertDialog.Builder(Activity01.this);
dialog.setTitle("Login hint")
dialog.setMessage("Here needs your login!")
dialog.setPositiveButton(...)
dialog.setNeutralButton(...)
dialog .create();
if you want more clarification about this you can visit this
.setPositiveButton(...) refers you want to pass text to displayed and write the logic for click events.
Refer here:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Are you sure you want to exit?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
MyActivity.this.finish();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
I have a usecase like repeatedly calling the same dialog box with different values. I am using the same dialog creating code for that. First time the sent data is populated to dialog box. but next time the dialog box not getting rebuilt with different values when i call the same for next time.
Code is here
dialog.setContentView(R.layout.orderdialog);
dialog.setTitle("Selected Item");
dialog.setCanceledOnTouchOutside(true);
System.out.println(selected); // here i am sending different values eachtime. But not updating in dialog.
TextView selectedItem = (TextView)dialog.findViewById(R.id.itemName);
selectedItem.setText(selected);
You can use the android alert builder to show dynamic data:
new AlertDialog.Builder(this)
.setTitle("your title name")
.setMessage("here you can write your dynamic data as string or integer")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(/* don't remember the signature by heart... */) {
// continue with delete
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(/* don't remember the signature by heart... */) {
// do nothing
}
})
.show();
Instead of calling
showDialog(id);
and creating dialog in oncreatDialog function
create the dialog and show it in you on click function itself:
like this:
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("State");
builder.setItems(m_arrStateNames, new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
m_nSelStateIdx = which;
showState();
dialog.dismiss();
}
});
builder.show();
}
});