从源更改背景颜色/可绘制

Posted

技术标签:

【中文标题】从源更改背景颜色/可绘制【英文标题】:Change background color/drawable from the source 【发布时间】:2016-10-27 05:49:11 【问题描述】:

我有许多使用 shape drawables 的背景颜色的 XML,例如:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:background="@drawable/background"
/>

我的形状背景xml是:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient 
        android:type="linear"
        android:startColor="#FFffffff"
        android:endColor="#FFE8E8E8"
        android:angle="315" />    
</shape>

现在我想添加一个功能,让用户可以选择更改背景颜色。有没有一种快速的方法可以让我根据某个值更改可绘制的源形状,而不是转到加载 xml 的 每个 活动并更改它?

谢谢。

【问题讨论】:

你想在运行时改变形状的颜色还是改变形状? 形状的颜色 【参考方案1】:

您可以为不同名称的用户创建列表或按钮。根据单击的按钮,您可以以编程方式更改布局背景。 例如:

 @Override
public void onClick(View v) 
    switch (v.getId()) 
        case R.id.drawable1Button:
             final int sdk = android.os.Build.VERSION.SDK_INT;
             if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) 
             layout.setBackgroundDrawable( getResources().getDrawable(R.drawable.drawable1) );
              else 
               layout.setBackground( getResources().getDrawable(R.drawable.drawable1));
             

            break;

        case R.id.drawable2Button:
             final int sdk = android.os.Build.VERSION.SDK_INT;
             if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) 
             layout.setBackgroundDrawable( getResources().getDrawable(R.drawable.drawable2) );
              else 
               layout.setBackground( getResources().getDrawable(R.drawable.drawable2));
             
             break;
        case R.id.drawable3Button:
             final int sdk = android.os.Build.VERSION.SDK_INT;
             if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) 
             layout.setBackgroundDrawable( getResources().getDrawable(R.drawable.drawable3) );
              else 
               layout.setBackground( getResources().getDrawable(R.drawable.drawable3));
             
            break;
        
       

【讨论】:

谢谢,但请仔细阅读我的电子邮件。我“不想”去更改它以进行活动,因为我有很多布局 xml。我希望它在一个地方完成 然后在某个类中创建一个通用方法,您将不得不从每个活动中访问它。只需要一行代码。 从每个活动中访问它实际上是在更改每个活动的代码。这是一个大项目,至少有 40 个活动和片段。我不会每一个都改变。如果可能,我想更改源(xml drawable)【参考方案2】:

更改你的 background.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/shape_id">
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="line">
            <gradient
                android:angle="315"
                android:endColor="#FFE8E8E8"
                android:startColor="#FFffffff"
                android:type="linear" />

        </shape>
    </item>
</layer-list>

现在单击按钮只需找出您要更改的颜色组合并将该颜色放入数组中并在单击时更改。

 final LinearLayout l =(LinearLayout)findViewById(R.id.linearLayout);
        l.setBackgroundResource(R.drawable.background);
      final  View v = findViewById(R.id.linearLayout);
        Button b =(Button)findViewById(R.id.button);
        b.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                int colors[] =  0xff255779, 0xffa6c0cd ;
                GradientDrawable gradientDrawable = new GradientDrawable(
                        GradientDrawable.Orientation.TOP_BOTTOM, colors);
                l.setBackground(gradientDrawable);

            
        );

【讨论】:

我必须把它放在每一个活动中。我不想像我在问题中所说的那样

以上是关于从源更改背景颜色/可绘制的主要内容,如果未能解决你的问题,请参考以下文章

CAD中如何自定义背景颜色

如何更改android状态栏的背景颜色

分组 UITableView 自定义绘制单元格,而不更改背景颜色?

我的应用程序忽略按钮背景颜色的任何变化

如何从 2 种颜色为启动屏幕背景创建可绘制对象?

谷歌图表背景颜色