私はxml属性またはスタイルをTextView
に割り当て、それがALL CAPITAL LETTERSに含まれるどんなテキストでも作ることができることを望みます。
属性Android:inputType="textCapCharacters"
およびAndroid:capitalize="characters"
は、何もしません。それらは、TextView
ではなく、ユーザーが入力したテキスト用です。
スタイルをコンテンツから切り離せるように、これをやりたいと思います。私はこれをプログラム的に行うことができることを知っていますが、ここでも私は内容とコードからスタイルを守りたいです。
Android:textAllCaps はどうですか?
古い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"/>
更新:
それが起こるので、CompatTextViewは最近AppCompatTextViewに置き換えられました appcompat-v7 library 〜Eugen Pechanec
スタイル(<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以外のクラスをインスタンス化することになるので、リソースの消費が大きいことは言うまでもありません。
私は、テキストを大文字にすることを扱う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) {}
};
}
モバイルキーパッドの設定に許可があるように見えるので、これを行う最も簡単な方法は次のとおりです。
editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});
これがうまくいくことを願っています
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とスタイルから書体を指定することができます。