我希望能够为 a 分配一个 xml 属性或样式,以TextView
使其在所有大写字母中具有任何文本。
属性android:inputType="textCapCharacters"
和android:capitalize="characters"
什么都不做,看起来像是用于用户输入的文本,而不是TextView
.
我想这样做,这样我就可以将样式与内容分开。我知道我可以通过编程方式做到这一点,但我想再次保持内容和代码的风格。
我希望能够为 a 分配一个 xml 属性或样式,以TextView
使其在所有大写字母中具有任何文本。
属性android:inputType="textCapCharacters"
和android:capitalize="characters"
什么都不做,看起来像是用于用户输入的文本,而不是TextView
.
我想这样做,这样我就可以将样式与内容分开。我知道我可以通过编程方式做到这一点,但我想再次保持内容和代码的风格。
通过在支持旧 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"/>
更新:
碰巧 CompatTextView 在最新的 appcompat-v7 库中被 AppCompatTextView 取代~ Eugen Pechanec
你不能用<item name="android:textAllCaps">true</item>
样式 (一个 textViewXXX.setText(theString)。
就我而言,我不想在我的代码中到处都有 theString.toUpperCase() 而是有一个集中的地方来做,因为我有一些活动并列出了带有 TextViews 的项目布局,这些布局应该一直被大写(a标题)和其他人没有......所以......有些人可能认为这是矫枉过正,但我创建了我自己的 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
它处理使文本大写。
不同之处在于,我没有覆盖其中一种方法,而是使用了与API 14+ 上实际执行的setText()
方法类似的方法(在我看来,这是一种更清洁的解决方案)。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) {}
};
}
基本上,在 XML 文件的 TextView 中编写:
android:textAllCaps="true"
移动键盘设置似乎有权限,所以最简单的方法是:
editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});
希望这会奏效
PixlUI项目允许您在任何 textview 或 textview 的子类中使用 textAllCaps,包括:Button、EditText AutoCompleteEditText Checkbox 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 还允许您设置放在资产文件夹中的自定义字体/字体。
我正在研究PixlUI 框架的 Gradle 分支,它使用 gradle 并允许从样式中指定 textAllCaps 以及字体,而不是像原始项目那样要求它们内联。