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


239

XMLの属性またはスタイルをに割り当てTextViewて、すべて大文字のテキストを作成できるようにしたいと考えています。

属性は、android:inputType="textCapCharacters"android:capitalize="characters"彼らは、ユーザーinputedテキストのためではないようなものと見もしませんTextView

これを実行して、スタイルをコンテンツから分離できるようにします。私はこれをプログラムで行うことができることを知っていますが、コンテンツとコードからスタイルを除外したいと思います。


1
inputType = "textCapCharacters"、textAllCaps = "true"はどちらもsmasungファミリでは機能しません^^。私は自分のEditTextにTextWatcherを追加したことキャップすべての単語
MURT

回答:


356

私はそれはかなり合理的な要求でしたが、現時点ではそれを行うことができないようです。なんという完全な失敗でしょう。笑

更新

これで、textAllCaps を使用してすべての大文字を強制できます 。


14
textview属性は間違いなく欠けています。属性フォルダからttfも割り当てると便利です。
Nathan Schwermann、2010

8
リンクされた質問の回答の1つは「android:textAllCaps = "true"」を示唆していますこれは私にとってはうまくいきました。
blaffie 2013年

@blaffie更新ありがとうございます。android:textAllCaps = "true"が正しく機能するかどうかを確認します。
Terrance、2013年

1
「textAllCaps」属性を使用してこれを行うことができるため、反対票になります。
JaydeepW 2013

1
textAllCaps指定android:fontFamilyした場合、アプリがクラッシュするようですthemes.xml
Alaa M. 2015

142

何についてのandroid:textAllCaps


8
@ larham1これはxml属性なので、他にどのように使用できるかわかりません。機能しない場合は、Googleに報告してください。setAllCaps(boolean)のようなAPIレベル14に制限されていると思います。
マーフィー

1
私はこれをテストしたところ、うまくいきました。私は外部スタイルファイルを持っています
7heViking

1
@マーフィーはい、これはバージョン管理の問題です。SDK 14以降、setAllCaps(); いつxmlが追加されたかはわかりませんが、SDK 14も想定しています。
larham1

これは奇妙なことです。textAllCapsは単純なテストプロジェクトで機能しますが、ビューがArrayAdapter.getView()内に作成されると機能しません。すべてが機能します:background、textStyleなどですが、textAllCapsは機能しません:(
Y2i

1
@JawadLeWywadi API 14以前ではこのxml属性を使用できません。Javaコードで手動で行う必要があります。
マーフィー

63

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

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ライブラリ〜オイゲンPechanec


android.support.v7.internalの内部に気付きましたか?内部のように、サポートライブラリの次のバージョンではもうないかもしれませんか?
エマニュエルモエクリン2014年

1
これはすごい!@EmanuelMoecklinプロジェクトに追加すると、魔法のように道を走ることはできません。
Eugen Pechanec、2015

@eugenはもちろん、Googleが役立つものを追加することはないので、サポートライブラリを最新バージョンに更新することはありません。
エマニュエルモエクリン2015

DIは完全にあなたが内部リソースを使用してを警戒する必要があることに同意:@EmanuelMoecklinは、実際に私は、多くの場合、そうすぐにそれは私のコードを壊す更新しかし、私はちょうどAPPCOMPAT-V7ソースで一目を取り、CompatTextViewで使用されているScrollingTabCointainerView中で使用されToolbarWidgetWrapper、かなり新しいサウンドいると名前に「v7」が含まれている限り、これは私CompatTextViewがそれが存在する場所に留まることを十分に保証します。
Eugen Pechanec 2015

2
@EmanuelMoecklinたまたま、最新のappcompat-v7ライブラリでCompatTextView置き換えられましAppCompatTextViewた。正解でした。
Eugen Pechanec 2015

30

スタイル(<item name="android:textAllCaps">true</item>)またはtextAllCapsを含む各XMLレイアウトファイルでそれを実行できないことは、本当に非常に残念です。 属性をです、そしてそれを行う唯一の方法は、実際に行うときに各文字列でtheString.toUpperCase()を使用することですtextViewXXX.setText(theString)。

私の場合、コードのすべての場所にtheString.toUpperCase()を配置したくはありませんでしたが、常に大文字になっているはずのTextViewを含むアクティビティとリストアイテムレイアウトがあるため、それを一元化した場所にしたいと思いました(aタイトル)とそうでない人...そう...一部の人はやり過ぎだと思うかもしれませんが、android.widget.TextViewを拡張する独自のCapitalizedTextViewクラスを作成し、その場でテキストを大文字にする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とは別のクラスをインスタンス化するので、リソースの消費量が多いことは言うまでもなく、それはやり過ぎです。


9

TextViewテキストを大文字にするサブクラスも作成したという点で、RacZoと同様のソリューションを考え出しました。

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

あなたがに見ると、ソース、あなたはの実装が表示されます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) {}
    };
}

2

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

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

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


1

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を使用して、元のプロジェクトのようにインラインで要求するのではなく、textAllCapsとスタイルの書体を指定できるようにする、PixlUIフレームワークの Gradle フォークに取り組んでいます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.