2

ループでインスタンス化するカスタム コンポーネントがあり、それらすべてに同じスタイルを適用する必要があります。これはカスタム コンポーネント (具体的には LinearLayout のサブクラス) であるため、コンポーネントのレイアウト XML のルート タグがマージであるため、XML にスタイル属性を設定することはできません (ビュー階層が狂ってしまうのを防ぐため)。私はこれを見つけました:

style.xml から AttributeSet を作成するにはどうすればよいですか?

これは私の問題をほぼ正確に説明しています。答えだけが役に立たない - 私の R.java は新鮮で、スタイルはそこにあります。getResources().getXml(R.style.my_style) が /res/values/styles.xml ファイルを実際に見ていないことが問題だと思いますか?

私は Scala を使用しているため、構文は少し... より優れています。私のコンポーネント:

class MyLinearLayout(object : MyDatabaseObject, context : Context, attrs : AttributeSet = null) 
        extends LinearLayout(context, attrs) {
    // Shows and interacts with the data in object
}

アクティビティで:

val componentStyle = Xml.asAttributeSet(getResources.getXml(R.style.my_style))
for (obj <- dbResults) viewGroup.addView(new MyLinearLayout(obj, this, componentStyle))

そして、その最初の行で Resources.NotFoundException がスローされます。スタイル自体は残りの部分と一緒に res/values/styles.xml にあり、さまざまなアクティビティで LinearLayouts に適用されるため、問題はありません。

4

1 に答える 1

2

残念ながら、参照を使用してプログラムでビューのスタイルを設定する方法はありませんR.style.your_style。これを確認する SO 投稿が多数ありますが、スタイルが適用された xml レイアウトまたはドローアブル ファイルを作成することによる回避策があります。すべてのコンポーネントが同じ目的の属性を使用して同じ方法で作成されているため、これはあなたの状況でうまくいくと思います(drawable/custom_viewにあるとしましょう:

<?xml version="1.0" encoding="utf-8"?>
<com.your.CustomView xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="pick_your_width"
   android:layout_height="pick_your_height"
   style="@style/your_style" />

カスタムビューを追加するときは、次を使用します。

CustomView newView = (CustomView)getLayoutInflater().inflate(R.drawable.custom_view, null);

申し訳ありませんが、これはあなたの状況に最適ではありませんが、Java を台無しにすることなく、カスタム ビューに 1 つのスタイルを系統的に適用するために私が見つけた最良の解決策です。ここにある解決策に基づいています。

于 2012-08-29T18:38:05.163 に答える