我希望能够为分配xml属性或样式,以TextView
使其在所有大写字母中具有任何文本。
属性android:inputType="textCapCharacters"
和android:capitalize="characters"
不执行任何操作,看起来像是用于用户输入的文本,而不是TextView
。
我想这样做,以便可以将样式与内容分开。我知道我可以通过编程方式做到这一点,但我又想使样式保持在内容和代码之外。
我希望能够为分配xml属性或样式,以TextView
使其在所有大写字母中具有任何文本。
属性android:inputType="textCapCharacters"
和android:capitalize="characters"
不执行任何操作,看起来像是用于用户输入的文本,而不是TextView
。
我想这样做,以便可以将样式与内容分开。我知道我可以通过编程方式做到这一点,但我又想使样式保持在内容和代码之外。
Answers:
textAllCaps
如果在中指定android:fontFamily
,似乎会导致应用崩溃themes.xml
。
怎么样安卓:textAllCaps?
通过在支持较旧API(小于14个)的Android Apps中使用AppCompat textAllCaps
AppCompat附带一个UI窗口小部件,名为CompatTextView,这是一个自定义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
更新:
碰巧的是,在最新的appcompat-v7库中, CompatTextView被AppCompatTextView取代了〜Eugen Pechanec
CompatTextView
在ScrollingTabCointainerView
其中使用了ToolbarWidgetWrapper
,这听起来很新,而且只要名称保留其名称中的“ v7”,这对我来说就是一个足够好的保证CompatTextView
,它将保留在原位。
CompatTextView
被替换AppCompatTextView
。你说得很对。
令人非常失望的是,您无法使用样式(<item name="android:textAllCaps">true</item>
)或每个具有textAllCaps 属性的XML布局文件来执行此操作,而唯一的方法实际上是在执行此操作时在每个字符串上使用theString.toUpperCase()一个textViewXXX.setText(theString)。
就我而言,我不想在代码中到处都有theString.toUpperCase(),而是希望有一个集中的位置来进行此操作,因为我有一些Activity并列出了TextViews的项目布局,这些布局应该一直大写(标题)和其他没有...的人,有些人可能认为这太过分了,但我创建了自己的CapitalizedTextView类,扩展了android.widget.TextView并覆盖了setText方法,从而即时将文本大写。
至少,如果设计发生更改,或者我需要在以后的版本中删除大写的文本,则只需要在布局文件中更改为普通的TextView。
现在,考虑一下我这样做的原因是,无论原始内容的大写形式是什么,应用程序的设计师实际上都希望在整个应用程序中使用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。
我想出了一个与RacZo相似的解决方案,因为我还创建了一个子类,TextView
该子类的作用是使文本变为大写。
区别在于setText()
,我使用了与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) {}
};
}
似乎对移动键盘设置有许可,所以最简单的方法是:
editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});
希望这会工作
PixlUI项目允许您在任何textview或textview的子类中使用textAllCaps,包括:按钮,EditText AutoCompleteEditText复选框RadioButton以及其他几个。
您将需要使用pixlui版本而不是android来源的textview创建文本视图,这意味着您必须执行以下操作:
<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以及字体,而不是像原始项目那样直接内联。