0

アプリの実行中に Java コードで長方形 (xml で描画) の色を変更することは可能ですか?

私のrectangle.xml:

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/listview_background_shape">
    <stroke android:width="2dp" android:color="#ffffff" />
    <padding android:left="20dp"
        android:top="20dp"
        android:right="20dp"
        android:bottom="20dp" />

    <solid android:color="#006600" />
</shape>

次によって main.xml に描画されます。

<View
    android:id="@+id/myRectangleView"
    android:layout_width="wrap_content"
    android:layout_height="100dp"
    android:background="@drawable/rectangle"/>

私はこの方法を試しました:

   GradientDrawable sd;
    View viewrectangle;
    viewrectangle = (View) findViewById(R.id.myRectangleView);
    sd = (GradientDrawable) viewrectangle.getBackground();
    sd.setColor(0xffffff00);
    sd.invalidateSelf();

OnCreate メソッド内に配置した場合にのみ機能します。

ボタンごとに四角形の色を変えたいので、このコードをボタンの onClick() メソッドの中に入れます。しかし、アプリの実行中にボタンをクリックしても、色は変わりません。助言がありますか?

4

3 に答える 3

2

このコードを使用するとうまくいきました。代わりに、viewrectangle.invalidate() を使用して viewrectangle を再描画することを検討してください。

View viewrectangle;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    viewrectangle = (View) findViewById(R.id.myRectangleView);

}

public void doClick(View v) {
    GradientDrawable sd = (GradientDrawable) viewrectangle.getBackground();
    sd.setColor(0xffffff00);
    sd.invalidateSelf();
}

この例では、"doClick()" メソッドが main.xml に設定されています。

<Button android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:text="Button"
        android:onClick="doClick"/>
于 2012-05-04T11:59:13.263 に答える
0

カラーフィルターを試すことができます。ボタンの色を変更するために以前に使用したことがあります (最初は標準の灰色であったことに注意してください)。別の色で開始すると、非常に異なる結果になる可能性があります。とにかく、私がそれをした方法の例:

PorterDuff グラフィックスをインポートします。

import android.graphics.PorterDuff;

クラスで、カラー フィルターを適用するアイテムを定義し、フィルターを設定します。

Button atdButton = (Button) convertView.findViewById(R.id.attendbutton);

    if (atdState[position].equals("P")) {
        atdButton.getBackground().setColorFilter(0xFF00FF00,  // Set filter to green
                PorterDuff.Mode.MULTIPLY);
    } else if (atdState[position].equals("T")) {
        atdButton.getBackground().setColorFilter(0xFFFFFF00,  // Set filter to yellow
                PorterDuff.Mode.MULTIPLY);
    } else if (atdState[position].equals("E")) {
        atdButton.getBackground().setColorFilter(0xFFFF6600,  // Set filter to orange
                PorterDuff.Mode.MULTIPLY);
    } else if (atdState[position].equals("U")) {
        atdButton.getBackground().setColorFilter(0xFFFF0000,  // Set filter to red
                PorterDuff.Mode.MULTIPLY);
    } else {
        atdButton.getBackground().clearColorFilter();
    }
于 2012-05-04T12:02:40.343 に答える
0

このコードを別のメソッドに配置し、そのメソッドをボタンの onClick から呼び出すことができます。

于 2012-05-04T11:36:34.037 に答える