Как программно изменить сплошной цвет фигуры в Android?

Я пытаюсь изменить solid цвет shape в моем Fragment.

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/icon_circle_background">
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            ...>
            <solid android:color="@color/md_cyan_400"/>
        </shape>
    </item>
    <item
        ...
    </item>
</layer-list>

Кажется, я не могу получить к нему доступ из своего кода, и я уже пробовал следующие ответы на переполнение стека:

Программно установить цвет фигуры Android

Как динамически изменить цвет фигуры?

​​Изменить сплошной цвет формы во время выполнения внутри Drawable xml используется в качестве фона

Ни один из них не работал или был довольно устаревшим.

Фрагмент, где я пытаюсь изменить цвет:

public class GameFragment extends Fragment {
    private Theme currentTheme;
    private Circle currentCircle;
    private int currentOrganisationId;
    private List<Card> circleCards;
    private List<ImageButton> circleButtons;
    private int viewHeight;
    private int viewWidth;
    private int marginCard;
    private int[] tableStarts;
    private RelativeLayout background;
    private ViewTreeObserver vto;

    public GameFragment() {
        circleCards = new ArrayList<>();
        circleButtons = new ArrayList<>();
        tableStarts = new int[9];
    }

    //...

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        final ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_game, container, false);
        ...
        background = setBackground(rootView);
        circleCards = currentCircle.getCards();

        return rootView;
    }

    //...

    private void drawCards() {
        circleButtons = new ArrayList<>();
        for (Card card : circleCards) {
            ImageButton myImageButton = new ImageButton(this.getContext()); //generate ImageButton
            myImageButton.setId(card.getCardId()); //Set Id of button
            myImageButton.setBackgroundResource(R.drawable.circle_card_icon);

            //set random color to shape
            ...
        }
    }
}

person Edward    schedule 19.03.2016    source источник
comment
Что означает were pretty outdated? Они должны нормально работать.   -  person Phantômaxx    schedule 19.03.2016
comment
@Bob Malooga, попробовал, все еще дает мне этот код goo.gl/fXL4Pe: pastebin.com/KqNNTDnU   -  person Edward    schedule 19.03.2016


Ответы (1)


использовать это:

GradientDrawable bgShape = (GradientDrawable)view.getBackground().getCurrent();
bgShape.setColor(Color.BLACK);

.getCurrent дает выбранный список слоев для рисования

используйте это, он не будет вызывать исключение java.lang.ClassCastException: android.graphics.drawable.GradientDrawable нельзя привести к исключению android.graphics.drawable.ShapeDrawable.

он отлично работает для меня.

person manmohan    schedule 20.07.2016