私はこのようなスタイルでTextViewコンストラクタを使用しようとしています:
TextView myText = new TextView(MyActivity.this, null, R.style.my_style );
しかし、これを行うと、テキストビューはスタイルをとるようには見えません(スタイルを静的オブジェクトに設定することで検証しました)。
私もmyText.setTextAppearance(MyActivity.this, R.style.my_style)
を使ってみましたが、それもうまくいきません
私はあなたがプログラム的にスタイルを設定できるとは思わない。これを回避するには、スタイルを割り当てたテンプレートレイアウトxmlファイルを作成します。たとえば、res/layout create 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);
編集:thisコンテキストを参照しています
このように ContextThemeWrapper をコンストラクタに渡すことができます。
TextView myText = new TextView(new ContextThemeWrapper(MyActivity.this, R.style.my_style));
あなたはコンストラクタでスタイルを設定することができます(しかしスタイルは動的に変更/設定することはできません)。
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
は、Android:layout_*
を調整したい場所のViewGroup
です。
この場合、すべての相対プロパティが設定されます。
誰かに役立つことを願っています。
スタイルの継承(またはイベントのスタイル設定可能な属性)を使用する可能性のあるカスタムビューを使用する場合は、スタイルを失わないように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);
プログラム的に作成されたビューは、テーマで指定されたスタイルを使用します。
あなたは試してみることができます、そしてそれがあなたのために完璧に機能することを望みます。
私はEditTextでテストしただけですが、あなたはメソッドを使うことができます
public void setBackgroundResource(int resid)
xMLファイルで定義されているスタイルを適用します。
このメソッドはViewに属しているので、私はそれがどんなUI要素でもうまくいくと信じています。
よろしくお願いします。