Reputation: 2642
I have written a class that extends the View class to show some data. The user needs to be able to manipulate this data by clicking on it and being presented with various options in a dialog box.
The problem I am getting, however, is that in Android, to initialise an AlertDialog.Builder instance, you must pass in "this" (As in an activity) in order for it to work (getApplicationContext() does not work - see this article: Dialog throwing "Unable to add window — token null is not for an application” with getApplication() as context)
How can I get past this problem and show the dialog from within my class that extends View?
Upvotes: 0
Views: 4684
Reputation: 8550
If you need to open a messagebox from a non view class then you have two solutions :
Use handlers : http://developer.android.com/reference/android/os/Handler.html Create a handler in your view, then pass it to your class be stored. When you want to call your messagebox, you'll use
handler.post(new Runnable() {//show messagebox here});
Or
Be careful of memory leaks with the context passing mecanism
EDIT :
I was writing some code to get you going on how to use handlers when I took a chance and went for the doc. Usually there is nothing of use there but for this particular case, oh miracle, look what I found, complete and easy to understand code example of how to use a handler and its message mecanism. It is hidden under the foldable title ("http://developer.android.com/guide/topics/ui/dialogs.html#ShowingAProgressBar") : http://developer.android.com/guide/topics/ui/dialogs.html#ShowingAProgressBar
EDIT2 AFTER COMMENTS
Because the op wants its object to be reusable in different activities it makes sense not to use handlers but instead to pass the context( a link to the calling activity really) to the object. The object will then be able to use this context in the dialog.builder.
In the oncreate of your activity class called MyActivity :
MyCustomObject myObject = new MyCustomObject(this);
In your object class
Class MyCustomObject {
private MyActivity mContext;
void MyCustomObject(MyActivity context) {
this.mContext = context;
}
private showDialog(String message) {
AlertDialog.Builder alert = new AlertDialog.Builder(mContext);//we use the context
}
}
DO NOT FORGET TO DESTROY AND NULLIFY THE DIALOG BUILDER AND THE mContext when you are done with your object. This could leak memory really fast.
Upvotes: 3
Reputation: 2018
You must have posted some code,Or lt try it with
getParent();
instead of this.And please show some code to us
Upvotes: 0
Reputation: 9851
Use View.getContext() and pass that into your AlertDialog.Build
instance.
Upvotes: 1