pass value to string.xml value that have a link inside it





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







0















I have this value in string.xml file:



<string name="rights">Copyright © All Rights Reserved %1$d <b> <a href="http://www.example.com/">company name</a></b></string>


And I have applied this code that pass to the above text & set that text to the TextView



private void setupAppInfoRights() {

int currentYear = Calendar.getInstance().get(Calendar.YEAR);
String rights = String.format(new Locale("en"), getString(R.string.rights), currentYear);
appInfoRights.setText(rights);
appInfoRights.setMovementMethod(LinkMovementMethod.getInstance());

}


When I remove the passed value everything goes fine & when the user click on the company name it takes him/her to the company website.



Please note that I have tried autoLink in xml when there is no value passed but it does not work as expected.



But, when I add the passed value & used the code above the company name has no underline & when the user clicks it , it will do nothing.



How to edit my above code to pass the current year & keep the link behavior normal?



Note: I have used String.format to display the current year as English number always despite the other locale numbers.










share|improve this question































    0















    I have this value in string.xml file:



    <string name="rights">Copyright © All Rights Reserved %1$d <b> <a href="http://www.example.com/">company name</a></b></string>


    And I have applied this code that pass to the above text & set that text to the TextView



    private void setupAppInfoRights() {

    int currentYear = Calendar.getInstance().get(Calendar.YEAR);
    String rights = String.format(new Locale("en"), getString(R.string.rights), currentYear);
    appInfoRights.setText(rights);
    appInfoRights.setMovementMethod(LinkMovementMethod.getInstance());

    }


    When I remove the passed value everything goes fine & when the user click on the company name it takes him/her to the company website.



    Please note that I have tried autoLink in xml when there is no value passed but it does not work as expected.



    But, when I add the passed value & used the code above the company name has no underline & when the user clicks it , it will do nothing.



    How to edit my above code to pass the current year & keep the link behavior normal?



    Note: I have used String.format to display the current year as English number always despite the other locale numbers.










    share|improve this question



























      0












      0








      0








      I have this value in string.xml file:



      <string name="rights">Copyright © All Rights Reserved %1$d <b> <a href="http://www.example.com/">company name</a></b></string>


      And I have applied this code that pass to the above text & set that text to the TextView



      private void setupAppInfoRights() {

      int currentYear = Calendar.getInstance().get(Calendar.YEAR);
      String rights = String.format(new Locale("en"), getString(R.string.rights), currentYear);
      appInfoRights.setText(rights);
      appInfoRights.setMovementMethod(LinkMovementMethod.getInstance());

      }


      When I remove the passed value everything goes fine & when the user click on the company name it takes him/her to the company website.



      Please note that I have tried autoLink in xml when there is no value passed but it does not work as expected.



      But, when I add the passed value & used the code above the company name has no underline & when the user clicks it , it will do nothing.



      How to edit my above code to pass the current year & keep the link behavior normal?



      Note: I have used String.format to display the current year as English number always despite the other locale numbers.










      share|improve this question
















      I have this value in string.xml file:



      <string name="rights">Copyright © All Rights Reserved %1$d <b> <a href="http://www.example.com/">company name</a></b></string>


      And I have applied this code that pass to the above text & set that text to the TextView



      private void setupAppInfoRights() {

      int currentYear = Calendar.getInstance().get(Calendar.YEAR);
      String rights = String.format(new Locale("en"), getString(R.string.rights), currentYear);
      appInfoRights.setText(rights);
      appInfoRights.setMovementMethod(LinkMovementMethod.getInstance());

      }


      When I remove the passed value everything goes fine & when the user click on the company name it takes him/her to the company website.



      Please note that I have tried autoLink in xml when there is no value passed but it does not work as expected.



      But, when I add the passed value & used the code above the company name has no underline & when the user clicks it , it will do nothing.



      How to edit my above code to pass the current year & keep the link behavior normal?



      Note: I have used String.format to display the current year as English number always despite the other locale numbers.







      android string.xml






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Jan 3 at 13:12







      Ali Habbash

















      asked Jan 3 at 13:04









      Ali HabbashAli Habbash

      3061217




      3061217
























          2 Answers
          2






          active

          oldest

          votes


















          1














          I think SpannableStringBuilder is what you are looking for.



            TextView linkTv = (TextView) findViewById(R.id.link_tv);
          linkTv.setMovementMethod(LinkMovementMethod.getInstance());
          Spannable span = (Spannable) linkTv.getText();
          ClickableSpan clickableSpan = new ClickableSpan() {
          @Override
          public void onClick(View widget){
          //open the link
          }
          };
          span.setSpan(clickableSpan, 0, span.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
          //for bold
          span.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), 0, span.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);


          If you want to make only certain part clickable then toggle the values of 0 and span.length() in setSpan().






          share|improve this answer

































            1














            When you have a string resource with both format arguments (like %1$d) and html markup, you have to use a multi-step process to create the styled CharSequence. This extra work is necessary because both Resources.getString(int, Object...) and String.format(String, Object...) can only return String instances, and not other CharSequence subclasses that are capable of holding styling information.



            First, change your string resource to use html entities to escape the html tags:



            <string name="rights">Copyright © All Rights Reserved %1$d &lt;b> &lt;a href="http://www.example.com/">company name&lt;/a>&lt;/b></string>


            Next, obtain a String with the format arguments replaced with the actual values you desire:



            String withHtmlMarkup = getString(R.string.rights, currentYear);


            Finally, use Html.fromHtml() to parse the html markup:



            CharSequence styled = Html.fromHtml(withHtmlMarkup);


            Then you can set this styled text to your TextView as normal:



            appInfoRights.setText(styled);
            appInfoRights.setMovementMethod(LinkMovementMethod.getInstance());


            Developer guide: https://developer.android.com/guide/topics/resources/string-resource#FormattingAndStyling




            Normally, this doesn't work because the format(String, Object...) and getString(int, Object...) methods strip all the style information from the string. The work-around to this is to write the HTML tags with escaped entities, which are then recovered with fromHtml(String), after the formatting takes place.







            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%2f54022888%2fpass-value-to-string-xml-value-that-have-a-link-inside-it%23new-answer', 'question_page');
              }
              );

              Post as a guest















              Required, but never shown

























              2 Answers
              2






              active

              oldest

              votes








              2 Answers
              2






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              1














              I think SpannableStringBuilder is what you are looking for.



                TextView linkTv = (TextView) findViewById(R.id.link_tv);
              linkTv.setMovementMethod(LinkMovementMethod.getInstance());
              Spannable span = (Spannable) linkTv.getText();
              ClickableSpan clickableSpan = new ClickableSpan() {
              @Override
              public void onClick(View widget){
              //open the link
              }
              };
              span.setSpan(clickableSpan, 0, span.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
              //for bold
              span.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), 0, span.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);


              If you want to make only certain part clickable then toggle the values of 0 and span.length() in setSpan().






              share|improve this answer






























                1














                I think SpannableStringBuilder is what you are looking for.



                  TextView linkTv = (TextView) findViewById(R.id.link_tv);
                linkTv.setMovementMethod(LinkMovementMethod.getInstance());
                Spannable span = (Spannable) linkTv.getText();
                ClickableSpan clickableSpan = new ClickableSpan() {
                @Override
                public void onClick(View widget){
                //open the link
                }
                };
                span.setSpan(clickableSpan, 0, span.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                //for bold
                span.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), 0, span.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);


                If you want to make only certain part clickable then toggle the values of 0 and span.length() in setSpan().






                share|improve this answer




























                  1












                  1








                  1







                  I think SpannableStringBuilder is what you are looking for.



                    TextView linkTv = (TextView) findViewById(R.id.link_tv);
                  linkTv.setMovementMethod(LinkMovementMethod.getInstance());
                  Spannable span = (Spannable) linkTv.getText();
                  ClickableSpan clickableSpan = new ClickableSpan() {
                  @Override
                  public void onClick(View widget){
                  //open the link
                  }
                  };
                  span.setSpan(clickableSpan, 0, span.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                  //for bold
                  span.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), 0, span.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);


                  If you want to make only certain part clickable then toggle the values of 0 and span.length() in setSpan().






                  share|improve this answer















                  I think SpannableStringBuilder is what you are looking for.



                    TextView linkTv = (TextView) findViewById(R.id.link_tv);
                  linkTv.setMovementMethod(LinkMovementMethod.getInstance());
                  Spannable span = (Spannable) linkTv.getText();
                  ClickableSpan clickableSpan = new ClickableSpan() {
                  @Override
                  public void onClick(View widget){
                  //open the link
                  }
                  };
                  span.setSpan(clickableSpan, 0, span.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                  //for bold
                  span.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), 0, span.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);


                  If you want to make only certain part clickable then toggle the values of 0 and span.length() in setSpan().







                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Jan 3 at 14:04

























                  answered Jan 3 at 13:24









                  ankuranurag2ankuranurag2

                  1,247419




                  1,247419

























                      1














                      When you have a string resource with both format arguments (like %1$d) and html markup, you have to use a multi-step process to create the styled CharSequence. This extra work is necessary because both Resources.getString(int, Object...) and String.format(String, Object...) can only return String instances, and not other CharSequence subclasses that are capable of holding styling information.



                      First, change your string resource to use html entities to escape the html tags:



                      <string name="rights">Copyright © All Rights Reserved %1$d &lt;b> &lt;a href="http://www.example.com/">company name&lt;/a>&lt;/b></string>


                      Next, obtain a String with the format arguments replaced with the actual values you desire:



                      String withHtmlMarkup = getString(R.string.rights, currentYear);


                      Finally, use Html.fromHtml() to parse the html markup:



                      CharSequence styled = Html.fromHtml(withHtmlMarkup);


                      Then you can set this styled text to your TextView as normal:



                      appInfoRights.setText(styled);
                      appInfoRights.setMovementMethod(LinkMovementMethod.getInstance());


                      Developer guide: https://developer.android.com/guide/topics/resources/string-resource#FormattingAndStyling




                      Normally, this doesn't work because the format(String, Object...) and getString(int, Object...) methods strip all the style information from the string. The work-around to this is to write the HTML tags with escaped entities, which are then recovered with fromHtml(String), after the formatting takes place.







                      share|improve this answer




























                        1














                        When you have a string resource with both format arguments (like %1$d) and html markup, you have to use a multi-step process to create the styled CharSequence. This extra work is necessary because both Resources.getString(int, Object...) and String.format(String, Object...) can only return String instances, and not other CharSequence subclasses that are capable of holding styling information.



                        First, change your string resource to use html entities to escape the html tags:



                        <string name="rights">Copyright © All Rights Reserved %1$d &lt;b> &lt;a href="http://www.example.com/">company name&lt;/a>&lt;/b></string>


                        Next, obtain a String with the format arguments replaced with the actual values you desire:



                        String withHtmlMarkup = getString(R.string.rights, currentYear);


                        Finally, use Html.fromHtml() to parse the html markup:



                        CharSequence styled = Html.fromHtml(withHtmlMarkup);


                        Then you can set this styled text to your TextView as normal:



                        appInfoRights.setText(styled);
                        appInfoRights.setMovementMethod(LinkMovementMethod.getInstance());


                        Developer guide: https://developer.android.com/guide/topics/resources/string-resource#FormattingAndStyling




                        Normally, this doesn't work because the format(String, Object...) and getString(int, Object...) methods strip all the style information from the string. The work-around to this is to write the HTML tags with escaped entities, which are then recovered with fromHtml(String), after the formatting takes place.







                        share|improve this answer


























                          1












                          1








                          1







                          When you have a string resource with both format arguments (like %1$d) and html markup, you have to use a multi-step process to create the styled CharSequence. This extra work is necessary because both Resources.getString(int, Object...) and String.format(String, Object...) can only return String instances, and not other CharSequence subclasses that are capable of holding styling information.



                          First, change your string resource to use html entities to escape the html tags:



                          <string name="rights">Copyright © All Rights Reserved %1$d &lt;b> &lt;a href="http://www.example.com/">company name&lt;/a>&lt;/b></string>


                          Next, obtain a String with the format arguments replaced with the actual values you desire:



                          String withHtmlMarkup = getString(R.string.rights, currentYear);


                          Finally, use Html.fromHtml() to parse the html markup:



                          CharSequence styled = Html.fromHtml(withHtmlMarkup);


                          Then you can set this styled text to your TextView as normal:



                          appInfoRights.setText(styled);
                          appInfoRights.setMovementMethod(LinkMovementMethod.getInstance());


                          Developer guide: https://developer.android.com/guide/topics/resources/string-resource#FormattingAndStyling




                          Normally, this doesn't work because the format(String, Object...) and getString(int, Object...) methods strip all the style information from the string. The work-around to this is to write the HTML tags with escaped entities, which are then recovered with fromHtml(String), after the formatting takes place.







                          share|improve this answer













                          When you have a string resource with both format arguments (like %1$d) and html markup, you have to use a multi-step process to create the styled CharSequence. This extra work is necessary because both Resources.getString(int, Object...) and String.format(String, Object...) can only return String instances, and not other CharSequence subclasses that are capable of holding styling information.



                          First, change your string resource to use html entities to escape the html tags:



                          <string name="rights">Copyright © All Rights Reserved %1$d &lt;b> &lt;a href="http://www.example.com/">company name&lt;/a>&lt;/b></string>


                          Next, obtain a String with the format arguments replaced with the actual values you desire:



                          String withHtmlMarkup = getString(R.string.rights, currentYear);


                          Finally, use Html.fromHtml() to parse the html markup:



                          CharSequence styled = Html.fromHtml(withHtmlMarkup);


                          Then you can set this styled text to your TextView as normal:



                          appInfoRights.setText(styled);
                          appInfoRights.setMovementMethod(LinkMovementMethod.getInstance());


                          Developer guide: https://developer.android.com/guide/topics/resources/string-resource#FormattingAndStyling




                          Normally, this doesn't work because the format(String, Object...) and getString(int, Object...) methods strip all the style information from the string. The work-around to this is to write the HTML tags with escaped entities, which are then recovered with fromHtml(String), after the formatting takes place.








                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered Jan 3 at 16:33









                          Ben P.Ben P.

                          25.4k32252




                          25.4k32252






























                              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%2f54022888%2fpass-value-to-string-xml-value-that-have-a-link-inside-it%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

                              MongoDB - Not Authorized To Execute Command

                              How to fix TextFormField cause rebuild widget in Flutter

                              in spring boot 2.1 many test slices are not allowed anymore due to multiple @BootstrapWith