2011-09-21 8 views
6

プログラムでこの方法を行う方法が見つかりませんでしたので、ここでこの質問を投稿しています(この質問に関連する質問は見つかりませんでした)。プログラムでスタイルリソースを適用する

私はres/values/styles.xmlで定義されたリソーススタイルを持っています。私がしようとしているのは、私が操作しているViewオブジェクトにjavaを使って、このスタイルを自分のアクティビティに適用することです。

Androidでこれを実現することは可能ですか、スタイルはandroid:style属性を使用してオブジェクトにのみ適用できますか?

答えて

3

いいえ、既存のViewインスタンスにスタイルリソースを一般的に適用することはできません。スタイルリソースは、構築時にビューにのみ適用できます。

理由を理解するには、View(Context context, AttributeSet attrs, int defStyle)コンストラクタを調べます。これは、中央のView属性(android:backgroundなど)が読み込まれる唯一の場所であるため、Viewの作成後にスタイルを適用する方法はありません。同じパターンが、TextViewのようなViewのサブクラスに使用されます。 setterを使用してスタイル属性を手動で適用する必要があります。

ビューをプログラマ的にインスタンス化する場合は、defStyleコンストラクタパラメータで任意のスタイルリソースを使用できます。

+0

私はプログラムでビューをインスタンス化していません。そのカスタムビューは私がLinearLayoutを拡張して作成しました...私は代わりにユーザーがstyle = "@ style/..."を使用させるようにしたいと思いますが、私はプログラムでスタイルを適用したいと思いますが、この既存のスタイルから属性によってプログラムで属性を適用します。 – Thiago

+0

"ビューをプログラマ的にインスタンス化する場合は、defStyleコンストラクタパラメータで任意のスタイルリソースを使用できます。 これを実行しましたか? 私は問題を抱えていて、これを見つけて検索しました。 http://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&group==sort=&id=12683 – sadaf

2

これは不可能です。/res /ディレクトリから何かにアクセスするために通常使用するクラスResourcesは、スタイルを取得するためのサポートを持っていません。 http://developer.android.com/reference/android/content/res/Resources.html

- UPDATE -

私は完全に右ではなかったここで言いました。 View(Context context, AttributeSet attrs, int defStyle)ともcrnvは、いくつかのViewの実装は、少なくともこれはsetTextAppearance(context, resid)メソッドを使用して可能であるTextViewのため

2

のために言うように:あなたはこのようViewオブジェクトのコンストラクタでスタイルを与えることができます。このスタイルのresIdは、R.style.にあります。

+0

実際、私はビュー全体のスタイルを適用する必要があります。例えば、LinearLayoutやRelativeLayoutです。 – Thiago

+0

ビューを作成した後ではビューを変更することはできませんが、Viewクラスのコンストラクタにカスタムスタイルを指定することができます。 [link](http://groups.google.com/group/android-developers/browse_thread/thread/88c53b8c790a750d) – crnv

5

この回答はhereと共有されていますが、これは独自の会話スレッドを持っているため、ここでも関連性があります。

この問題の解決策は1つではありませんが、これは私の使用例ではうまくいきました。問題は、 'View(context、attrs、defStyle)'コンストラクタが実際のスタイルを参照していないことです。属性が必要です。そこで、我々は以下となります。

  1. あなたは
  2. が私たちのテーマにその属性のスタイルを適用します
  3. その属性
  4. で私たちのビューの新しいインスタンスを作成して使用するスタイルを作成し、属性
  5. を定義します

で 'RES /値/ attrs.xml'、新しい属性を定義:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <attr name="customTextViewStyle" format="reference"/> 
    ... 
</resources>  
をRES /値/のstyles.xmlに

は、 '私は私が私のカスタムのTextViewに使用するスタイルを作成するつもりです

<style name="CustomTextView"> 
    <item name="android:textSize">18sp</item> 
    <item name="android:textColor">@color/white</item> 
    <item name="android:paddingLeft">14dp</item> 
</style> 

で 'RES /値/ themes.xml' または' のres /値/スタイル。XML」、アプリケーション/活動のテーマを変更し、次のスタイルを追加します。

<resources> 
    <style name="AppBaseTheme" parent="android:Theme.Light"> 
     <item name="@attr/customTextViewStyle">@style/CustomTextView</item> 
    </style> 
    ... 
</resources> 

最後に、カスタムのTextViewに、あなたは今、属性を持つコンストラクタを使用することができ、それがあなたのスタイル

public class CustomTextView extends TextView { 

    public CustomTextView(Context context) { 
     super(context, null, R.attr.customTextView); 
    } 
} 
を受け取ることになります

異なるバリアントや異なる場所でcustomTextViewを繰り返し使用していましたが、ビューの名前がスタイルや属性などと一致する必要はありません。また、このテクニックは、TextViewsだけでなく、カスタムビューでも機能するはずです。

関連する問題