IT story

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

hot-time 2020. 4. 19. 13:57
반응형

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


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

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

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


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

최신 정보

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


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


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

AppCompat과 함께 제공되는 UI 위젯에는 CompatTextView라는 텍스트 위젯이 있으며 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

최신 정보:

그렇게되면 최신 appcompat-v7 라이브러리 에서 CompatTextView가 AppCompatTextView로 대체되었습니다 ~ Eugen Pechanec


style ( <item name="android:textAllCaps">true</item>) 또는 textAllCaps 특성 이있는 각 XML 레이아웃 파일에서 이를 수행 할 수 없다는 점이 매우 실망 스럽습니다. 그렇게 하는 유일한 방법은 실제로 각 문자열 에서 String.toUpperCase ()를 사용하는 것입니다. textViewXXX.setText (theString).

필자의 경우 코드의 어느 곳에서나 String.toUpperCase ()를 갖고 싶지 않았지만 일부 활동이 있고 TextViews를 사용하여 항목 레이아웃을 항상 대문자로 사용해야하기 때문에 중앙 집중식으로 배치하고 싶었습니다. 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 이외의 다른 클래스를 인스턴스화하기 때문에 더 많은 리소스를 소비하지는 않을 것이라고 생각합니다.


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

차이점은 setText()메소드 중 하나를 재정의하는 대신 TextViewAPI 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) {}
    };
}

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

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

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


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 포크를 작업 중입니다.

참고 URL : https://stackoverflow.com/questions/4434588/is-there-a-way-to-style-a-textview-to-uppercase-all-of-its-letters

반응형