2

Я сделал обычную многоуровневую растягиваемую, чтобы действовать как фон для кнопки. Иногда я хочу, чтобы часть этого рисованного слоя была синей. Иногда я хочу, чтобы он был зеленым. Точка - это переменная, и я хочу, чтобы она была определена в соответствующем XML-представлении.Как настроить пользовательскую выгрузку, определенную в XML во время выполнения?

Возможно ли это? Как написать drawable в XML, значение которого я могу определить во время выполнения?

custom_button.xml

<?xml version="1.0" encoding="utf-8"?> 
<inset xmlns:android="http://schemas.android.com/apk/res/android" 
    android:insetLeft="@dimen/button_inset_horizontal_material" 
    android:insetTop="@dimen/button_inset_vertical_material" 
    android:insetRight="@dimen/button_inset_horizontal_material" 
    android:insetBottom="@dimen/button_inset_vertical_material"> 
    <shape android:shape="rectangle"> 
     <corners android:radius="@dimen/control_corner_material" /> 
     <solid android:color="?attr/colorButtonNormal" /> 
     <padding android:left="@dimen/button_padding_horizontal_material" 
      android:top="@dimen/button_padding_vertical_material" 
      android:right="@dimen/button_padding_horizontal_material" 
      android:bottom="@dimen/button_padding_vertical_material" /> 
    </shape> 
</inset> 

Линия <solid android:color="?attr/colorButtonNormal" /> является то, что я хочу, чтобы установить во время выполнения. У меня есть собственное пользовательское представление для этого класса, уже получающего значение цвета, которое я хочу использовать здесь, - как применить его к XML этого drawable?

+0

Не знаю, есть ли способ изменить пользовательскую логику программно во время выполнения. Вам просто нужно создать два файла custom_button.xml и выбрать их соответствующим образом, когда вы захотите один за другим. –

+0

@JaySnayder Я на самом деле пытаюсь создать библиотеку для пользовательского представления кнопок, что позволяет мне легко изменить значение, используемое в этом drawable. – ZakTaccardi

+0

Извлечение фигуры в растягиваемое и, возможно, тогда вы можете ее изменить: http://stackoverflow.com/questions/7164630/how-to-change-shape-color-dynamica –

ответ

3

Как это:

InsetDrawable drawable = (InsetDrawable) myButton.getBackground(); 
GradientDrawable shape = (GradientDrawable) drawable.getDrawable(); 
shape.setColor(Color.BLUE); 

Я сделал пользовательский многослойную Drawable действовать в качестве фона для кнопки.

Это предполагает myButton кнопка которую вы смотрите выше, и было определено с

android:background="@drawable/custom_button" 

EDIT

для уровня API 1 способ сделать это:

Сделать custom_shape.xml:

<shape android:shape="rectangle"> 
    <corners android:radius="@dimen/control_corner_material" /> 
    <solid android:color="?attr/colorButtonNormal" /> 
    <padding android:left="@dimen/button_padding_horizontal_material" 
     android:top="@dimen/button_padding_vertical_material" 
     android:right="@dimen/button_padding_horizontal_material" 
     android:bottom="@dimen/button_padding_vertical_material" /> 
</shape> 

Написать способ изменить цвет этой вытяжке и положить застегивается вокруг него:

private void changeColor() { 
    // Get shape from XML 
    GradientDrawable shape = (GradientDrawable) getResources().getDrawable(R.drawable.custom_shape); 
    shape.setColor(Color.BLUE); 

    // Programmatically create Inset 
    InsetDrawable drawable = new InsetDrawable(shape, 
      getResources().getDimensionPixelSize(R.dimen.button_inset_horizontal_material), 
      getResources().getDimensionPixelSize(R.dimen.button_inset_vertical_material), 
      getResources().getDimensionPixelSize(R.dimen.button_inset_horizontal_material), 
      getResources().getDimensionPixelSize(R.dimen.button_inset_vertical_material)); 

    // Apply to button 
    myButton.setBackground(drawable); 
} 
+0

Можете ли вы объяснить это немного больше? Это не будет использовать custom_button.xml drawable, который я определил. – ZakTaccardi

+0

Да, это так. 'getBackground()' возвращает 'InsetDrawable', который вы создали в' custom_button.xml', если вы указали его как фон для своей кнопки, как вы сказали. –

+0

Спасибо. Надеюсь, это сработает. Похоже, что gradientDrawable.getDrawable() - это KITKAT или выше, хотя – ZakTaccardi