2012-05-04 2 views
0

Можно ли изменить цвет прямоугольника (нарисован в xml) в коде 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(). Но когда я нажимаю кнопку, когда приложение работает, цвет не меняется. Какие-либо предложения?

+1

Если любой из приведенных ниже ответов решает вашу проблему или поможет вам ее решить, вы должны нажать галочку рядом с этим ответом, чтобы отметить ее как принятый ответ и дать автору кредит для нее. – Barak

ответ

0

Вы можете поместить этот код в отдельный метод, и этот метод можно вызывать из OnClick кнопки ..

2

Используется этот код и он работал, в качестве альтернативы рассмотреть перерисовки viewrectangle с помощью viewrectangle.invalidate(), но она не должна быть nescarry:

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"/> 
0

Вы можете попробовать Colo r фильтр. Я использовал его раньше, чтобы изменить цвет кнопок (обратите внимание, что они начинаются как стандартные серые), если вы начинаете с другого цвета, это может быть совсем другой результат. Во всяком случае, пример того, как я сделал это:

Импорт 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(); 
    } 
Смежные вопросы