Есть ли способ стилизовать TextView в верхний регистр всех его букв?
Я хотел бы иметь возможность назначить атрибут xml или стиль для TextView
это сделает любой текст, который он имеет во всех заглавных буквах.
атрибуты android:inputType="textCapCharacters"
и android:capitalize="characters"
ничего не делать и выглядеть они для ввода текста пользователем, а не TextView
.
Я хотел бы сделать это, чтобы я мог отделить стиль от содержания. Я знаю, что могу сделать это программно, но опять же я хочу сохранить стиль из контента и кода.
7 ответов:
Я думал, что это была довольно разумная просьба, но похоже, вы не можете сделать это в это время. какой полный провал. лол
обновление
теперь вы можете использовать textAllCaps форсировать все заглушки.
а как же android: textAllCaps?
С помощью AppCompat
textAllCaps
В Android-приложениях, поддерживающих старые API (менее 14)есть один UI виджеты, которые поставляется с AppCompat с именем 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"/>
источник:разработчика.android
обновление:
как это происходит CompatTextView был заменен на AppCompatTextView в последние библиотека appcompat-v7 ~ Eugen Pechanec
это действительно очень разочаровывает, что вы не можете сделать это со стилями (
<item name="android:textAllCaps">true</item>
) или на каждом XML-файле макета с textAllCaps атрибут, и единственный способ сделать это на самом деле с помощью theString.toUpperCase () на каждой из строк, когда вы делаете textViewXXX.setText (theString).В моем случае, я не хотел иметь строки.toUpperCase () везде в моем коде, но иметь централизованный место, чтобы сделать это, потому что у меня были некоторые мероприятия и списки элементы макетов с TextViews, которые должны быть заглавными буквами все время (название) и другие, кто этого не сделал... так... некоторые люди могут подумать, что это перебор, но я создал свой собственный класс CapitalizedTextView extending android.штучка.TextView и переопределил метод setText, прописывая текст на лету.
по крайней мере, если дизайн меняется или мне нужно удалить заглавный текст в будущих версиях, мне просто нужно изменить обычный TextView в макете файлы.
Теперь примите во внимание, что я сделал это, потому что дизайнер приложения на самом деле хотел этот текст (заголовки) в шапках по всему приложению независимо от первоначальной капитализации контента, а также у меня были другие обычные текстовые просмотры, где капитализация пришла с фактическим контентом.
Это класс:
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's в том, что я также создал подкласс
TextView
который обрабатывает создание текста в верхнем регистре.разница в том, что вместо переопределения одного из
setText()
методы, которые я использовал аналогичный подход к тому, чтоTextView
на самом деле делает на API 14+ (который, на мой взгляд, более чистое решение).если вы посмотрите в источник, вы увидите реализацию
setAllCaps()
:public void setAllCaps(boolean allCaps) { if (allCaps) { setTransformationMethod(new AllCapsTransformationMethod(getContext())); } else { setTransformationMethod(null); } }
The
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 или подклассе textview в том числе: Кнопка, 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 в вилка PixlUI framework который использует gradle и позволяет указывать textAllCaps, а также шрифт из стилей, а не требовать их встроенных, как это делает исходный проект.