I am trying to find a way to open a small window which along with a button in non activity class. Basically i tried to use this way:
public class Mytest{
private Context context;
public Mytes(Context context)
{
this.context = context.getApplicationContext();
}
AlertDialog alertDialog = new AlertDialog.Builder(context).create(); //Use context
alertDialog.setTitle("Warning");
alertDialog.setMessage("You are currently in a battle");
alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
alertDialog.show();
but getting exception that
Unable to add window -- token null is not for an application
I have seen a thread in which someone suggested to use activity instead of context. i have try with both way to set context into nonactivity class from my main activity:
mytest = new Mytest(MainActivity.this);
but it is not working. Any other solution for this.
try to edit your constructor like this:
public Mytes(Context context) {
this.context = context;
}
Instead of getApplicationContext(), just use ActivityName.this.
Related
I'm very new to Android, and have a basic question. I need at certain points to display a user notification in a dialog box, which they can simply acknowledge with the OK button.
I'm using:
myActivity.runOnUiThread(new Runnable() {
public void run() {
AlertDialog alertDialog = new AlertDialog.Builder(myContext).create();
alertDialog.setTitle("Alert");
alertDialog.setMessage("My message");
alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
alertDialog.show();
}
});
This works well in the Main program, but within a called method it needs the Activity and the Context from the main program. Can anybody tell me how to pass these? getApplicationContext() seems to be acceptable, but I can't figure out how to pass the Activity.
Better still of course would be to get the parent Context and Activity within the method, but I can't get that to work either.
I'd be grateful for any help.
-update 10/07/21
Rahul has given me the solution to the problem I posed: how to pass in the Activity and Context.
The problem is that the dialog still doesn't show.
I found a variation online as follows:
AlertDialog.Builder builder = new AlertDialog.Builder(myContext);
builder.setTitle("Alert")
.setMessage("My message")
.setCancelable(false)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});
AlertDialog alert = builder.create();
alert.show();
but this doesn't work either.
I'm puzzled that such a common and simple task needs so much code. In the desktop languages I'm used to it can be done in a single line.
So my titled question stands, but can anyone see where the code is faulty?
Many thanks
You can either pass activity to the class when initializing the object or you can pass activity when calling the function.
Case 1 (Recommended)
Pass Activity when calling the function:
MyObj myObj = new MyObj();
myObj.showDialog(myValue, ActivityName.this);
Where function will look like this:
public void showDialog(int myValue, Activity activity){
...
}
Then you can use this activity instance inside the method.
Case 2
Pass Activity when initializing the object:
MyObj myObj = new MyObj(ActivityName.this);
Where Class will look like this:
class MyObj{
private Activity thisActivity;
public MyObj(Activity activity){
thisActivity = Activity;
}
...
}
Then you can use this activity instance.
When you have activity object available you can replace context object with it.
I'm trying to create a custom class for displaying a Yes/No AlertDialog, but I want to onClick handler to be in the activity that instantiates the custom class. So far, the custom class looks like this:
public class YesNoDialog {
private Context gContext = null;
private DialogInterface.OnClickListener onClickListener;
private AlertDialog alertDialog = null;
public YesNoDialog(Context context,
DialogInterface.OnClickListener listener) {
this.gContext = context;
this.onClickListener = listener;
}
public void ShowDialog() {
AlertDialog.Builder alertDialogBuilder = new
AlertDialog.Builder(this.gContext);
alertDialogBuilder.setTitle("Hello World");
alertDialogBuilder
.setMessage("Are you sure?")
.setCancelable(false)
.setPositiveButton("Yes",this.onClickListener)
.setNegativeButton("No",this.onClickListener);
alertDialog = alertDialogBuilder.create();
alertDialog.show();
}
}
My thinking was to pass the context and onClick handler to the object in the constructor, then assign the handler to the .setPositive and .setNegative buttons.
I implemented the DialogInterface.OnClickListener in my MainActivity class:
public class MainActivity
extends AppCompatActivity
implements DialogInterface.OnClickListener {
And created the onClick handler in MainActivity that should be called when either the Yes or No buttons are clicked in the dialog.
#Override
public void onClick(DialogInterface dialog, int id) {
Log.d("DIALOG RETURNS ID=", Integer.toString(id));
dialog.dismiss();
}
I'm not sure if I'm on the right track or not, but I got stuck in trying to figure out how I would now pass the onClick handler to the YesNoDialog object. I've tried several variations of this:
YesNoDialog dialog = new YesNoDialog(this, MainActivity.onClick);
With no success (won't compile). I have also tried passing only the context, assuming that maybe that's all I really need for .setPositive and .setNegative button handlers, but that didn't work either...this calls require a DialogInterface.OnClickListener.
It feels like I'm close, but I can't get over the hurdle. Can anyone help me connect the dots?
Create a class (DialogUtils) and add this method in it.
public static void showPopUp(Context context
, String title
, String msg
, String positiveBtnTxt
, String negativeBtnTxt
, DialogInterface.OnClickListener positiveBtnListener
, DialogInterface.OnClickListener negativeBtnListener){
final AlertDialog errorDialog;
AlertDialog.Builder errorDialogBuilder = new AlertDialog.Builder(context, R.style.NativeDialogue);
errorDialogBuilder.setTitle(title);
errorDialogBuilder.setMessage(msg);
errorDialogBuilder.setPositiveButton(positiveBtnTxt, positiveBtnListener);
errorDialogBuilder.setNegativeButton(negativeBtnTxt, negativeBtnListener);
errorDialog = errorDialogBuilder.create();
errorDialog.show();
}
Call the method like this :
DialogUtils.showPopUp(this, "title", "message", "positive btn name", "Negative Btn name", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
"Your action"
}
}, new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
"Your action"
}
});
This is described in the official documentation on dialogs in Android. In short, you need to do the following steps:
Create a DialogFragment for your dialog so it is properly restored when the device rotates or changes the configuration in some other way.
Create an interface which will allow you to send the result of the dialog.
Implement this interface in the activity.
Cast the activity to the interface inside the DialogFragment in onAttach and store it in some field. Don't forget to set to null in onDetach.
When a dialog button is clicked, you can call the appropriate interface method, and the activity will get the result.
Alternatively, if you only ever use this dialog with one activity, you may not declare an interface and simply store a reference to the activity.
Hey you can make one method in your MainActivity class. Like below.
public void onClickOnYesButton(int id){
}
Pass the MainActivity reference like below.
public YesNoDialog(MainActivity context) {
this.gContext = context;
}
And call the onClickOnYessButton by using the MainActivity reference!
Job done!
I am using the google maps api with overlay items and want to be able to get directions when the user clicks these overlays.
I want this linked to the middle button of my dialog:
// Middle button
dialog.setNeutralButton("Directions",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("http://maps.google.com/maps?saddr=20.344,34.34&daddr=20.5666,45.345"));
intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
startActivity(intent);
}
});
I get the following error "The method startActivity(Intent) is undefined for the type new DialogInterface.OnClickListener(){}"
There are several answers to this on here but I cannot get any of them to work. I have tried both creating a constructor and calling getContext().
I am not sure if it is because my class is:
public class ItemizedOverlayLayoutActivity extends ItemizedOverlay {
Any help greatly appreciated.
Thanks
In the constructer of your class ItemizedOverlayLayoutActivity add a parameter Context:
private Context context;
public MyItemizedNewOverlay(Drawable defaultMarker, Context context) {
//...
this.context = context;
}
just before you create your dialog add:
final Context fcontext = context;
Then in the dialog middle button use:
fcontext.startActivity(intent);
good luck
I am implementing GCM (Google Cloud Messaging) into my App.
I set it up all like in the Google Tutorial, and it works so far.
I display a notification in the notification-bar when onMessage when the GCMIntentService gets called.
Now I have a method that tells me if the app is in foreground or not.
When the app is in background it shows the notification in the bar with no problem.
But how could I show a Dialog to the user?
When I call:
AlertDialog.Builder builder = new AlertDialog.Builder(context);
where context is the given context from onMessage(), I of course this error:
_Notification.showPopUp() Error: android.view.WindowManager$BadTokenException: Unable to add window --
token null is not for an application
So I tried to replace the context with MainActivity.this, for this purpose I saved it in a static variable; but when i now run it, nothing happens, no error, no dialog appears.
My code for the dialog:
private static AlertDialog.Builder myAlertDialog;
private static void showPopUp(Context context,String kind, String resource_name, Integer resource_id)
{
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage("Are you sure you want to exit?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int id)
{
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int id)
{
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
Log.e("TEST","alert.show()");
}
The last log: alert.show() gets displayed in logcat, but no error.
Spec:
Runnning on the device (Galaxy S2)
Android 4.0.3
Could someone please tell me what is wrong with my code, or does anybody knows some workaround?
Edit:
The part where I save my MainActivity.this:
private static Context context_forshowingPopUp = null;
onCreate
//Set the context for showing a popup View
_Notification.setContext_forshowingPopUp(this);
AlertDialog.Builder builder = new AlertDialog.Builder(getContext_forshowingPopUp());
public static Context getContext_forshowingPopUp()
{
return context_forshowingPopUp;
}
public static void setContext_forshowingPopUp(Context context_forshowingPopUp)
{
_Notification.context_forshowingPopUp = context_forshowingPopUp;
}
you must use YourCurrentActivity.this as a context while building Alertdialog. You can solve like below .
first class :
public class Config{
public static Context context;
}
when your activity creates , just set Config.contex
public class MyActivity extends Activity {
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Config.context=this;
...}
//other stuffs
}
In OnMessage
showPopUp(Config.context,kind, resource_name, resource_id);
I have one activity/java file (Browsefile.java) that would obtain the absolute path of the file. I want to pass this information to another java file for further processing (Sqlitefun.java). In the first stage, I just want to make sure the variable of file path is passed from Browsefile.java to Sqlitefun.java so I just create an alertdialog in the Sqlitefun.java file to test it. However, I have some issue on the context of the alertdialog object.
(As Sqlitefun.java would further perform i/o and Sqlite processing tasks, I prefer to put this in another file.)
Here are the codes for the files:
Browsefile.java
public class Browsefile extends ListActivity {
....
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.browsefile);
findViews();
getDir(root);
}
....
#Override
protected void onListItemClick(ListView l, View v, int position, long id) {
File file = new File(path.get(position));
if (file.isDirectory())
{
if(file.canRead())
{
getDir(path.get(position));
}
else
{
selectpath = file.getAbsolutePath();
fpath.setText(selectpath);
}
}
else
{
selectpath = file.getAbsolutePath();
fpath.setText(selectpath);
}
}
private Button.OnClickListener importcsv = new Button.OnClickListener() {
public void onClick(View v) {
Sqlitefun firstClass = new Sqlitefun();
firstClass.getsAlertDialog(selectpath);
}
};
....
}
Sqlitefun.java
public class Sqlitefun {
private Context context;
public void getsAlertDialog(String filepath) {
new AlertDialog.Builder(context)
.setMessage(filepath)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
})
.show();
}
}
I have tried to use this, Sqlitefun.this to replace context in the line new AlertDialog.Builder(context) but none of this works. (Eclipse said The constructor AlertDialog.Builder(Sqlitefun) is undefined and did not allow me to compile. The above code did not have any error and allow me to compile, but there is a nullpointer exception for the Context.
I believe you need to show dialogs from the Activity you are currently in, so you would need to the put AlertDialog code in BrowserFile.
I'm not sure if this would work, but you could try passing the context from BrowserFile to SqliteFun and showing it there.
Additionally, if you're not set on using an AlertDialog, trying using a Toast notification instead. They generally do better when used outside of an Activity.
Edit: I don't think the following is the best way to implement what you are trying to do, but here is a code sample I wrote
In SqliteFun, modify your method as such:
public void getsAlertDialog(String filepath, Context mContext) {
new AlertDialog.Builder(mContext)
.setMessage(filepath)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
})
.show();
}
Then from your Activity, use this:
private Button.OnClickListener importcsv = new Button.OnClickListener() {
public void onClick(View v) {
Sqlitefun firstClass = new Sqlitefun();
firstClass.getsAlertDialog(selectpath, v.getContext());
}
};
Try this:
private Context context = getApplicationContext()
You need to give contex from activity you execute this method. So I suggest you to add constructor to Sqlitefun class and when you create object of this class add context to arguments.
There is something wrong in your app design.
You cannot really show a Dialog from another class than an activity class (well, you can, but it's very dangerous because the activity context can change anytime. For example when the device is rotated your app will crash because the activity context changed, since in Sqlitefun your reference still points to the old context).
So you should find another way to show your dialog. For example, you can create some getters to retrieve the values to show on your AlertDialog, and create it inside your activity.
First create a static variable in Sqlitefun.java.
Static String path;
After that you can access this variable from any class so you can directly store that path from Browse.class
Ex: You got the fullpath="XXXX" in browse.class. To store the fullpath variable in Sqlitefun.java use:
Sqlitefun.path=fullpath;