web-dev-qa-db-ja.com

コードでアンドロイドセットスタイル

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

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

しかし、これを行うと、テキストビューはスタイルをとるようには見えません(スタイルを静的オブジェクトに設定することで検証しました)。

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

237
Ben

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

お役に立てれば。

309
Dan Kilpatrick

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

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

編集:thisコンテキストを参照しています

116
Shahul3D

このように ContextThemeWrapper をコンストラクタに渡すことができます。

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

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

View(Context, AttributeSet, int)intはスタイルリソースです)

Romain Guyからの回答

参考

16
Dandre Allison

パラメータ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にする必要があります。

8
DmitryArc

動的にスタイルを変更することは(まだ)サポートされていません。あなたはスタイルを設定する必要があります前にビューはXMLを通して作成されます。

5
Chris Cashwell

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

承認された回答では、すべてのAndroid:layout_*パラメータは適用されません。

その理由はそれを調整する方法がないためです。nullViewGroup parentとして渡されました。

あなたはこのようにそれを使うことができます:

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

そしてparentは、Android:layout_*を調整したい場所のViewGroupです。

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

誰かに役立つことを願っています。

2
Anor

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

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

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

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

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

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

1
mrtwo

私はEditTextでテストしただけですが、あなたはメソッドを使うことができます

public void setBackgroundResource(int resid)

xMLファイルで定義されているスタイルを適用します。

このメソッドはViewに属しているので、私はそれがどんなUI要素でもうまくいくと信じています。

よろしくお願いします。

0
floydaddict