How to capitalize the first letter of text in a TextView in an Android Application
AndroidXmlAndroid Problem Overview
I'm not referring to textInput, either. I mean that once you have static text in a TextView (populated from a Database call to user inputted data (that may not be Capitalized)), how can I make sure they are capitalized?
Thanks!
Android Solutions
Solution 1 - Android
I should be able to accomplish this through standard java string manipulation, nothing Android or TextView specific.
Something like:
String upperString = myString.substring(0, 1).toUpperCase() + myString.substring(1).toLowerCase();
Although there are probably a million ways to accomplish this. See String documentation.
EDITED
I added the .toLowerCase()
Solution 2 - Android
Following does not apply to TextView, but works with EditText; even then, it applies to the text entered from the keyboard, not the text loaded with setText(). To be more specific, it turns the Caps on in the keyboard, and the user can override this at her will.
android:inputType="textCapSentences"
or
TV.sname.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
This will CAP the first letter.
or
compile 'org.apache.commons:commons-lang3:3.4' //in build.gradle module(app)
tv.setText(StringUtils.capitalize(myString.toLowerCase().trim()));
Solution 3 - Android
for Kotlin, just call
textview.text = string.capitalize()
Solution 4 - Android
StringBuilder sb = new StringBuilder(name);
sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
return sb.toString();
Solution 5 - Android
You can add Apache Commons Lang
in Gradle like compile 'org.apache.commons:commons-lang3:3.4'
And use WordUtils.capitalizeFully(name)
Solution 6 - Android
For future visitors, you can also (best IMHO) import WordUtil
from Apache
and add a lot of useful methods to you app, like capitalize
as shown here:
https://stackoverflow.com/questions/1892765/capitalize-first-char-of-each-word-in-a-string-java
Solution 7 - Android
For me none of working:
Function:
private String getCapsSentences(String tagName) {
String[] splits = tagName.toLowerCase().split(" ");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < splits.length; i++) {
String eachWord = splits[i];
if (i > 0 && eachWord.length() > 0) {
sb.append(" ");
}
String cap = eachWord.substring(0, 1).toUpperCase()
+ eachWord.substring(1);
sb.append(cap);
}
return sb.toString();
}
Result:
I/P brain
O/P Brain
I/P Brain and Health
O/P Brain And Health
I/P brain And health
to O/P Brain And Health
I/P brain's Health
to O/P Brain's Health
I/P brain's Health and leg
to O/P Brain's Health And Leg
Hope this would help you.
Solution 8 - Android
The accepted answer is good, but if you are using it to get values from a textView in android, it would be good to check if the string is empty. If the string is empty it would throw an exception.
private String capitizeString(String name){
String captilizedString="";
if(!name.trim().equals("")){
captilizedString = name.substring(0,1).toUpperCase() + name.substring(1);
}
return captilizedString;
}
Solution 9 - Android
For Kotlin, if you want to be sure that the format is "Aaaaaaaaa" you can use :
myString.toLowerCase(Locale.getDefault()).capitalize()
Solution 10 - Android
Please create a custom TextView and use it :
public class CustomTextView extends TextView {
public CapitalizedTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void setText(CharSequence text, BufferType type) {
if (text.length() > 0) {
text = String.valueOf(text.charAt(0)).toUpperCase() + text.subSequence(1, text.length());
}
super.setText(text, type);
}
}
Solution 11 - Android
Here I have written a detailed article on the topic, as we have several options, Capitalize First Letter of String in Android
Method to Capitalize First Letter of String in Java
public static String capitalizeString(String str) {
String retStr = str;
try { // We can face index out of bound exception if the string is null
retStr = str.substring(0, 1).toUpperCase() + str.substring(1);
}catch (Exception e){}
return retStr;
}
Method to Capitalize First Letter of String in Kotlin
fun capitalizeString(str: String): String {
var retStr = str
try { // We can face index out of bound exception if the string is null
retStr = str.substring(0, 1).toUpperCase() + str.substring(1)
} catch (e: Exception) {
}
return retStr
}
Using XML Attribute
Or you can set this attribute in TextView or EditText in XML
android:inputType="textCapSentences"
Solution 12 - Android
For those using Jetpack Compose, you should use Compose's String.capitalize(locale: Locale)
, instead of Kotlin's, as follows:
import androidx.compose.ui.text.capitalize
import androidx.compose.ui.text.intl.Locale
Text("my text".capitalize(Locale.current)) // capitalizes first letter
Text("my text".toUpperCase(Locale.current)) // all caps
Solution 13 - Android
Note that Kotlin's .capitalize()
is deprecated as of 1.5 as it isn't locale friendly. The suggestion is to use .replaceFirstChar()
Android Studio warns me
> Implicitly using the default locale is a common source of bugs: Use capitalize(Locale) instead. For strings meant to be internal use Locale.ROOT, otherwise Locale.getDefault().
Thanks to the built in autofix, I made this extension function
fun String.titlecase(): String =
this.replaceFirstChar { // it: Char
if (it.isLowerCase())
it.titlecase(Locale.getDefault())
else
it.toString()
}
Solution 14 - Android
These lines of code helped me
String[] message_list=message.split(" ");
String full_message="";
for (int i=0; i<message_list.length; i++)
{
StringBuilder sb = new StringBuilder(message_list[i]);
sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
full_message=full_message+" "+sb;
}
textview_message.setText(full_message);
Solution 15 - Android
In Android XML this can be done with data-binding.
Once enabled in the build.gradle
:
android {
buildFeatures {
dataBinding = true
}
}
One can use it to generate data-bindings from XML, which do permit simple code statements:
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<import type="java.util.Locale"/>
</data>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/role"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text='@{ user.role != null ? user.role.substring(0, 1).toUpperCase(Locale.getDefault()) + user.role.substring(1) : "n/a" }'
android:gravity="center_vertical"
android:textSize="12sp"/>
</androidx.appcompat.widget.LinearLayoutCompat>
</layout>
Obviously, one could as well import Kotlin or JetPack Compose classes ...
Solution 16 - Android
by using below property
android:inputType="textCapSentences|textCapWords"
Solution 17 - Android
Add Kotlin Extension
fun String.firstCap()=this.replaceFirstChar { it.uppercase() }
Usecase
"lowercase letter".firstCap() //gives "Lowercase letter"
Solution 18 - Android
If yout want to do in your XML file, use inputType
like this
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/myID"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/marginAll16dp"
android:fontFamily="sans-serif-medium"
android:lineSpacingExtra="@dimen/lineSpacingAll2sp"
app:inputType="TYPE_TEXT_FLAG_CAP_SENTENCES"
app:layout_constraintEnd_toStartOf="@id/delete"
app:layout_constraintStart_toEndOf="@id/add"
app:layout_constraintTop_toTopOf="parent" />