有没有办法将TextView设置为大写所有字母的大写?

时间:2010-12-13 23:43:07

标签: android textview capitalization

我希望能够为TextView指定一个xml属性或样式,以便在所有大写字母中生成任何文本。

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

我想这样做,所以我可以将风格与内容分开。我知道我可以在程序上做到这一点,但我又想要保持样式不受内容和代码的影响。

8 个答案:

答案 0 :(得分:321)

我认为这是一个非常合理的请求,但是it looks like you cant do it at this time.什么是彻底失败。大声笑

更新

您现在可以使用 textAllCaps迫使所有上限。

答案 1 :(得分:132)

android:textAllCaps怎么办?

答案 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"/>

来源:developer.android

<强>更新

  

因此,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"