回答:
プログラムでスタイルを設定できるとは思いません。これを回避するには、スタイルが割り当てられたテンプレートレイアウトxmlファイルを作成します。たとえば、res / layoutで次のコンテンツのようにtvtemplate.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
はスタイルを指定しません。Androidのドキュメントから:
defStyleAttr-ビューのデフォルト値を提供するスタイルリソースへの参照を含む現在のテーマの属性。デフォルトを検索しない場合は、0にすることができます。
Viewコンストラクターでスタイルを設定するには、2つの可能な解決策があります。
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_*
。
この場合、すべての相対プロパティが設定されます。
それが誰かのために役立つことを願っています。
スタイルの継承(またはイベントのスタイル設定可能な属性)を使用する可能性のあるカスタムビューを使用する場合、スタイルを失わないように2番目のコンストラクターを変更する必要があります。これは私のために機能し、setTextAppearence()を使用する必要はありません:
public CustomView(Context context, AttributeSet attrs) {
this(context, attrs, attrs.getStyleAttribute());
}
私も問題に出会い、スタイルをプログラムで設定する方法を見つけました。多分あなたはそれが必要なので、そこで更新します。
Viewコンストラクターの3番目のパラメーターは、テーマのタイプの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);
プログラムで作成されたビューは、テーマで指定されたスタイルを使用します。
あなたは試してみることができ、それがあなたのために完全に機能することを願っています。