모든 문자를 대문자로 표시하도록 TextView의 스타일을 지정하는 방법이 있습니까?


239

TextView모든 대문자로 된 텍스트를 만들 수 있는 XML 속성이나 스타일을 할당하고 싶습니다 .

속성 android:inputType="textCapCharacters"android:capitalize="characters"가, 사용자 inputed 텍스트에 대한없는 것처럼 아무것도보고하지 않는다 TextView.

스타일과 내용을 분리 할 수 ​​있도록이 작업을 수행하고 싶습니다. 프로그래밍 방식 으로이 작업을 수행 할 수 있지만 콘텐츠와 코드에서 스타일을 유지하고 싶습니다.


1
inputType = "textCapCharacters", textAllCaps = "true"모두 smasung famili에서 작동하지 않습니다 ^^. 모든 단어를 포함하는 EditText에 TextWatcher를 추가했습니다
murt

답변:


359

나는 그것이 상당히 합리적인 요청이지만 지금은 할 수없는 것처럼 보입니다. 총체적인 실패. lol

최신 정보

이제 textAllCaps 를 사용 하여 모든 대문자를 적용 할 수 있습니다 .


14
textview 속성이 확실히 부족합니다. 속성 폴더에서 ttf를 할당하는 것도 좋을 것입니다!
Nathan Schwermann

8
링크 된 질문에 대한 답변 중 하나는 'android : textAllCaps = "true"'를 제안합니다.
blaffie

@blaffie 업데이트 해 주셔서 감사합니다. android : textAllCaps = "true"가 제대로 작동하는지 확인하겠습니다.
Terrance

1
"textAllCaps"속성을 사용하여이를 수행 할 수 있습니다.
JaydeepW

1
것 같다 textAllCaps원인 지정한 경우 충돌되는 앱 android:fontFamilythemes.xml.
Alaa M.

142

무엇에 대한 안드로이드 : textAllCaps ?


8
@ larham1 xml 특성이므로 다른 사용법을 볼 수 없습니다. 작동하지 않으면 Google에 신고하십시오. setAllCaps (boolean)와 같은 API 레벨 14로 제한되어 있다고 가정합니다.
머피

1
방금 이것을 테스트했으며 작동 중입니다. 외부 스타일 파일이 있습니다
7heViking

1
@ 머피 네, 이것은 버전 문제입니다. setAllCaps () 용 SDK 14 이상; XML이 추가 된 시점은 명확하지 않지만 SDK 14도 가정합니다.
larham1

이것은 이상한 일이지만 textAllCaps는 간단한 테스트 프로젝트에서 작동하지만 ArrayAdapter.getView () 내에서 뷰를 만들면 그렇지 않습니다. background, textStyle 등 모든 것이 작동하지만 textAllCaps는 다음과 같이 작동하지 않습니다. (
Y2i

1
@JawadLeWywadi API 14 이전에는이 ​​xml 속성을 사용할 수 없습니다. Java 코드에서 수동으로 수행해야합니다.
머피

63

이전 API를 지원하는 Android 앱에서 AppCompat 사용 textAllCaps(14 미만)

CompatTextView라는 AppCompat과 함께 제공되는 하나의 UI 위젯이 textAllCaps에 대한 지원을 추가하는 사용자 정의 TextView 확장입니다.

최신 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 라이브러리 ~ Eugen Pechanec


android.support.v7.internal에서 내부를 보셨습니까? 다음 버전의 지원 라이브러리에 더 이상 내부가 없을 수 있습니까?
Emanuel Moecklin

1
대단해! @EmanuelMoecklin 일단 프로젝트에 들어가면 마술처럼 작동하지 않을 것입니다.
Eugen Pechanec

@eugen 물론 Google이 유용한 것을 추가하지 않기 때문에 지원 라이브러리를 최신 버전으로 업데이트하지 마십시오.
Emanuel Moecklin

@EmanuelMoecklin이 사실 나는 종종 이렇게 빨리 업데이트 내 코드를 나누기 : DI 완전히 당신이 내부 자원을 사용하여 조심해야합니다 동의 하지만를 그냥 APPCOMPAT-V7 소스에서 눈을 가져다가 CompatTextView사용됩니다 ScrollingTabCointainerView에서 사용되는 ToolbarWidgetWrapper아주 새로운 소리를하는, 그리고 이름이 "v7"을 그 이름으로 유지하는 한, 이것은 내가있는 CompatTextView곳에 머무를 것이라는 충분한 보증 입니다.
Eugen Pechanec

2
@EmanuelMoecklin 그렇게 되었기 때문에 최신 appcompat-v7 라이브러리 CompatTextView로 대체되었습니다 AppCompatTextView. 당신은 꽤 정확했습니다.
Eugen Pechanec

30

textAllCaps를<item name="android:textAllCaps">true</item> 사용하여 스타일 ( ) 또는 각 XML 레이아웃 파일에서 이를 수행 할 수 없다는 것은 정말 실망입니다. 속성 있는 유일한 방법은 실제로 각 문자열 ()를 사용하는 것입니다. textViewXXX.setText (theString).

필자의 경우 코드의 모든 곳에서 String.toUpperCase ()를 사용하고 싶지 않았지만 일부 활동이 있고 TextViews를 사용하여 항목 레이아웃을 항상 대문자로 사용해야하기 때문에 중앙 집중식으로 배치하고 싶었습니다 (a title) 및 다른 사람은 ... 그래서 ... 어떤 사람들은 과잉이라고 생각할 수도 있지만 android.widget.TextView를 확장하는 내 자신의 CapitalizedTextView 클래스를 만들었습니다 . 텍스트를 대문자로 설정하는 setText 메소드를 덮어 씁니다.

적어도 디자인이 변경되거나 향후 버전에서 대문자로 된 텍스트를 제거해야하는 경우 레이아웃 파일에서 일반 TextView로 변경하면됩니다.

이제 앱 디자이너가 원래 콘텐츠 대문자와 상관없이 앱 전체에서 CAPS의이 텍스트 (제목)를 원했기 때문에 실제 콘텐츠와 함께 대문자로 된 다른 일반 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 이외의 다른 클래스를 인스턴스화하기 때문에 더 많은 리소스를 소비하지는 않을 것이라고 생각합니다.


9

TextView텍스트를 대문자로 만드는 하위 클래스를 만들었 기 때문에 RacZo와 비슷한 솔루션을 생각해 냈습니다 .

차이점은 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) {}
    };
}

2

모바일 키패드 설정에 대한 권한이있는 것 같습니다. 가장 쉬운 방법은 다음과 같습니다.

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

이것이 효과가 있기를 바랍니다.


1

PixlUI 프로젝트를 사용하면 Button, EditText AutoCompleteEditText Checkbox RadioButton 및 기타 몇 가지를 포함하여 textview 또는 textview의 하위 클래스에서 textAllCaps를 사용할 수 있습니다.

안드로이드 소스의 버전이 아닌 pixlui 버전을 사용하여 텍스트 뷰를 만들어야합니다. 즉, 다음을 수행해야합니다.

<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 을 사용하고 원래 프로젝트처럼 인라인을 요구하지 않고 스타일의 서체뿐만 아니라 textAllCaps를 지정할 수 있는 PixlUI 프레임 워크 의 Gradle 포크를 작업 중입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.