在没有 findViewById() 的情况下以编程方式更改可绘制 xml 文件的颜色

Change color of drawable xml files progmatically without findViewById()

所以我想做的是..

  1. 获取可绘制形状(xml 文件)
  2. 获取绘图的颜色
  3. 使用 colors.xml
  4. 中可用的颜色更改颜色
  5. 将可绘制对象设置为 CardView 上的某些 ImageView(这不是问题)

代码如下:-

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="md_red_900">#B71C1C</color>
    <color name="md_pink_900">#880E4F</color>
    <color name="md_purple_900">#4A148C</color>
    <color name="md_deep_purple_900">#311B92</color>
    ...
    <!--15 more colors-->
</resources>

shape_template.xml(可绘制形状):-

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <solid android:color="@color/md_white_1000" />
        </shape>
    </item>
</selector>

MainColorPaletteAdapter.java(我想改变可绘制对象的颜色):-

package com.danish.foveros.adapter;

import android.graphics.drawable.Drawable;
import android.media.Image;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.danish.foveros.R;  
import java.util.ArrayList;
import java.util.List;

public class MainColorPaletteAdapter extends RecyclerView.Adapter<MainColorPaletteAdapter.ViewHolder> {
    List<MainColorPaletteGetSet> mItems;
    String[] colorName;
    int[] colorThumbnail;
    int[] allMaterialColor900;
    int[] colorNameBackgroundColor;

    public MainColorPaletteAdapter() {
        super();
        mItems = new ArrayList<MainColorPaletteGetSet>();
        MainColorPaletteGetSet color;

        colorName = new String[]{"Amber", "Brown", "Cyan", "Teal"};
        colorThumbnail = new int[]{R.drawable.amber, R.drawable.brown,
                R.drawable.cyan, R.drawable.teal};
        colorNameBackgroundColor = new int[]{R.color.md_amber_900, R.color.md_brown_900,
                R.color.md_cyan_900, R.color.md_teal_900};

        for (int i = 0; i < colorName.length; i++) {
            color = new MainColorPaletteGetSet();
            color.setColorName(colorName[i]);
            color.setColorThumbnail(colorThumbnail[i]);
            color.setColorNameBackgroundColor(colorNameBackgroundColor[i]);
            mItems.add(color);
        }    
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        View v = LayoutInflater
                .from(viewGroup.getContext())
                .inflate(R.layout.fragment_home_data, viewGroup, false);
        ViewHolder viewHolder = new ViewHolder(v);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        MainColorPaletteGetSet color = mItems.get(position);
        holder.colorThumbnail.setImageResource(color.getColorThumbnail());
        holder.colorName.setText(color.getColorName());
        holder.colorName.setBackgroundColor(color.getColorNameBackgroundColor());

    }

    @Override
    public int getItemCount() {
        return mItems.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        public ImageView colorThumbnail;
        public TextView colorName;

        public ViewHolder(View itemView) {
            super(itemView);
            colorThumbnail = (ImageView) itemView.findViewById(R.id.colorThumbnail);
            colorName = (TextView) itemView.findViewById(R.id.colorName);

        }
    }
}

我尝试了很多方法,但他们说要通过 findViewById() 获取 View 的可绘制对象或背景颜色,但它对我不起作用。

如您所见,可绘制形状是一种非常简单的形状,因此可能并不难。

我想创建 19 个可绘制 xml 文件我可以获得一个可绘制更改它的颜色将它用于第一个 cardview 更改它的颜色并将其用于第二个 cardview 等等。

如有需要,请询问更多信息。

感谢任何帮助。谢谢。

自己解决了:-

package com.danish.foveros.adapter;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.media.Image;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.danish.foveros.R;

import java.util.ArrayList;
import java.util.List;

public class MainColorPaletteAdapter extends RecyclerView.Adapter<MainColorPaletteAdapter.ViewHolder> {
    List<MainColorPaletteGetSet> mItems;
    String[] colorName;
    int[] colorThumbnail;
    int[] allMaterialColor900;
    int[] colorNameBackgroundColor;

    public MainColorPaletteAdapter() {
        super();
        mItems = new ArrayList<MainColorPaletteGetSet>();
        MainColorPaletteGetSet color;
        colorNameBackgroundColor = new int[]{
                R.color.md_red_900,
                R.color.md_pink_900,
                R.color.md_purple_900,
                R.color.md_deep_purple_900,
                R.color.md_indigo_900,
                R.color.md_blue_900,
                R.color.md_light_blue_900,
                R.color.md_cyan_900,
                R.color.md_teal_900,
                R.color.md_green_900,
                R.color.md_light_green_900,
                R.color.md_lime_900,
                R.color.md_yellow_900,
                R.color.md_amber_900,
                R.color.md_orange_900,
                R.color.md_deep_orange_900,
                R.color.md_brown_900,
                R.color.md_grey_900,
                R.color.md_blue_grey_900
        };

        colorName = new String[]{
                "Red",
                "Pink",
                "Purple",
                "Deep Purple",
                "Indigo",
                "Blue",
                "Light Blue",
                "Cyan",
                "Teal",
                "Green",
                "Light Green",
                "Lime",
                "Yellow",
                "Amber",
                "Orange",
                "Deep Orange",
                "Brown",
                "Grey",
                "Blue Grey"
        };
        colorThumbnail = new int[]{
                R.color.md_red_500,
                R.color.md_pink_500,
                R.color.md_purple_500,
                R.color.md_deep_purple_500,
                R.color.md_indigo_500,
                R.color.md_blue_500,
                R.color.md_light_blue_500,
                R.color.md_cyan_500,
                R.color.md_teal_500,
                R.color.md_green_500,
                R.color.md_light_green_500,
                R.color.md_lime_500,
                R.color.md_yellow_500,
                R.color.md_amber_500,
                R.color.md_orange_500,
                R.color.md_deep_orange_500,
                R.color.md_brown_500,
                R.color.md_grey_500,
                R.color.md_blue_grey_500
        };


        for (int i = 0; i < colorName.length; i++) {
            color = new MainColorPaletteGetSet();
            color.setColorName(colorName[i]);
            color.setColorThumbnail(colorThumbnail[i]);
            color.setColorNameBackgroundColor(colorNameBackgroundColor[i]);
            mItems.add(color);
        }


    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        View v = LayoutInflater
                .from(viewGroup.getContext())
                .inflate(R.layout.fragment_home_data, viewGroup, false);
        ViewHolder viewHolder = new ViewHolder(v);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        MainColorPaletteGetSet color = mItems.get(position);
        holder.colorThumbnailView.setBackgroundResource(color.getColorThumbnail());
        holder.colorNameView.setText(color.getColorName());
        holder.colorNameView.setBackgroundResource(color.getColorNameBackgroundColor());
    }

    @Override
    public int getItemCount() {
        return mItems.size();
    }


    public class ViewHolder extends RecyclerView.ViewHolder {

        public ImageView colorThumbnailView;
        public TextView colorNameView;



        public ViewHolder(final View itemView) {
            super(itemView);
            colorThumbnailView = (ImageView) itemView.findViewById(R.id.colorThumbnail);
            colorNameView = (TextView) itemView.findViewById(R.id.colorName);
        }

    }
}

最终输出:-