プログラムでTextViewのスタイルを設定する


249

私はTextViewこのようなスタイルでコンストラクタを使用しようとしています:

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

ただし、これを行うと、テキストビューにスタイルが適用されていないように見えます(静的オブジェクトに設定してスタイルを確認しました)。

私も使ってみましたが、うまくいきmyText.setTextAppearance(MyActivity.this, R.style.my_style)ません。

回答:


318

プログラムでスタイルを設定できるとは思いません。これを回避するには、スタイルが割り当てられたテンプレートレイアウト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);

お役に立てれば。


1
これがDandre Allisonの答えに勝るところは、API v11を必要としないことです。
Martin Capodici 2014年

2
うまくいったかもしれませんが、これは意味がありません。どうすればxmlファイルで設定できますか?プログラムではない場合。xmlファイルを使用しない理由はいくつかあります。そのうちの1つは、UIを構築するためのコードの記述に慣れているためです。メモリが限られているため、新しい方法を学びたくありません。他のもの。
Iharob Al Asimi 2015

@IharobAlAsimiそうです。すべてのことはプログラムで実行でき、LayoutInflaterはXMLをオブジェクトに変換することに関するすべてを知っています。残念なことに、そのような多くのものはプライベートAPIの下に隠されており、いくつかのオブジェクトを作成する唯一の方法は、コンストラクターにAttributeSetを提供することです。
Miha_x64

他のすべての回答とは異なり、これはスピナーで実際に機能したので、ゴールドスターになります
Rowan Berry

121

一般的なスタイルを作成して、以下のような複数のテキストビューで再利用できます。

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

編集:これはコンテキストを指します


50
あなたのすべての行動がテキストの「スタイル」を模索している限り、あなたの答えは機能します。パディングやマージンの追加など、TextViewに対して他のことを実行しようとしている場合は機能しません。だから、私はあなたが間違っていると言っているわけではありませんが、あなたの答えは限られています。実行時にビューを拡張することは、包括的なスタイルを適用する唯一の方法です。
Bill Mote

1
インフレートされたテンプレートの使用とsetTextAppearanceの使用の両方の解決策は合理的です。2番目のソリューションのパディング/マージンの問題に対処するには、textView.setLayoutParams(layoutParams)を呼び出すことができます
AlanKley

このメソッドはAPIレベル23で廃止されました。API23以降では、代わりにsetTextAppearance(int)を使用してください。
セルギ

バージョンが少なくとも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. 14年

@AlaksiejN。このようなWidget.Buttonスタイルから継承する必要がありますparent="@android:style/Widget.Button"
maxcanna

@maxcanna何らかの理由で、追加parentしても少しは変わりませんでした。だから私はinflate解決策を先に進めました。
Aleks N. 14年

11
@AliakseiN。たとえば、3引数のコンストラクタを使用する必要がありますnew Button(new ContextThemeWrapper(context, R.style.TabButton), null, 0)。それ以外の場合は、デフォルトのボタンスタイルが適用され、このスタイルは、ContextThemeWrapperを介してテーマにマージしたボタンスタイルをオーバーライドします。
Newtonx、2015

17

コンストラクターでスタイルを設定できます(ただし、スタイルを動的に変更/設定することはできません)。

View(Context, AttributeSet, int)(これintは、スタイルへの参照を含む現在のテーマの属性です)

Romain Guyからの回答

参照


あなたの答えは誤解を招くものです-このスレッドを最後まで読んでみましたか?
および

3
それはどのように誤解を招くのですか?Romain Guyはスタイルをプログラムで「設定」できると明示的に言っているため、受け入れられた答えは誤解を招くものです。動的に変更する機能はありません。このスレッドはそれが事実だとは思わないようです。
Dandre Allison 2013

1
この呼び出しは、APIレベル11を必要とし、用心
マーティンCapodici

1
@PaulVerestそれは引用ではありません。
Dandre Allison 2014

6
最後のintはスタイルリソースではありません。これは、「ビューのデフォルト値を提供するスタイルリソースへの参照を含む現在のテーマの属性」です。
rve

11

パラメータint defStyleAttrはスタイルを指定しません。Androidのドキュメントから:

defStyleAttr-ビューのデフォルト値を提供するスタイルリソースへの参照を含む現在のテーマの属性。デフォルトを検索しない場合は、0にすることができます。

Viewコンストラクターでスタイルを設定するには、2つの可能な解決策があります。

  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、2012年

3

受け入れられた答えは私にとって素晴らしい解決策でした。追加する唯一のものは約ですinflate()メソッド。

受け入れられた答えすべて android:layout_*パラメータは適用されません。

理由はそれを調整する方法がない、原因nullはとして渡されましたViewGroup parent

次のように使用できます。

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

parentは、ViewGroupあなたが調整したいところからですandroid:layout_*

この場合、すべての相対プロパティが設定されます。

それが誰かのために役立つことを願っています。


2

スタイルの継承(またはイベントのスタイル設定可能な属性)を使用する可能性のあるカスタムビューを使用する場合、スタイルを失わないように2番目のコンストラクターを変更する必要があります。これは私のために機能し、setTextAppearence()を使用する必要はありません:

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

2

私も問題に出会い、スタイルをプログラムで設定する方法を見つけました。多分あなたはそれが必要なので、そこで更新します。

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

プログラムで作成されたビューは、テーマで指定されたスタイルを使用します。

あなたは試してみることができ、それがあなたのために完全に機能することを願っています。


0

EditTextでテストしただけですが、メソッドを使用できます

public void setBackgroundResource(int resid)

XMLファイルで定義されたスタイルを適用します。

このメソッドはビューに属しているので、どのUI要素でも機能すると思います。

よろしく。


ドキュメントによるとこれはスタイルではなくドローアブルでのみ機能するはずです。したがって、これが本当に機能する場合、それは「偶然」に過ぎず、それに依存すべきではありません。
ハインツィ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.