web-dev-qa-db-ja.com

すべての文字を大文字にするようにTextViewをスタイルする方法はありますか?

私はxml属性またはスタイルをTextViewに割り当て、それがALL CAPITAL LETTERSに含まれるどんなテキストでも作ることができることを望みます。

属性Android:inputType="textCapCharacters"およびAndroid:capitalize="characters"は、何もしません。それらは、TextViewではなく、ユーザーが入力したテキスト用です。

スタイルをコンテンツから切り離せるように、これをやりたいと思います。私はこれをプログラム的に行うことができることを知っていますが、ここでも私は内容とコードからスタイルを守りたいです。

220
cottonBallPaws

私はそれはかなり合理的な要求でしたが それはあなたが現時点でそれをすることができないように見えます。 どんな失敗。笑

更新

textAllCaps を使用してすべての大文字を強制することができます。

323
Terrance

Android:textAllCaps はどうですか?

132
Murphy

古いAPIをサポートするAndroidアプリでAppCompattextAllCapsを使用する(14未満)

AppCompatに付属するCompatTextViewという名前のUIウィジェットが1つあり、textAllCapsのサポートを追加するカスタムTextView拡張機能です。

新しいAndroid API> 14の場合は、次のものを使用できます。

Android:textAllCaps="true"

簡単な例:

<Android.support.v7.internal.widget.CompatTextView
        Android:id="@+id/text"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        app:textAllCaps="true"/>

出典: developer.Android

更新:

それが起こるので、CompatTextViewは最近AppCompatTextViewに置き換えられました appcompat-v7 library 〜Eugen Pechanec

56
LOG_TAG

スタイル(<item name="Android:textAllCaps">true</item>)や各XMLレイアウトファイルでtextAllCaps属性を使用することができず、唯一の方法ではできないことは本当に残念です。それを行うには、textViewXXX.setText(theString)を実行するときに、実際には各ストリングに対してtheString.toUpperCase()を使用します。

私の場合は、コードのいたるところにtheString.toUpperCase()を配置したくはありませんでしたが、それを実行するために集中化された場所を配置したいと思いました。 TextViewsを使ったアクティビティとリストアイテムのレイアウトは、常に大文字化されることになっていた(タイトル)とそうでない人がいました...だから...何人かの人はやり過ぎだと思うかもしれませんが Android.widget.TextView そしてその場でテキストを大文字にしてsetTextメソッドをオーバーライドします。

少なくとも、デザインが変更された場合、または将来のバージョンで大文字のテキストを削除する必要がある場合は、レイアウトファイルを通常のTextViewに変更する必要があります。

これは、元のコンテンツの大文字/小文字の区別は関係なく、アプリケーションのデザイナが実際にはCAPSでこのテキスト(タイトル)を実際に望んでいたためです。 。

これがクラスです:

package com.realactionsoft.Android.widget;

import Android.content.Context; 
import Android.util.AttributeSet; 
import Android.view.ViewTreeObserver; 
import Android.widget.TextView;


public class CapitalizedTextView extends TextView implements ViewTreeObserver.OnPreDrawListener {

    public CapitalizedTextView(Context context) {
        super(context);
    }

    public CapitalizedTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CapitalizedTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        super.setText(text.toString().toUpperCase(), type);
    }

}

そして、あなたがそれを使う必要がある時はいつでも、XMLレイアウトの全てのパッケージでそれを宣言するだけです:

<com.realactionsoft.Android.widget.CapitalizedTextView 
        Android:id="@+id/text_view_title"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" />

TextViewでテキストをスタイルする正しい方法はSpannableStringを使用することであると主張する人もいますが、私はそれがTextView以外のクラスをインスタンス化することになるので、リソースの消費が大きいことは言うまでもありません。

29
Oscar S.

私は、テキストを大文字にすることを扱うTextViewのサブクラスも作成したという事実においてRacZoのものと似た解決策を思いつきました。

違いは、setText()メソッドの1つをオーバーライドするのではなく、TextViewが実際にAPI 14+に対して行うことと同様のアプローチを使用したことです(これは私の観点ではよりクリーンなソリューションです)。

source を調べると、setAllCaps()の実装がわかります。

public void setAllCaps(boolean allCaps) {
    if (allCaps) {
        setTransformationMethod(new AllCapsTransformationMethod(getContext()));
    } else {
        setTransformationMethod(null);
    }
}

AllCapsTransformationMethodクラスは(現在)公開されていませんが、それでもソースは 使用可能 です。そのクラスを少し単純化した(setLengthChangesAllowed()メソッドを削除した)ので、完全な解決策はこれです:

public class UpperCaseTextView extends TextView {

    public UpperCaseTextView(Context context) {
        super(context);
        setTransformationMethod(upperCaseTransformation);
    }

    public UpperCaseTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setTransformationMethod(upperCaseTransformation);
    }

    public UpperCaseTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setTransformationMethod(upperCaseTransformation);
    }

    private final TransformationMethod upperCaseTransformation =
            new TransformationMethod() {

        private final Locale locale = getResources().getConfiguration().locale;

        @Override
        public CharSequence getTransformation(CharSequence source, View view) {
            return source != null ? source.toString().toUpperCase(locale) : null;
        }

        @Override
        public void onFocusChanged(View view, CharSequence sourceText,
                boolean focused, int direction, Rect previouslyFocusedRect) {}
    };
}
8
Natix

モバイルキーパッドの設定に許可があるように見えるので、これを行う最も簡単な方法は次のとおりです。

editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});

これがうまくいくことを願っています

1
Dhiren Hamal

PixlUI プロジェクトを使用すると、Button、EditText AutoCompleteEditText Checkbox RadioButtonなどのテキストビューまたはテキストビューのサブクラスでtextAllCapsを使用できます。

Androidのソースからではなく、pixluiバージョンを使用してテキストビューを作成する必要があります。つまり、これを行う必要があります。

<com.neopixl.pixlui.components.textview.TextView

        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="@string/hello_world"
        pixlui:textAllCaps="true" />

PixlUIでは、自分のアセットフォルダーに入れるカスタム書体/フォントを設定することもできます。

私はGradleに取り組んでいます PixlUIフレームワークのフォーク これはgradleを使っていて、オリジナルのプロジェクトのようにそれらをインラインで要求するのではなく、textAllCapsとスタイルから書体を指定することができます。

0
Matt Wolfe