有没有一种方法可以将TextView的样式设置为全部大写呢?


239

我希望能够为分配xml属性或样式,以TextView使其在所有大写字母中具有任何文本。

属性android:inputType="textCapCharacters"android:capitalize="characters"不执行任何操作,看起来像是用于用户输入的文本,而不是TextView

我想这样做,以便可以将样式与内容分开。我知道我可以通过编程方式做到这一点,但我又想使样式保持在内容和代码之外。


1
inputType =“ textCapCharacters”,textAllCaps =“ true”都不能在smasung系列中使用。我已经将TextWatcher添加到了所有单词都
加盖的

Answers:


358

我虽然那是一个相当合理的要求,但看来您目前无法这样做。多么彻底的失败。大声笑

更新资料

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


14
绝对缺少textview属性。从attributes文件夹中分配一个ttf也很好!
内森·史威文2010年

8
链接问题的答案之一是'android:textAllCaps =“ true”'。
blaffie 2013年

@blaffie感谢您的更新。我将检查android:textAllCaps =“ true”是否正常工作。
Terrance

1
您可以使用“ textAllCaps”属性来完成此操作,因此请降低投票率。
JaydeepW

1
textAllCaps如果在中指定android:fontFamily,似乎会导致应用崩溃themes.xml
Alaa M.

142

怎么样安卓:textAllCaps


8
@ larham1这是一个xml属性,因此我看不到它可以如何使用。如果无法正常工作,请向Google报告。我想它仅限于API级别14,例如setAllCaps(boolean)。
Murphy

1
我刚刚测试过,它正在工作。我有一个外部样式文件
7heViking

1
@Murphy是的,这是一个版本控制问题。setAllCaps()的SDK 14及更高版本;当添加xml时还不清楚,但是我也假设SDK 14。
larham1 2012年

奇怪的是,textAllCaps在一个简单的测试项目中工作,但是在ArrayAdapter.getView()中创建视图时,事实并非如此。一切正常:背景,textStyle等,但textAllCaps不起作用:(
Y2i

1
@JawadLeWywadi,您不能在API 14之前使用此xml属性。您需要使用Java代码手动进行操作。
Murphy

63

通过在支持较旧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


您是否注意到android.support.v7.internal内部的内容?在下一个版本的支持库中可能不再有内部版本?
伊曼纽尔·莫克林

1
这太棒了!@EmanuelMoecklin一旦将其包含在项目中,就不会神奇地运行某种方式。
Eugen Pechanec 2015年

@eugen当然,您永远都不会将支持库更新到最新版本,因为Google从未添加任何有用的东西,对吗?
伊曼纽尔·莫克林

@EmanuelMoecklin实际上,我经常更新得如此之快,以至于破坏了我的代码:DI完全同意您应该警惕使用内部资源,但是我只是看了一眼appcompat-v7源代码,并且CompatTextViewScrollingTabCointainerView其中使用了ToolbarWidgetWrapper,这听起来很新,而且只要名称保留其名称中的“ v7”,这对我来说就是一个足够好的保证CompatTextView,它将保留在原位。
Eugen Pechanec

2
@EmanuelMoecklin恰好在最新的appcompat-v7库中CompatTextView被替换AppCompatTextView。你说得很对。
Eugen Pechanec 2015年

30

令人非常失望的是,您无法使用样式(<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。


9

我想出了一个与RacZo相似的解决方案,因为我还创建了一个子类,TextView该子类的作用是使文本变为大写。

区别在于setText(),我使用了与TextViewAPI 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) {}
    };
}


1

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以及字体,而不是像原始项目那样直接内联。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.