Есть ли способ создать TextView для прописных букв?

Я хотел бы иметь возможность назначить атрибут xml или стиль TextView , который сделает любой текст, который он имеет во ВСЕХ КАПИТАЛАХ.

Атрибуты android:inputType="textCapCharacters" и android:capitalize="characters" android:inputType="textCapCharacters" android:capitalize="characters" ничего не делают и выглядят так, как будто они предназначены для введенного пользователем текста, а не TextView .

Я хотел бы сделать это, чтобы я мог отделить стиль от контента. Я знаю, что могу делать это программно, но снова хочу сохранить стиль из контента и кода.

Я, хотя это был довольно разумный запрос, но похоже, что вы не можете сделать это в это время. Какая полная неудача. лол

Обновить

Теперь вы можете использовать textAllCaps для форматирования всех кепок.

Что относительно android: textAllCaps ?

Используя AppCompat textAllCaps в приложениях Android, поддерживающих более старые API (менее 14)

Существует один виджет пользовательского интерфейса, который поставляется с AppCompat с именем CompatTextView – это расширение Custom TextView, которое добавляет поддержку textAllCaps

Для нового API Android 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 ~ Eugen Pechanec

Очень неутешительно, что вы не можете сделать это со стилями ( <item name="android:textAllCaps">true</item> ) или в каждом файле макета XML с атрибутом textAllCaps , и единственный способ сделать это Фактически используя theString.toUpperCase () для каждой из строк, когда вы выполняете textViewXXX.setText (theString).

В моем случае я не хотел иметь theString.toUpperCase () всюду в моем коде, но иметь централизованное место, чтобы сделать это, потому что у меня было несколько видов деятельности и перечислены макеты элементов с TextViews, которые должны быть капитализированы все время ( Название) и другие, которые этого не сделали … так что некоторые люди могут подумать, что это перебор, но я создал свой собственный класс CapitalizedTextView, расширяющий android.widget.TextView и переопределив метод setText, замаскировав текст на лету.

По крайней мере, если проект изменится или мне нужно удалить заглавный текст в будущих версиях, мне просто нужно перейти на обычный TextView в файлах макета.

Теперь учтите, что я сделал это, потому что App Designer действительно хотел, чтобы этот текст (заголовки) в CAPS во всем приложении не зависел от первоначальной капитализации контента, а также у меня были другие обычные текстовые элементы, в которых была сделана капитализация с фактическим содержимым ,

Это класс:

 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) {} }; } 

Проект PixlUI позволяет использовать textAllCaps в любом текстовом представлении или подклассе textview, включая: 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 также позволяет установить пользовательский шрифт / шрифт, который вы вложили в свою папку с ресурсами.

Я работаю над вилкой Gradle из фреймворка PixlUI, который использует gradle и позволяет указывать textAllCaps, а также шрифт из стилей, а не требовать их встроенного, как это делает оригинальный проект.

Похоже, есть разрешение на настройку мобильной клавиатуры, поэтому самый простой способ сделать это:

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

Надеюсь, что это сработает