프로그래밍 방식으로 TextView의 스타일 설정


249

다음 TextView과 같은 스타일로 생성자 를 사용하려고합니다 .

TextView myText = new TextView(MyActivity.this, null, R.style.my_style);

그러나 이렇게하면 텍스트보기가 스타일을 취하는 것처럼 보이지 않습니다 (정적 객체에서 스타일을 설정하여 스타일을 확인했습니다).

나는 또한 사용하려고 myText.setTextAppearance(MyActivity.this, R.style.my_style)했지만 작동하지 않습니다.

답변:


318

프로그래밍 방식으로 스타일을 설정할 수 있다고 생각하지 않습니다. 이 문제를 해결하기 위해 res / layout create tvtemplate.xml과 같은 스타일이 지정된 템플릿 레이아웃 xml 파일을 만들 수 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="This is a template"
        style="@style/my_style" />

그런 다음 이것을 팽창시켜 새 TextView를 인스턴스화하십시오.

TextView myText = (TextView)getLayoutInflater().inflate(R.layout.tvtemplate, null);

도움이 되었기를 바랍니다.


1
이것이 Dandre Allison의 대답보다 우월한 점은 API v11이 필요 없다는 것입니다.
Martin Capodici 2018 년

2
작동했을 수도 있지만 이것은 말이되지 않습니다. xml 파일로 어떻게 설정할 수 있습니까? 프로그래밍 방식 이 아닌 경우 . xml 파일을 사용하지 않는 이유가 있습니다. 그중 하나는 UI를 빌드하는 코드를 작성하는 데 사용되므로 메모리가 제한되어 있고 공간을 확보하고 싶기 때문에 새로운 방법을 배우고 싶지 않습니다. 다른 것들.
Iharob Al Asimi

맞습니다. 모든 일을 프로그래밍 방식으로 수행 할 수 있으며 LayoutInflater는 XML을 객체로 변환하는 것에 대한 모든 것을 알고 있습니다. 안타깝게도 많은 것들이 개인 API 아래에 숨겨져 있으며 일부 객체를 만드는 유일한 방법은 생성자에 AttributeSet을 제공하는 것입니다.
Miha_x64

다른 모든 답변과 달리 이것은 실제로 스피너와 함께 작동하므로 골드 스타
Rowan Berry

121

일반적인 스타일을 만들어 아래처럼 여러 텍스트보기에서 재사용 할 수 있습니다.

textView.setTextAppearance(this, R.style.MyTextStyle);

편집 : 이것은 컨텍스트를 나타냅니다


50
당신의 모든 행동이 텍스트의 "스타일"로 원숭이처럼 행동하는 한 당신의 대답은 효과적입니다. 패딩이나 여백 추가와 같은 다른 작업을 TextView에 수행하려고하면 작동하지 않습니다. 그래서, 당신이 틀렸다는 말은 아니지만 대답은 제한적입니다. 런타임에 뷰를 팽창시키는 것이 포괄적 인 스타일을 적용하는 유일한 방법입니다.
Bill Mote

1
팽창 템플릿을 사용하고 setTextAppearance를 사용하는 솔루션은 모두 합리적입니다. 두 번째 솔루션의 패딩 / 여백 문제를 해결하기 위해 textView.setLayoutParams (layoutParams)
AlanKley

이 메소드는 API 레벨 23에서 더 이상 사용되지 않습니다. 대신 API 23+에서 setTextAppearance (int)를 사용하십시오.
Sergii

버전이 API 23 (M) 이상인지 확인하십시오.
Br0thazS0ul

4
지원 라이브러리의 방법을 사용하십시오.TextViewCompat.setTextAppearance
Rubin Yoo

97

다음 과 같이 ContextThemeWrapper 를 생성자에 전달할 수 있습니다 .

TextView myText = new TextView(new ContextThemeWrapper(MyActivity.this, R.style.my_style));

1
좋은 물건! API 8을 지원하면서 프로그래밍 방식으로 스타일을 설정할 수있는 유일한 방법입니다.
tbraun

어떤 이유로 든 버튼 스타일에 영향을 미치지 않습니다. 내 스타일을 다음과 같이 정의했습니다 <style name="TabButton"><item name="android:background">@drawable/tabbar_button_bkgnd</item>...</style>. 그런 다음 구성으로 호출합니다 new Button(new ContextThemeWrapper(context, R.style.TabButton));. 그러나 버튼은 단순히 내 설정을 무시합니다. 내가 여기서 잘못하고 있습니까?
Aleks N.

@ AlaksiejN.You Widget.Button 스타일에서 상속해야합니다parent="@android:style/Widget.Button"
maxcanna

@maxcanna 어떤 이유로 추가 parent는 조금 바뀌지 않았습니다. 그래서 방금 inflate솔루션을 진행했습니다.
Aleks N.

11
@AliakseiN. 예를 들어 3-arg 생성자를 사용해야합니다 new Button(new ContextThemeWrapper(context, R.style.TabButton), null, 0). 그렇지 않으면 기본 버튼 스타일이 적용되고이 스타일은 ContextThemeWrapper를 통해 테마에 병합 한 버튼 스타일을 재정의합니다.
Newtonx

17

생성자에서 스타일을 설정할 수 있습니다 (그러나 스타일은 동적으로 변경 / 설정할 수 없습니다).

View(Context, AttributeSet, int)( int현재 테마에서 스타일에 대한 참조를 포함하는 속성입니다)

Romain Guy의 답변

참고


당신의 대답은 오도의 소지가 있습니다-당신은이 스레드를 끝까지 읽어 보셨습니까?
andr

