我希望能够为TextView
指定一个xml属性或样式,以便在所有大写字母中生成任何文本。
属性android:inputType="textCapCharacters"
和android:capitalize="characters"
不执行任何操作,看起来像是用户输入的文本,而不是TextView
。
我想这样做,所以我可以将风格与内容分开。我知道我可以在程序上做到这一点,但我又想要保持样式不受内容和代码的影响。
答案 0 :(得分:321)
我认为这是一个非常合理的请求,但是it looks like you cant do it at this time.什么是彻底失败。大声笑
您现在可以使用 textAllCaps迫使所有上限。
答案 1 :(得分:132)
答案 2 :(得分:56)
在Android应用中支持 AppCompat textAllCaps
支持较旧的API(少于14个)
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被AppCompatTextView取代 最新appcompat-v7 library ~Eugen Pechanec
答案 3 :(得分:29)
您无法使用样式(<item name="android:textAllCaps">true</item>
)或使用 textAllCaps 属性在每个XML布局文件上执行此操作,这是非常令人失望的,这是唯一的方法当你执行textViewXXX.setText(theString)时,它实际上是对每个字符串使用了String.toUpperCase()。
在我的情况下,我不想在我的代码中到处都有theString.toUpperCase(),但是要有一个集中式的地方来做这件事,因为我有一些活动并列出了TextViews的项目布局应该一直大写的(标题)和其他没有的人...所以...有些人可能认为是一种矫枉过正,但我创建了自己的CapitalizedTextView类,扩展了android.widget.TextView并覆盖了setText方法动态地利用文本。
至少,如果设计更改或我需要在将来的版本中删除大写文本,我只需要在布局文件中更改为普通的TextView。
现在,考虑到我这样做是因为App的设计师实际上想要在整个应用程序中使用CAPS中的这个文本(标题),无论原始内容大小写,还有其他正常的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。
答案 4 :(得分:8)
我已经提出了一个类似于RacZo的解决方案,因为我还创建了一个TextView
子类来处理文本大写。
不同之处在于,我没有覆盖其中一个setText()
方法,而是采用了类似于TextView
在API 14+上实际执行的方法(这是我的观点)查看更清洁的解决方案)。
如果您查看source,就会看到setAllCaps()
的实施情况:
public void setAllCaps(boolean allCaps) {
if (allCaps) {
setTransformationMethod(new AllCapsTransformationMethod(getContext()));
} else {
setTransformationMethod(null);
}
}
AllCapsTransformationMethod
课程(目前)不是公开的,但来源也是available。我已经简化了那个类(删除了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) {}
};
}
答案 5 :(得分:1)
似乎有移动键盘设置的许可,所以最简单的方法是:
editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});
希望这会有用
答案 6 :(得分:0)
PixlUI项目允许您在textview的任何textview或子类中使用textAllCaps,包括: 按钮, 的EditText AutoCompleteEditText 复选框 单选按钮 和其他几个人。
您需要使用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 fork of the PixlUI framework,它使用gradle并允许指定textAllCaps以及样式中的字体,而不是像原始项目那样要求它们内联。
答案 7 :(得分:0)
基本上,在 XML 文件的 TextView 中写这个:
android:textAllCaps="true"