0

私はこのようなlayout.xmlを介して定義されたいくつかのボタンを含むアプリケーションに取り組んでいます

<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/largebutton" >
</Button>

@ drawable/largebuttonは次のようになります

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true" >
        <shape>
            <gradient android:startColor="@color/menu_button_active_start" android:endColor="@color/menu_button_active_end" android:angle="270" />
            <stroke android:width="@dimen/largebutton_stroke" android:color="@color/menu_button_stroke" />
            <corners android:radius="@dimen/largebutton_radius" />
            <padding android:left="@dimen/largebutton_padding_leftright" android:top="@dimen/largebutton_padding_topbottom" android:right="@dimen/largebutton_padding_leftright" android:bottom="@dimen/largebutton_padding_topbottom" />
        </shape>
    </item>

    <item android:state_focused="true" >
        <shape>
            <gradient android:startColor="@color/menu_button_focused_start" android:endColor="@color/menu_button_focused_end" android:angle="270" />
            <stroke android:width="@dimen/largebutton_stroke" android:color="@color/menu_button_focused_stroke" />
            <corners android:radius="@dimen/largebutton_radius" />
            <padding android:left="@dimen/largebutton_padding_leftright" android:top="@dimen/largebutton_padding_topbottom" android:right="@dimen/largebutton_padding_leftright" android:bottom="@dimen/largebutton_padding_topbottom" />
        </shape>
    </item>
 .....
</selector>

異なる状態のグラデーションカラーを除いて、パディング、ストローク、半径などのすべてのプロパティは同じです。私の問題は、私のアプリケーションがより多くのスタイルを持たなければならないということです。色のリストがあり、1つのアプリケーションを選択すると、すべての色が選択した色に変わるので、想像できます。したがって、20色の場合、20の異なるxmlは正しい方法ではありません。

すべてのandroid:statesのstartColor値とendColor値の両方がWebからダウンロードされ、DBに保存されますが、それらがいくつあるかはわかりません。

この動作を実現する方法はありますか?私はすべてのフォーラムを検索しましたが、ほとんどの回答は不可能であるというものでした。私はcolors.xmlを上書きする1つの「解決策」を見つけましたが、それは私にとって最良の解決策ではないようです。

だから私の質問は、colors.xmlの色を動的に変更できますか?このようなもの

List<Colors> colors = downloadColorsFromWeb();

Button b = new Button;
b.setDrawable(drawable.with(colors));

よろしくお願いします。

nosko。

4

2 に答える 2

0

ダウンロードする色ごとに、おそらく動的にドローアブルを生成できます。GradientDrawableクラスを確認してください。初期化中に開始/終了の色を指定し、その後、ストロークとコーナーの半径のプロパティを設定できると思います。ただし、パディングについては自分で確認する必要があります。私はわかりません。

ドローアブルを作成したら、ボタンので使用できますsetBackgroundDrawable

編集:おそらくボタンのパディングを設定することでうまくいくでしょう

edit2:setStateドローアブルにすることはできますが、ボタンの状態ごとに異なる背景ドローアブルを設定する方法がわかりません。

于 2012-06-13T15:06:34.310 に答える
0

@ stan0に返信していただき、ありがとうございます。特にGradientDrawableクラスに大いに役立ちました。

ボタンを作成し、その状態に応じてスタイルを設定できる簡単なクラスを作成しました。多分それは誰かに役立ちます:)

import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.GradientDrawable.Orientation;
import android.util.AttributeSet;
import android.widget.Button;

/**
 * @author nosko
 *
 */
public class TabButton extends Button {

    private Context c;
    private GradientDrawable selected, focused, pressed, normal;

    public void setNormalState(GradientDrawable gd) {
        this.normal = gd;
    }

    public void setSelectedState(GradientDrawable gd) {
        this.selected = gd;
    }

    public void setFocusedState(GradientDrawable gd) {
        this.focused = gd;
    }

    public void setPressedState(GradientDrawable gd) {
        this.pressed = gd;
    }

    public TabButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub

        selected = pressed = focused = normal = new GradientDrawable(Orientation.TOP_BOTTOM, new int[] { Color.WHITE, Color.DKGRAY });

        this.c          = context;
        this.setPadding(8, 8, 8, 8);        
    }


    /**
     * Change colors when button's state changes
     */
    protected void drawableStateChanged() {

        normal.setCornerRadius(8);
        normal.setStroke(2, Color.parseColor(c.getResources().getString(R.color.tab_button_border)));
        normal.setShape(GradientDrawable.RECTANGLE);
        this.setBackgroundDrawable(normal);

        if (isSelected()) {

            selected.setCornerRadius(8);
            selected.setStroke(2, Color.parseColor(c.getResources().getString(R.color.tab_button_border)));
            selected.setShape(GradientDrawable.RECTANGLE);
            this.setBackgroundDrawable(selected);
        }

        if (isFocused()) {
            focused.setCornerRadius(8);
            focused.setStroke(2, Color.parseColor(c.getResources().getString(R.color.tab_button_border)));
            focused.setShape(GradientDrawable.RECTANGLE);
            this.setBackgroundDrawable(focused);
        }

        if (isPressed()) {
            pressed.setCornerRadius(8);
            pressed.setStroke(2, Color.parseColor(c.getResources().getString(R.color.tab_button_border)));
            pressed.setShape(GradientDrawable.RECTANGLE);
            this.setBackgroundDrawable(pressed);
        }
    }

}

このように使用します

TabButton b = new TabButton(context, null);

b.setNormalState(new GradientDrawable(Orientation.TOP_BOTTOM, new int[] { Color.RED, Color.CYAN }));
b.setSelectedState(new GradientDrawable(Orientation.TOP_BOTTOM, new int[] { Color.YELLOW, Color.BLUE }));
b.setFocusedState(new GradientDrawable(Orientation.TOP_BOTTOM, new int[] { Color.YELLOW, Color.GREEN }));
b.setPressedState(new GradientDrawable(Orientation.TOP_BOTTOM, new int[] { Color.YELLOW, Color.BLACK }));
于 2012-06-14T12:47:03.077 に答える