3
어떻게 잘못 인도됩니까? Romain Guy는 프로그래밍 방식으로 스타일을 "설정"할 수 있다고 명시 적으로 말했기 때문에 허용되는 대답은 오해의 소지가 있습니다. 동적으로 변경하는 기능은 없습니다. 이 스레드는 그렇지 않다고 생각합니다.
Dandre Allison

1
이 호출에는 API 레벨 11이 필요합니다.
Martin Capodici 2006 년

1
@PaulVerest 인용이 아닙니다.
Dandre Allison

6
마지막 int는 스타일 리소스 가 아닙니다 . "보기에 대한 기본값을 제공하는 스타일 자원에 대한 참조를 포함하는 현재 테마의 속성"입니다.
rve

11

int 매개 변수 defStyleAttr는 스타일을 지정하지 않습니다. 안드로이드 문서에서 :

defStyleAttr- 보기의 기본값을 제공하는 스타일 자원에 대한 참조를 포함하는 현재 테마의 속성입니다. 기본값을 찾지 않으려면 0 일 수 있습니다.

View 생성자에서 스타일을 설정하려면 두 가지 가능한 솔루션이 있습니다.

  1. ContextThemeWrapper를 사용하여 :

    ContextThemeWrapper wrappedContext = new ContextThemeWrapper(yourContext, R.style.your_style);
    TextView textView = new TextView(wrappedContext, null, 0);
  2. 인수가 4 개인 생성자 (LOLLIPOP에서 사용 가능) :

    TextView textView = new TextView(yourContext, null, 0, R.style.your_style);

두 솔루션의 핵심 사항 - defStyleAttr뷰에 스타일을 적용하려면 매개 변수가 0이어야합니다.


5

동적으로 스타일 변경은 지원되지 않습니다 (아직). XML을 통해보기를 작성 하기 전에 스타일을 설정 해야 합니다.


20
실제로 똑같은 일이 일어납니다
njzk2

@ njzk2 감사합니다 ... 분명히 게시하기 전에 그의 의견에 대해 생각하지 않았습니다. UI를 빌드하기 전에 프로그래밍 방식으로 스타일을 설정할 수있는 방법이 없으므로 동일한 코드를 사용하여 스타일을 프로그래밍 방식으로 변경하거나 설정할 수 있습니다.
Chris Cashwell

3

받아 들인 대답은 나를 위해 훌륭한 해결책이었습니다. 추가해야 할 유일한 것은 inflate()방법 에 관한 것입니다.

수락 된 답변에서 모든 android:layout_*매개 변수가 적용되지 않습니다.

이유는 조정 방법이 없으므로 원인 null은로 전달되었습니다 ViewGroup parent.

다음과 같이 사용할 수 있습니다.

View view = inflater.inflate(R.layout.view, parent, false);

그리고는 parent이다 ViewGroup조정할 좋아하는 곳에서, android:layout_*.

이 경우 모든 상대 속성이 설정됩니다.

누군가에게 도움이되기를 바랍니다.


2

스타일 상속 (또는 이벤트 스타일 가능 속성)을 사용하는 사용자 정의보기를 사용하는 경우 스타일을 잃지 않도록 두 번째 생성자를 수정해야합니다. 이것은 setTextAppearence () 를 사용할 필요없이 나를 위해 일했습니다 .

public CustomView(Context context, AttributeSet attrs) {
    this(context, attrs, attrs.getStyleAttribute());
}

2

나도 문제를 만났고 프로그래밍 방식으로 스타일을 설정하는 방법을 찾았습니다. 어쩌면 당신은 모두 그것을 필요로 할 것입니다.

View 생성자의 세 번째 매개 변수는 테마의 attr 유형을 아래 소스 코드로 허용합니다.

public TextView(Context context, AttributeSet attrs) {
    this(context, attrs, com.android.internal.R.attr.textViewStyle);
}

따라서 R.style이 아닌 R.attr. ** 유형을 전달해야합니다. **

내 코드에서 다음 단계를 수행했습니다.

먼저 attr.xml의 테마에서 사용할 사용자 정의 된 attr을 사용자 정의하십시오.

<attr name="radio_button_style" format="reference" />

둘째, style.xml에서 사용한 테마에 스타일을 지정하십시오.

 <style name="AppTheme" parent="android:Theme.Translucent">
    <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    <item name="radio_button_style">@style/radioButtonStyle</item>
</style>
<style name="radioButtonStyle" parent="@android:style/Widget.CompoundButton.RadioButton">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">64dp</item>
    <item name="android:background">#000</item>
    <item name="android:button">@null</item>
    <item name="android:gravity">center</item>
    <item name="android:saveEnabled">false</item>
    <item name="android:textColor">@drawable/option_text_color</item>
    <item name="android:textSize">9sp</item>
</style>

결국 사용하십시오!

            RadioButton radioButton = new RadioButton(mContext, null, R.attr.radio_button_style);

프로그래밍 방식으로 생성 된 뷰는 테마에서 지정된 스타일을 사용합니다.

시도해 볼 수 있으며 완벽하게 작동하기를 바랍니다.


0

EditText로만 테스트했지만 메소드를 사용할 수 있습니다

공공 무효 setBackgroundResource (int resid)

XML 파일에 정의 된 스타일을 적용합니다.

이 방법이 View에 속해 있다고 생각합니다 .UI 요소와 함께 작동한다고 생각합니다.

문안 인사.


문서 에 따르면 이것은 스타일이 아닌 드로어 블에서만 작동해야합니다. 따라서 이것이 실제로 작동하면 "우연히"만 발생하므로 의존해서는 안됩니다.
Heinzi

0

사용할 수 있습니다 TextViewCompact.setTextAppearance(textView, R.style.xyz).

참고로 안드로이드 문서 .

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