Problem of Context in AlertDialogs Android












0















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!!










share|improve this question





























    0















    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!!










    share|improve this question



























      0












      0








      0








      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!!










      share|improve this question
















      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!!







      android android-fragments






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      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
























          1 Answer
          1






          active

          oldest

          votes


















          0














          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();
          }





          share|improve this answer























            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
            });


            }
            });














            draft saved

            draft discarded


















            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









            0














            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();
            }





            share|improve this answer




























              0














              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();
              }





              share|improve this answer


























                0












                0








                0







                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();
                }





                share|improve this answer













                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();
                }






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Dec 29 '18 at 22:54









                NeroNero

                7031419




                7031419






























                    draft saved

                    draft discarded




















































                    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.




                    draft saved


                    draft discarded














                    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





















































                    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







                    Popular posts from this blog

                    Mossoró

                    Error while reading .h5 file using the rhdf5 package in R

                    Pushsharp Apns notification error: 'InvalidToken'