I have the following code inside an Adapter class I use for a listview in another class.
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setTitle("Introduceti parola:");
final EditText input = new EditText(getContext());
input.setInputType(InputType.TYPE_CLASS_TEXT);
builder.setView(input);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which)
{
hash.put("name", Rooms.name);
hash.put("parola", input.getText().toString());
site = siteul + "/join";
new ATask((ViewHolder) v.getTag()).execute(site);
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.show();
The problem is that when I trigger the action I get this error at the builder.show() line
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
I thought the getContext() was at fault, but it doesn't generate any error in this code in the same Adapter class:
Toast.makeText(getContext(), "Cool message!", Toast.LENGTH_LONG).show();
What could be the problem then?
Replace getContext() with ActivityName.this.
Related
I have an AlertDialog and I want to show it even if the user is visiting another activity.
This is AlertDialog:
AlertDialog.Builder builder = new AlertDialog.Builder(context.getApplicationContext());
builder.setMessage("Message").setCancelable(
false).setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}
}).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
AlertDialog alert = builder.create();
alert.show();
You can create a method in utils class and pass context, so that you can use dialog in required class, but precaution need to take with life cycles to avoid memory leaks.
I am using the technique brought up in previous StackOverflow questions, which suggest using TextViews and setting properties in them as the parameter for setTitle in an AlertDialog. I need this so I can style the font of the title.
The problem is that Android Studio says that it
cannot resolve method android.widget.TextView
Below is my code:
TextView settingsTitle = new TextView(this);
settingsTitle.setText("Settings");
settingsTitle.setTypeface(Typeface.createFromFile("monospace"));
new AlertDialog.Builder(this)
.setTitle(settingsTitle)
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// continue with delete
}
})
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// do nothing
}
})
.setIcon(android.R.drawable.ic_dialog_alert)
.show();
Replace your code as
new AlertDialog.Builder(this)
.setTitle(settingsTitle.getText().toString())
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// continue with delete
}
})
as there is no such method called setTitle() which has an argument of type TextView.
Thus use, settingsTitle.getText().toString() which gets the String in the TextView and use that to set the title like
setTitle(settingsTitle.getText().toString())
Read more about it in the docs
I'm facing a unreasolvable (for me) problem with nested AlertDialog using the following code
final AlertDialog.Builder button_cook_action = new AlertDialog.Builder(this);
final EditText cookMl = new EditText(this);
cookMl.setInputType(InputType.TYPE_CLASS_NUMBER);
button_cook.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
button_cook_action.setTitle(R.string.kitchen_recipe_button_cook)
.setMessage(R.string.kitchen_recipe_button_cook_volume)
.setView(cookMl)
.setPositiveButton(R.string.Yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
AlertDialog.Builder builderCooking = new AlertDialog.Builder(RecipeActivity.this);
builderCooking.setTitle(recipe.getName())
.setMessage("message");
builderCooking.show();
}
})
.setNegativeButton(R.string.No, null)
.show();
}
});
The first call works fine, but when i call it for a second time it gave me :
FATAL EXCEPTION: main
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
I already search in this forum but without any success.
If someone has a clue. Thanks in advance :)
You can do it like this - the problem was before if you use the EditText a second time it already has a parent - you need to create a new one each time inside your onClick() :
button_cook.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
final AlertDialog.Builder button_cook_action = new AlertDialog.Builder(this);
final EditText cookMl = new EditText(this);
cookMl.setInputType(InputType.TYPE_CLASS_NUMBER);
button_cook_action.setTitle(R.string.kitchen_recipe_button_cook)
.setMessage(R.string.kitchen_recipe_button_cook_volume)
.setView(cookMl)
.setPositiveButton(R.string.Yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
AlertDialog.Builder builderCooking = new AlertDialog.Builder(RecipeActivity.this);
builderCooking.setTitle(recipe.getName())
.setMessage("message");
builderCooking.show();
}
})
.setNegativeButton(R.string.No, null)
.show();
}
});
The problem is in the setView of your alertDialog. You have to inflate the layout everytime your create your dialog. In your case, your are inflating an EditText. So either you should create your EditText inside button_cook onClickListener or adopt the solution as posted by #ligi.
I've got a ListView where the cells/rows in that listView contains a button that presents an AlertDialog but when I tap the EditText to enter some text I get a NullPointerException when the ArrayAdapter's getView method returns.
I've tried
android:descendantFocusability="afterDescendants" & "beforeDescendants" on my ListView
and added android:windowSoftInputMode="adjustPan" which is what the similar topics has marked as correct answers but it's not working for me.
AlertDialog.Builder alert = new AlertDialog.Builder(Menu.this);
alert.setTitle(SubApp.pManager.getLanguageObject().getString("AddNoteToFavTitle"));
final EditText input = new EditText(Menu.this);
alert.setView(input);
alert.setPositiveButton("OK", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
saveInfoToPrefs(editor, id, input.getText().toString());
}
});
alert.setNegativeButton(SubApp.pManager.getLanguageObject().getString("No"), new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
saveInfoToPrefs(editor, id, "");
}
});
alert.show();
Does anyone know any other solution to this annoying issue?
Cheers!
The code is not working. Please help me. It print the replace all string, but further code is not running.
when I debug this, there is no error in the code. It will show the code of alert box.
if(count>0)
{
System.out.println("replace all string name ");
// final Intent intent_ul=new Intent(this, UploadExcel.class);
AlertDialog.Builder alertDialogBuilder_ue = new AlertDialog.Builder(this);
alertDialogBuilder_ue.setTitle("Alert!!");
alertDialogBuilder_ue
.setMessage("Are you sure you want to Replace all the data related to this style ? ")
.setCancelable(false)
.setPositiveButton("Yes",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int id) {
mySQLiteAdapter.openToWrite();
mySQLiteAdapter.delete_style_measurement(style_no);
Log.d("","yes click");
count=0;
mySQLiteAdapter.close();
}
})
.setNegativeButton("No",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int id) {
Log.d("","No click");
count++;
dialog.cancel();
// startActivity(intent_ul);
//finish();
}
});
}
Add these lines before the end of if condition
AlertDialog alertDialog = alertDialogBuilder_ue.create();
alertDialog.show();
You need to add
alertDialogBuilder_ue.show();
in your code
Check with this code. This code working for me
Context context = CurrentActivity.this;
AlertDialog.Builder ad = new AlertDialog.Builder(context);
ad.setTitle("Application");
ad.setMessage("Do you want to proceed?");
ad.setPositiveButton("Yes", new OnClickListener()
{
public void onClick(DialogInterface dialog, int arg1)
{
}
});
ad.setNegativeButton("Cancel", new OnClickListener()
{
public void onClick(DialogInterface dialog, int arg1)
{
}
});
ad.setCancelable(false);
ad.show();
In your code adding alertDialogBuilder_ue.show(); should make the dialog appear.
By some people it has been suggested that you have to use alertDialogBuilder_ue.create(); to get a handle to the AlertDialog that you can then use the .show() method on.
Both are possibilities but you don't have to use the .create() option if you don't need a handle to the AlertDialog