有一种方法来风格TextView的大写所有的字母?

我希望能够将xml属性或样式赋给TextView,使它所拥有的任何文本都全部大写。

属性android:inputType="textCapCharacters"android:capitalize="characters"什么都不做,看起来像用户输入的文本,而不是TextView

我想这样做,这样我就可以将风格从内容中分离出来。我知道我可以在程序上做到这一点,但我想再次保持风格的内容和代码。

219084 次浏览

我认为这是一个相当合理的要求,但看来你现在不能做了。完全失败。哈哈

更新

你现在可以使用 textAllCaps 强制所有大写。

非常令人失望的是,你不能用styles (<item name="android:textAllCaps">true</item>)或每个带有textAllCaps属性的XML布局文件这样做,唯一的方法是在你做textViewXXX.setText(theString)时对每个字符串使用theString. touppercase()。

在我的情况下,我不想有theString.toUpperCase()在我的代码中到处都是,但有一个集中的地方来做,因为我有一些活动和列表项布局与TextViews,在那里应该一直大写(标题)和其他谁没有…所以…有些人可能认为这是一个过度的,但我创建了自己的CapitalizedTextView类扩展android.widget.TextView和覆盖setText方法大写文本。

至少,如果设计发生变化,或者我需要在未来的版本中删除大写的文本,我只需要在布局文件中更改为正常的TextView。

现在,考虑到我这样做是因为应用程序的设计师实际上想要这个文本(标题)在整个应用程序的大写,无论原始内容的大写,也有其他正常的TextViews,其中的大写与实际内容。

这是这个类:

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。

我提出了一个解决方案,这是类似于RacZo的事实,我也创建了TextView的子类处理使文本大写。

不同之处在于,我没有重写setText()方法之一,而是使用了与API 14+上TextView实际做的类似的方法(在我看来,这是一个更干净的解决方案)。

如果你仔细观察,你会看到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) {}
};
}

通过在支持旧API(小于14)的Android应用程序中使用AppCompat textAllCaps

AppCompat附带了一个名为CompatTextView的UI小部件,它是一个自定义TextView扩展,添加了对textAllCaps的支持

对于更新的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所取代 latest appcompat-v7图书馆 ~ Eugen Pechanec

PixlUI项目允许你使用textAllCaps在任何textview或textview的子类,包括: 按钮, EditText AutoCompleteEditText 复选框 RadioButton

你需要创建你的文本视图使用pixlui版本,而不是那些从android源,这意味着你必须这样做:

<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以及来自样式的字体,而不是像原始项目那样要求它们内联。

手机键盘设置似乎是有权限的,所以最简单的方法是:

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

希望这能奏效

基本上,在XML文件的TextView中写这个:

android:textAllCaps="true"