260

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

属性android:inputType="textCapCharacters"android:capitalize="characters"什么都不做,看起来像是用于用户输入的文本,而不是TextView.

我想这样做,这样我就可以将样式与内容分开。我知道我可以通过编程方式做到这一点,但我想再次保持内容和代码的风格。

4

8 回答 8

381

我虽然这是一个非常合理的要求,但看起来你现在不能这样做。多么彻底的失败。哈哈

更新

您现在可以使用 textAllCaps 强制全部大写。

于 2010-12-14T00:38:57.717 回答
150

那么android:textAllCaps呢?

于 2012-03-15T00:09:05.847 回答
68

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

来源:developer.android

更新:

碰巧 CompatTextView 在最新的 appcompat-v7 库中被 AppCompatTextView 取代~ Eugen Pechanec

于 2014-03-18T03:46:59.963 回答
31

你不能<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 之外的另一个类。

于 2012-05-29T20:27:21.753 回答
9

我提出了一个与 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) {}
    };
}
于 2013-09-05T13:53:00.757 回答
3

基本上,在 XML 文件的 TextView 中编写:

android:textAllCaps="true"
于 2021-05-20T20:19:51.063 回答
2

移动键盘设置似乎有权限,所以最简单的方法是:

editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});

希望这会奏效

于 2017-02-02T06:09:00.963 回答
1

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

于 2014-06-12T07:23:50.913 回答