265

XML は次のとおりです。

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    style="@style/LightStyle"
    android:layout_width="fill_parent"
    android:layout_height="55dip"
    android:clickable="true"
    android:orientation="horizontal" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal" />

</RelativeLayout>

styleプログラムで属性を設定するには?

4

16 に答える 16

253

技術的には、とにかくカスタム ビューを使用して、プログラムでスタイルを適用できます。

private MyRelativeLayout extends RelativeLayout {
  public MyRelativeLayout(Context context) {
     super(context, null, R.style.LightStyle);
  }
}

引数が 1 つのコンストラクターは、ビューをプログラムでインスタンス化するときに使用されるコンストラクターです。

したがって、このコンストラクターを、スタイル パラメーターを受け取るスーパーにチェーンします。

RelativeLayout someLayout = new MyRelativeLayout(new ContextThemeWrapper(this,R.style.RadioButton));

または@Doriが単に指摘したように:

RelativeLayout someLayout = new RelativeLayout(new ContextThemeWrapper(activity,R.style.LightStyle));

今Kotlinで:

class MyRelativeLayout @JvmOverloads constructor(
    context: Context, 
    attributeSet: AttributeSet? = null, 
    defStyleAttr: Int = R.style.LightStyle,
) : RelativeLayout(context, attributeSet, defStyleAttr)

また

 val rl = RelativeLayout(ContextThemeWrapper(activity, R.style.LightStyle))
于 2014-01-10T11:38:10.523 に答える
93

更新: この質問に回答した時点 (2012 年半ば、API レベル 14-15) では、ビューをプログラムで設定することはオプションではありませんでした (重要な回避策がいくつかありましたが)。これは、より最近の API の後に可能になりました。リリースします。詳細については、@ Blundell の回答を参照してください。

古い回答:

ビューのスタイルをプログラムで設定することはまだできませんが、このスレッド役立つ場合があります。

于 2012-07-30T14:54:31.710 に答える
13

これはかなり古い質問ですが、現在私にとってうまくいった解決策は、コンストラクターの4番目のパラメーターを使用することdefStyleResです-可能な場合..ビューで...スタイルを設定します

私の目的(kotlin)のために以下の作品:

val textView = TextView(context, null, 0, R.style.Headline1)
于 2019-11-28T15:18:18.973 に答える
6

提供された回答はどれも正しくありません。

プログラムでスタイルを設定できます。

簡単な答えはhttp://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/content/Context.java#435を見てください

長い答え。カスタム定義スタイルをプログラムでビューに設定するための私のスニペットは次のとおりです。

1) styles.xml ファイルでスタイルを作成します

 <style name="MyStyle">
    <item name="customTextColor">#39445B</item>
    <item name="customDividerColor">#8D5AA8</item>
</style>

attrs.xml ファイルでカスタム属性を定義することを忘れないでください

私のattrsl.xmlファイル:

<declare-styleable name="CustomWidget">
    <attr name="customTextColor" format="color" />
    <attr name="customDividerColor" format="color" />
</declare-styleable>

スタイル可能 (私の CustomWidget) には任意の名前を使用できることに注意してください

次に、スタイルをプログラムでウィジェットに設定しましょう ここに私の単純なウィジェットがあります:

public class StyleableWidget extends LinearLayout {

private final StyleLoader styleLoader = new StyleLoader();

private TextView textView;
private View divider;

public StyleableWidget(Context context) {
    super(context);
    init();
}

private void init() {
    inflate(getContext(), R.layout.widget_styleable, this);
    textView = (TextView) findViewById(R.id.text_view);
    divider = findViewById(R.id.divider);
    setOrientation(VERTICAL);
}

protected void apply(StyleLoader.StyleAttrs styleAttrs) {
    textView.setTextColor(styleAttrs.textColor);
    divider.setBackgroundColor(styleAttrs.dividerColor);
}

public void setStyle(@StyleRes int style) {
    apply(styleLoader.load(getContext(), style));
}
}

レイアウト:

<TextView
    android:id="@+id/text_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="22sp"
    android:layout_gravity="center"
    android:text="@string/styleble_title" />

<View
    android:id="@+id/divider"
    android:layout_width="match_parent"
    android:layout_height="1dp"/>

</merge>

そして最後に StyleLoader クラスの実装

public class StyleLoader {

public StyleLoader() {

}

public static class StyleAttrs {
    public int textColor;
    public int dividerColor;
}

public StyleAttrs load(Context context, @StyleRes int styleResId) {
    final TypedArray styledAttributes = context.obtainStyledAttributes(styleResId, R.styleable.CustomWidget);
    return load(styledAttributes);
}

@NonNull
private StyleAttrs load(TypedArray styledAttributes) {
    StyleAttrs styleAttrs = new StyleAttrs();
    try {
        styleAttrs.textColor = styledAttributes.getColor(R.styleable.CustomWidget_customTextColor, 0);
        styleAttrs.dividerColor = styledAttributes.getColor(R.styleable.CustomWidget_customDividerColor, 0);
    } finally {
        styledAttributes.recycle();
    }
    return styleAttrs;
}
}

https://github.com/Defuera/SetStylableProgramaticallyで完全に機能する例を見つけることができます

于 2015-12-22T10:49:15.073 に答える
2

これを行うため、ContextThemeWrapper を使用することは提案しません。

指定されたテーマは、基本コンテキストのテーマの上に適用されます。

アプリケーションで望ましくない結果をもたらす可能性があるもの。代わりに、Airbnb のエンジニアから新しいライブラリ「paris」を提案します。

https://github.com/airbnb/paris

プログラムでスタイルを定義し、Android ビューに適用します。

しかし、しばらく使用した後、実際にはかなり制限されていることがわかり、すぐに必要な多くのプロパティをサポートしていないため、使用をやめました。いつものようにチェックして決定する必要があります.

于 2018-11-13T18:47:11.717 に答える
-1

複合ViewGroupでXMLで定義されたビューを使用し、Viewgroupに追加して膨らませました。この方法では、スタイルを動的に変更することはできませんが、スタイルをカスタマイズすることはできます。私のコンポジット:

public class CalendarView extends LinearLayout {

private GridView mCalendarGrid;
private LinearLayout mActiveCalendars;

private CalendarAdapter calendarAdapter;

public CalendarView(Context context) {
    super(context);

}

public CalendarView(Context context, AttributeSet attrs) {
    super(context, attrs);

}

@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    init();
}

private void init() {
    mCalendarGrid = (GridView) findViewById(R.id.calendarContents);
    mCalendarGrid.setNumColumns(CalendarAdapter.NUM_COLS);

    calendarAdapter = new CalendarAdapter(getContext());
    mCalendarGrid.setAdapter(calendarAdapter);
    mActiveCalendars = (LinearLayout) findViewById(R.id.calendarFooter);
}

}

スタイルを割り当てることができるxmlの私のビュー:

<com.mfitbs.android.calendar.CalendarView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/calendar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:orientation="vertical"
>

<GridView
    android:id="@+id/calendarContents"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

<LinearLayout
    android:id="@+id/calendarFooter"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    />

于 2014-09-08T11:27:58.023 に答える
-6

目的のスタイルでレイアウトを含む xml を作成し、ビューの背景リソースを次のように変更できます

于 2012-07-30T14:58:55.680 に答える