programing

텍스트 보기의 스타일을 프로그래밍 방식으로 설정

padding 2023. 8. 26. 10:32
반응형

텍스트 보기의 스타일을 프로그래밍 방식으로 설정

저는 그것을 사용하려고 합니다.TextView다음과 같은 스타일의 생성자:

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

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

저는 또한 사용해 보았습니다.myText.setTextAppearance(MyActivity.this, R.style.my_style)하지만 그것도 작동하지 않습니다.

저는 당신이 그 스타일을 프로그램적으로 설정할 수 있다고 생각하지 않습니다.이 문제를 해결하려면 res/layout에서 다음 내용과 같이 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 myText = (TextView)getLayoutInflater().inflate(R.layout.tvtemplate, null);

일반 스타일을 만들고 아래와 같은 여러 텍스트 보기에서 다시 사용할 수 있습니다.

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

편집:this에 대한 참조Context물건.

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

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

생성자에서 스타일을 설정할 수 있지만 스타일은 동적으로 변경/설정할 수 없습니다.

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

로맹 가이의 대답

언급

매개 변수 intdefStyleAttr스타일을 지정하지 않습니다.Android 설명서에서:

defStyleAttr - 뷰에 대한 기본값을 제공하는 스타일 리소스에 대한 참조를 포함하는 현재 테마의 특성입니다.기본값을 찾지 않으려면 0으로 설정할 수 있습니다.

View 생성자에서 스타일을 설정하려면 다음 두 가지 방법이 있습니다.

  1. ContextThemeWrapper 사용 시:

    ContextThemeWrapper wrappedContext = new ContextThemeWrapper(yourContext, R.style.your_style);
    TextView textView = new TextView(wrappedContext, null, 0);
    
  2. 4개의 인수 생성자 사용(롤리팝부터 사용 가능):

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

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

스타일을 동적으로 변경할 수 없습니다(아직).XML을 통해 보기를 만들기 전에 스타일을 설정해야 합니다.

스타일 상속(또는 이벤트 스타일 가능 특성)을 사용할 수 있는 사용자 정의 뷰를 사용하는 경우 스타일이 손실되지 않도록 두 번째 생성자를 수정해야 합니다.setTextApearance()를 사용하지 않아도 효과가 있었습니다.

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

수락된 답변은 저에게 훌륭한 해결책이었습니다.추가할 것은 다음과 같습니다.inflate()방법.

모두 승인된 답변입니다.android:layout_*매개 변수가 적용되지 않습니다.

그 이유는 그것을 조정할 방법이 없기 때문입니다.null로 통과되었습니다.ViewGroup parent.

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

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

그리고parent그것은ViewGroup하고 android:layout_*.

이 경우 모든 관련 속성이 설정됩니다.

누군가에게 유용하기를 바랍니다.

저도 그 문제에 부딪혔고, 스타일을 프로그래밍적으로 설정하는 방법을 찾았습니다.아마 여러분 모두가 필요할 것입니다. 그래서 저는 거기서 업데이트합니다.

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

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

그래서 당신은 R.attr의 유형을 통과해야 합니다.R.style 보다는.**

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

먼저, attr.xml의 테마에서 사용할 사용자 지정 특성을 사용자 지정합니다.

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

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

당신은 시도해 볼 수 있고, 그것이 당신에게 완벽하게 효과가 있기를 바랍니다.

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

참고용 Android 문서.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
    textView.setTextAppearance(R.style.yourStyle)

확장 함수 kotlin을 사용할 수 있습니다.

fun TextView.setStyle(@StyleRes resId: Int) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        setTextAppearance(resId)
    } else {
        setTextAppearance(context, resId)
    }
}

나는 EditText로만 테스트했지만 당신은 그 방법을 사용할 수 있습니다.

public void setBackgroundResource(내부)

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

이 방법은 View에 속하기 때문에 어떤 UI 요소에서도 작동할 것으로 생각합니다.

안부 전해요.

언급URL : https://stackoverflow.com/questions/3142067/set-style-for-textview-programmatically

반응형