Not able to use dagger-injected objects in attachBaseContext() to update locale










1















I am using dagger and I have to update the locale in the attachBaseContext of the activity, I am keeping the locale update logic inside LocaleManager and LocaleManager instance is already inside appModule when I try to use this LocaleManager instance inside attachBaseContext I get null pointer exception
as the activity's injections happen after attachBaseContext inside onCreate().










share|improve this question




























    1















    I am using dagger and I have to update the locale in the attachBaseContext of the activity, I am keeping the locale update logic inside LocaleManager and LocaleManager instance is already inside appModule when I try to use this LocaleManager instance inside attachBaseContext I get null pointer exception
    as the activity's injections happen after attachBaseContext inside onCreate().










    share|improve this question


























      1












      1








      1








      I am using dagger and I have to update the locale in the attachBaseContext of the activity, I am keeping the locale update logic inside LocaleManager and LocaleManager instance is already inside appModule when I try to use this LocaleManager instance inside attachBaseContext I get null pointer exception
      as the activity's injections happen after attachBaseContext inside onCreate().










      share|improve this question
















      I am using dagger and I have to update the locale in the attachBaseContext of the activity, I am keeping the locale update logic inside LocaleManager and LocaleManager instance is already inside appModule when I try to use this LocaleManager instance inside attachBaseContext I get null pointer exception
      as the activity's injections happen after attachBaseContext inside onCreate().







      android android-7.0-nougat dagger






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 14 '18 at 5:10









      Ravindra Kushwaha

      3,51652560




      3,51652560










      asked Nov 13 '18 at 9:23









      user2143279user2143279

      62




      62






















          1 Answer
          1






          active

          oldest

          votes


















          0














          This is happening, as you said, because the injection is happening after attachBaseContext is called.



          I'm actually not sure what the question is here, but I was facing the same problem, but unfortunately I could not solve it with dagger. I needed to create a new LocaleManager in the attachBaseContext like this:



          @Override
          protected void attachBaseContext(Context base)
          super.attachBaseContext(new LocaleManager(base).updateContext());



          where updateContext returns the context with the updated locale, like this:



          public Context updateContext() 
          Locale locale = new Locale(DESIRED_LANGUAGECODE);
          Locale.setDefault(locale);
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
          return updateResourcesLocale(locale);

          return updateResourcesLocaleLegacy(locale);



          @SuppressWarnings("deprecation")
          private Context updateResourcesLocaleLegacy(Locale locale)
          Resources resources = mContext.getResources();
          Configuration configuration = resources.getConfiguration();
          configuration.locale = locale;
          resources.updateConfiguration(configuration, resources.getDisplayMetrics());
          return mContext;



          @TargetApi(Build.VERSION_CODES.N)
          private Context updateResourcesLocale(Locale locale)
          Configuration configuration = mContext.getResources().getConfiguration();
          configuration.setLocale(locale);
          return mContext.createConfigurationContext(configuration);






          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%2f53277662%2fnot-able-to-use-dagger-injected-objects-in-attachbasecontext-to-update-locale%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














            This is happening, as you said, because the injection is happening after attachBaseContext is called.



            I'm actually not sure what the question is here, but I was facing the same problem, but unfortunately I could not solve it with dagger. I needed to create a new LocaleManager in the attachBaseContext like this:



            @Override
            protected void attachBaseContext(Context base)
            super.attachBaseContext(new LocaleManager(base).updateContext());



            where updateContext returns the context with the updated locale, like this:



            public Context updateContext() 
            Locale locale = new Locale(DESIRED_LANGUAGECODE);
            Locale.setDefault(locale);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
            return updateResourcesLocale(locale);

            return updateResourcesLocaleLegacy(locale);



            @SuppressWarnings("deprecation")
            private Context updateResourcesLocaleLegacy(Locale locale)
            Resources resources = mContext.getResources();
            Configuration configuration = resources.getConfiguration();
            configuration.locale = locale;
            resources.updateConfiguration(configuration, resources.getDisplayMetrics());
            return mContext;



            @TargetApi(Build.VERSION_CODES.N)
            private Context updateResourcesLocale(Locale locale)
            Configuration configuration = mContext.getResources().getConfiguration();
            configuration.setLocale(locale);
            return mContext.createConfigurationContext(configuration);






            share|improve this answer



























              0














              This is happening, as you said, because the injection is happening after attachBaseContext is called.



              I'm actually not sure what the question is here, but I was facing the same problem, but unfortunately I could not solve it with dagger. I needed to create a new LocaleManager in the attachBaseContext like this:



              @Override
              protected void attachBaseContext(Context base)
              super.attachBaseContext(new LocaleManager(base).updateContext());



              where updateContext returns the context with the updated locale, like this:



              public Context updateContext() 
              Locale locale = new Locale(DESIRED_LANGUAGECODE);
              Locale.setDefault(locale);
              if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
              return updateResourcesLocale(locale);

              return updateResourcesLocaleLegacy(locale);



              @SuppressWarnings("deprecation")
              private Context updateResourcesLocaleLegacy(Locale locale)
              Resources resources = mContext.getResources();
              Configuration configuration = resources.getConfiguration();
              configuration.locale = locale;
              resources.updateConfiguration(configuration, resources.getDisplayMetrics());
              return mContext;



              @TargetApi(Build.VERSION_CODES.N)
              private Context updateResourcesLocale(Locale locale)
              Configuration configuration = mContext.getResources().getConfiguration();
              configuration.setLocale(locale);
              return mContext.createConfigurationContext(configuration);






              share|improve this answer

























                0












                0








                0







                This is happening, as you said, because the injection is happening after attachBaseContext is called.



                I'm actually not sure what the question is here, but I was facing the same problem, but unfortunately I could not solve it with dagger. I needed to create a new LocaleManager in the attachBaseContext like this:



                @Override
                protected void attachBaseContext(Context base)
                super.attachBaseContext(new LocaleManager(base).updateContext());



                where updateContext returns the context with the updated locale, like this:



                public Context updateContext() 
                Locale locale = new Locale(DESIRED_LANGUAGECODE);
                Locale.setDefault(locale);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
                return updateResourcesLocale(locale);

                return updateResourcesLocaleLegacy(locale);



                @SuppressWarnings("deprecation")
                private Context updateResourcesLocaleLegacy(Locale locale)
                Resources resources = mContext.getResources();
                Configuration configuration = resources.getConfiguration();
                configuration.locale = locale;
                resources.updateConfiguration(configuration, resources.getDisplayMetrics());
                return mContext;



                @TargetApi(Build.VERSION_CODES.N)
                private Context updateResourcesLocale(Locale locale)
                Configuration configuration = mContext.getResources().getConfiguration();
                configuration.setLocale(locale);
                return mContext.createConfigurationContext(configuration);






                share|improve this answer













                This is happening, as you said, because the injection is happening after attachBaseContext is called.



                I'm actually not sure what the question is here, but I was facing the same problem, but unfortunately I could not solve it with dagger. I needed to create a new LocaleManager in the attachBaseContext like this:



                @Override
                protected void attachBaseContext(Context base)
                super.attachBaseContext(new LocaleManager(base).updateContext());



                where updateContext returns the context with the updated locale, like this:



                public Context updateContext() 
                Locale locale = new Locale(DESIRED_LANGUAGECODE);
                Locale.setDefault(locale);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
                return updateResourcesLocale(locale);

                return updateResourcesLocaleLegacy(locale);



                @SuppressWarnings("deprecation")
                private Context updateResourcesLocaleLegacy(Locale locale)
                Resources resources = mContext.getResources();
                Configuration configuration = resources.getConfiguration();
                configuration.locale = locale;
                resources.updateConfiguration(configuration, resources.getDisplayMetrics());
                return mContext;



                @TargetApi(Build.VERSION_CODES.N)
                private Context updateResourcesLocale(Locale locale)
                Configuration configuration = mContext.getResources().getConfiguration();
                configuration.setLocale(locale);
                return mContext.createConfigurationContext(configuration);







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 24 '18 at 13:47









                AnalizerAnalizer

                9051022




                9051022



























                    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%2f53277662%2fnot-able-to-use-dagger-injected-objects-in-attachbasecontext-to-update-locale%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







                    這個網誌中的熱門文章

                    How to read a connectionString WITH PROVIDER in .NET Core?

                    Museum of Modern and Contemporary Art of Trento and Rovereto

                    In R, how to develop a multiplot heatmap.2 figure showing key labels successfully