How to capitalize the first letter of text in a TextView in an Android Application

Viewed 140899

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!

18 Answers

for Kotlin, just call

textview.text = string.capitalize()

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.

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

For Kotlin, if you want to be sure that the format is "Aaaaaaaaa" you can use :

myString.toLowerCase(Locale.getDefault()).capitalize()

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"

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

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

Add Kotlin Extension

fun String.firstCap()=this.replaceFirstChar { it.uppercase() }

Usecase

"lowercase letter".firstCap() //gives "Lowercase letter"

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

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

by using below property

android:inputType="textCapSentences|textCapWords"
//Capitalize the first letter of the words
public String Capitalize(String str) {
    String[] arr = str.split(" "); //convert String to StringArray
    StringBuilder stringBuilder = new StringBuilder();

    for (String w : arr) {
        if (w.length() > 1) {
            stringBuilder.append(w.substring(0, 1).toUpperCase(Locale.US) + w.substring(1).toLowerCase(Locale.US) + " ");
        }
    }
    return stringBuilder.toString().trim();
}
Related