Problem of Context in AlertDialogs Android
I have a problem in my app.
Before everything, sorry for my bad english.
I have a MainActivity with five fragments and a class of functions (FunctionsApp).
In one of the fragments, it's found "OptionsFragment", this fragment have buttons to go the Settings, logout, and others options.
The problems is when inside the fragment (OptionsFragment) I select the button for go to other Activity, after I do back (with its respective finish), in the fragment OptionsFragment I select the button Logout, that call the FunctionsApp and show a AlertDialog.
Showed error:
android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@e363980 is not valid; is your activity running?
Code:
OptionsFragment:
package com.kevin.app.activities;
import...
public class OptionsFragment extends Fragment implements NavigationView.OnNavigationItemSelectedListener {
FunctionsApp functionsapp = new FunctionsApp(getActivity());
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View vista=inflater.inflate(R.layout.fragment_options, container, false);
NavigationView navigationView = (NavigationView)vista.findViewById(R.id.nav_options_view);
navigationView.setNavigationItemSelectedListener(this);
return vista;
}
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_options_logout) {
functionsapp.logoutAsk();
} else if (id == R.id.nav_options_settings) {
functionsapp.goSettingsActivity();
}
return true;
}
}
FunctionsApp:
package com.kevin.app.aplicacion;
import..
public class FunctionsApp {
private static Context context;
public FunctionsApp(Context context) {
this.context = context;
}
// logout
public void logoutAsk() {
new AlertDialog.Builder(context)
.setMessage(R.string.message_logout_confirm)
.setCancelable(true)
.setPositiveButton(R.string.text_yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
registerLogout();
cleanAllSP();
showToast(context.getString(R.string.message_logout_yes));
goWelcomeActivity();
}
})
.setNegativeButton(R.string.text_nope, null)
.show();
}
Can help me? Thanks!!
add a comment |
I have a problem in my app.
Before everything, sorry for my bad english.
I have a MainActivity with five fragments and a class of functions (FunctionsApp).
In one of the fragments, it's found "OptionsFragment", this fragment have buttons to go the Settings, logout, and others options.
The problems is when inside the fragment (OptionsFragment) I select the button for go to other Activity, after I do back (with its respective finish), in the fragment OptionsFragment I select the button Logout, that call the FunctionsApp and show a AlertDialog.
Showed error:
android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@e363980 is not valid; is your activity running?
Code:
OptionsFragment:
package com.kevin.app.activities;
import...
public class OptionsFragment extends Fragment implements NavigationView.OnNavigationItemSelectedListener {
FunctionsApp functionsapp = new FunctionsApp(getActivity());
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View vista=inflater.inflate(R.layout.fragment_options, container, false);
NavigationView navigationView = (NavigationView)vista.findViewById(R.id.nav_options_view);
navigationView.setNavigationItemSelectedListener(this);
return vista;
}
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_options_logout) {
functionsapp.logoutAsk();
} else if (id == R.id.nav_options_settings) {
functionsapp.goSettingsActivity();
}
return true;
}
}
FunctionsApp:
package com.kevin.app.aplicacion;
import..
public class FunctionsApp {
private static Context context;
public FunctionsApp(Context context) {
this.context = context;
}
// logout
public void logoutAsk() {
new AlertDialog.Builder(context)
.setMessage(R.string.message_logout_confirm)
.setCancelable(true)
.setPositiveButton(R.string.text_yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
registerLogout();
cleanAllSP();
showToast(context.getString(R.string.message_logout_yes));
goWelcomeActivity();
}
})
.setNegativeButton(R.string.text_nope, null)
.show();
}
Can help me? Thanks!!
add a comment |
I have a problem in my app.
Before everything, sorry for my bad english.
I have a MainActivity with five fragments and a class of functions (FunctionsApp).
In one of the fragments, it's found "OptionsFragment", this fragment have buttons to go the Settings, logout, and others options.
The problems is when inside the fragment (OptionsFragment) I select the button for go to other Activity, after I do back (with its respective finish), in the fragment OptionsFragment I select the button Logout, that call the FunctionsApp and show a AlertDialog.
Showed error:
android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@e363980 is not valid; is your activity running?
Code:
OptionsFragment:
package com.kevin.app.activities;
import...
public class OptionsFragment extends Fragment implements NavigationView.OnNavigationItemSelectedListener {
FunctionsApp functionsapp = new FunctionsApp(getActivity());
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View vista=inflater.inflate(R.layout.fragment_options, container, false);
NavigationView navigationView = (NavigationView)vista.findViewById(R.id.nav_options_view);
navigationView.setNavigationItemSelectedListener(this);
return vista;
}
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_options_logout) {
functionsapp.logoutAsk();
} else if (id == R.id.nav_options_settings) {
functionsapp.goSettingsActivity();
}
return true;
}
}
FunctionsApp:
package com.kevin.app.aplicacion;
import..
public class FunctionsApp {
private static Context context;
public FunctionsApp(Context context) {
this.context = context;
}
// logout
public void logoutAsk() {
new AlertDialog.Builder(context)
.setMessage(R.string.message_logout_confirm)
.setCancelable(true)
.setPositiveButton(R.string.text_yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
registerLogout();
cleanAllSP();
showToast(context.getString(R.string.message_logout_yes));
goWelcomeActivity();
}
})
.setNegativeButton(R.string.text_nope, null)
.show();
}
Can help me? Thanks!!
I have a problem in my app.
Before everything, sorry for my bad english.
I have a MainActivity with five fragments and a class of functions (FunctionsApp).
In one of the fragments, it's found "OptionsFragment", this fragment have buttons to go the Settings, logout, and others options.
The problems is when inside the fragment (OptionsFragment) I select the button for go to other Activity, after I do back (with its respective finish), in the fragment OptionsFragment I select the button Logout, that call the FunctionsApp and show a AlertDialog.
Showed error:
android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@e363980 is not valid; is your activity running?
Code:
OptionsFragment:
package com.kevin.app.activities;
import...
public class OptionsFragment extends Fragment implements NavigationView.OnNavigationItemSelectedListener {
FunctionsApp functionsapp = new FunctionsApp(getActivity());
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View vista=inflater.inflate(R.layout.fragment_options, container, false);
NavigationView navigationView = (NavigationView)vista.findViewById(R.id.nav_options_view);
navigationView.setNavigationItemSelectedListener(this);
return vista;
}
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_options_logout) {
functionsapp.logoutAsk();
} else if (id == R.id.nav_options_settings) {
functionsapp.goSettingsActivity();
}
return true;
}
}
FunctionsApp:
package com.kevin.app.aplicacion;
import..
public class FunctionsApp {
private static Context context;
public FunctionsApp(Context context) {
this.context = context;
}
// logout
public void logoutAsk() {
new AlertDialog.Builder(context)
.setMessage(R.string.message_logout_confirm)
.setCancelable(true)
.setPositiveButton(R.string.text_yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
registerLogout();
cleanAllSP();
showToast(context.getString(R.string.message_logout_yes));
goWelcomeActivity();
}
})
.setNegativeButton(R.string.text_nope, null)
.show();
}
Can help me? Thanks!!
edited Dec 31 '18 at 11:53
Bhargav Rao♦
30.3k2089110
30.3k2089110
asked Dec 29 '18 at 21:17
Kevs Sls ChKevs Sls Ch
11
11
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
I believe what's happening here is that the activity is going through the destruction phase (when you click the back button) and that's when the background thread finishes it's work and tries to show the dialogue you'd wish. Therefore, to rectify this issue, you just need to check if your Activity is going through the phase of being finished before you actually display that dialogue.
Do the following:
if(!((FunctionsApp)context).isFinishing()){
new AlertDialog.Builder(context)
.setMessage(R.string.message_logout_confirm)
.setCancelable(true)
.setPositiveButton(R.string.text_yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
registerLogout();
cleanAllSP();
showToast(context.getString(R.string.message_logout_yes));
goWelcomeActivity();
}
})
.setNegativeButton(R.string.text_nope, null)
.show();
}
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53973401%2fproblem-of-context-in-alertdialogs-android%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
I believe what's happening here is that the activity is going through the destruction phase (when you click the back button) and that's when the background thread finishes it's work and tries to show the dialogue you'd wish. Therefore, to rectify this issue, you just need to check if your Activity is going through the phase of being finished before you actually display that dialogue.
Do the following:
if(!((FunctionsApp)context).isFinishing()){
new AlertDialog.Builder(context)
.setMessage(R.string.message_logout_confirm)
.setCancelable(true)
.setPositiveButton(R.string.text_yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
registerLogout();
cleanAllSP();
showToast(context.getString(R.string.message_logout_yes));
goWelcomeActivity();
}
})
.setNegativeButton(R.string.text_nope, null)
.show();
}
add a comment |
I believe what's happening here is that the activity is going through the destruction phase (when you click the back button) and that's when the background thread finishes it's work and tries to show the dialogue you'd wish. Therefore, to rectify this issue, you just need to check if your Activity is going through the phase of being finished before you actually display that dialogue.
Do the following:
if(!((FunctionsApp)context).isFinishing()){
new AlertDialog.Builder(context)
.setMessage(R.string.message_logout_confirm)
.setCancelable(true)
.setPositiveButton(R.string.text_yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
registerLogout();
cleanAllSP();
showToast(context.getString(R.string.message_logout_yes));
goWelcomeActivity();
}
})
.setNegativeButton(R.string.text_nope, null)
.show();
}
add a comment |
I believe what's happening here is that the activity is going through the destruction phase (when you click the back button) and that's when the background thread finishes it's work and tries to show the dialogue you'd wish. Therefore, to rectify this issue, you just need to check if your Activity is going through the phase of being finished before you actually display that dialogue.
Do the following:
if(!((FunctionsApp)context).isFinishing()){
new AlertDialog.Builder(context)
.setMessage(R.string.message_logout_confirm)
.setCancelable(true)
.setPositiveButton(R.string.text_yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
registerLogout();
cleanAllSP();
showToast(context.getString(R.string.message_logout_yes));
goWelcomeActivity();
}
})
.setNegativeButton(R.string.text_nope, null)
.show();
}
I believe what's happening here is that the activity is going through the destruction phase (when you click the back button) and that's when the background thread finishes it's work and tries to show the dialogue you'd wish. Therefore, to rectify this issue, you just need to check if your Activity is going through the phase of being finished before you actually display that dialogue.
Do the following:
if(!((FunctionsApp)context).isFinishing()){
new AlertDialog.Builder(context)
.setMessage(R.string.message_logout_confirm)
.setCancelable(true)
.setPositiveButton(R.string.text_yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
registerLogout();
cleanAllSP();
showToast(context.getString(R.string.message_logout_yes));
goWelcomeActivity();
}
})
.setNegativeButton(R.string.text_nope, null)
.show();
}
answered Dec 29 '18 at 22:54
NeroNero
7031419
7031419
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53973401%2fproblem-of-context-in-alertdialogs-android%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown