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

add a comment |
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.

add a comment |
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.

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.


edited Jan 3 at 13:12
Ali Habbash
asked Jan 3 at 13:04
Ali HabbashAli Habbash
3061217
3061217
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
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()
.
add a comment |
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 <b> <a href="http://www.example.com/">company name</a></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...)
andgetString(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 withfromHtml(String)
, after the formatting takes place.
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%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
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()
.
add a comment |
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()
.
add a comment |
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()
.
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()
.
edited Jan 3 at 14:04
answered Jan 3 at 13:24


ankuranurag2ankuranurag2
1,247419
1,247419
add a comment |
add a comment |
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 <b> <a href="http://www.example.com/">company name</a></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...)
andgetString(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 withfromHtml(String)
, after the formatting takes place.
add a comment |
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 <b> <a href="http://www.example.com/">company name</a></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...)
andgetString(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 withfromHtml(String)
, after the formatting takes place.
add a comment |
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 <b> <a href="http://www.example.com/">company name</a></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...)
andgetString(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 withfromHtml(String)
, after the formatting takes place.
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 <b> <a href="http://www.example.com/">company name</a></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...)
andgetString(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 withfromHtml(String)
, after the formatting takes place.
answered Jan 3 at 16:33


Ben P.Ben P.
25.4k32252
25.4k32252
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%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
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