답변:
프로그래밍 방식으로 스타일을 설정할 수 있다고 생각하지 않습니다. 이 문제를 해결하기 위해 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);
도움이 되었기를 바랍니다.
일반적인 스타일을 만들어 아래처럼 여러 텍스트보기에서 재사용 할 수 있습니다.
textView.setTextAppearance(this, R.style.MyTextStyle);
편집 : 이것은 컨텍스트를 나타냅니다
TextViewCompat.setTextAppearance
다음 과 같이 ContextThemeWrapper 를 생성자에 전달할 수 있습니다 .
TextView myText = new TextView(new ContextThemeWrapper(MyActivity.this, R.style.my_style));
<style name="TabButton"><item name="android:background">@drawable/tabbar_button_bkgnd</item>...</style>
. 그런 다음 구성으로 호출합니다 new Button(new ContextThemeWrapper(context, R.style.TabButton));
. 그러나 버튼은 단순히 내 설정을 무시합니다. 내가 여기서 잘못하고 있습니까?
parent="@android:style/Widget.Button"
parent
는 조금 바뀌지 않았습니다. 그래서 방금 inflate
솔루션을 진행했습니다.
new Button(new ContextThemeWrapper(context, R.style.TabButton), null, 0)
. 그렇지 않으면 기본 버튼 스타일이 적용되고이 스타일은 ContextThemeWrapper를 통해 테마에 병합 한 버튼 스타일을 재정의합니다.
생성자에서 스타일을 설정할 수 있습니다 (그러나 스타일은 동적으로 변경 / 설정할 수 없습니다).
View(Context, AttributeSet, int)
( int
현재 테마에서 스타일에 대한 참조를 포함하는 속성입니다)
int 매개 변수 defStyleAttr
는 스타일을 지정하지 않습니다. 안드로이드 문서에서 :
defStyleAttr- 보기의 기본값을 제공하는 스타일 자원에 대한 참조를 포함하는 현재 테마의 속성입니다. 기본값을 찾지 않으려면 0 일 수 있습니다.
View 생성자에서 스타일을 설정하려면 두 가지 가능한 솔루션이 있습니다.
ContextThemeWrapper를 사용하여 :
ContextThemeWrapper wrappedContext = new ContextThemeWrapper(yourContext, R.style.your_style);
TextView textView = new TextView(wrappedContext, null, 0);
인수가 4 개인 생성자 (LOLLIPOP에서 사용 가능) :
TextView textView = new TextView(yourContext, null, 0, R.style.your_style);
두 솔루션의 핵심 사항 - defStyleAttr
뷰에 스타일을 적용하려면 매개 변수가 0이어야합니다.
동적으로 스타일 변경은 지원되지 않습니다 (아직). XML을 통해보기를 작성 하기 전에 스타일을 설정 해야 합니다.
받아 들인 대답은 나를 위해 훌륭한 해결책이었습니다. 추가해야 할 유일한 것은 inflate()
방법 에 관한 것입니다.
수락 된 답변에서 모든 android:layout_*
매개 변수가 적용되지 않습니다.
이유는 조정 방법이 없으므로 원인 null
은로 전달되었습니다 ViewGroup parent
.
다음과 같이 사용할 수 있습니다.
View view = inflater.inflate(R.layout.view, parent, false);
그리고는 parent
이다 ViewGroup
조정할 좋아하는 곳에서, android:layout_*
.
이 경우 모든 상대 속성이 설정됩니다.
누군가에게 도움이되기를 바랍니다.
나도 문제를 만났고 프로그래밍 방식으로 스타일을 설정하는 방법을 찾았습니다. 어쩌면 당신은 모두 그것을 필요로 할 것입니다.
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);
프로그래밍 방식으로 생성 된 뷰는 테마에서 지정된 스타일을 사용합니다.
시도해 볼 수 있으며 완벽하게 작동하기를 바랍니다.