已经使用资源添加背景到drawable

时间:2014-09-22 15:45:35

标签: android xml image background

我的布局中有几个图像按钮,当单击可见图像按钮时它是不可见的,它将图像资源设置为不可见的图像按钮,并将其设置为可见,如下所示

btn1.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {

            btnmt2.setImageResource(R.drawable.happy);
            btnmt2.setVisibility(View.VISIBLE);
            btnmt2.setScaleType(ImageView.ScaleType.FIT_CENTER);
            btnmt2.setPadding(5,5,5,5);

但可见图像按钮有一个背景,(背景是在xml中定义为几个形状的阴影)我希望图像在移动到不可见的时保留此背景,所以我尝试在xml中添加此没有用,图像资源似乎失去了它的缩放,或其填充,拉伸到背景的完整大小,所以我尝试在我的java文件中添加它来解决已弃用的方法,像这样

 if (android.os.Build.VERSION.SDK_INT < 16) {
    btnmt2.setBackgroundResource(R.drawable.dropshadow);
} else {
    btnmt2.setBackground(getResources().getDrawable(R.drawable.dropshadow));
}

这样可以保持比例和填充但是背景没有添加,任何人都可以帮助我,不确定它是否是我的xml图像所以这里是

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item >
    <shape
        android:shape="rectangle">
        <solid android:color="@android:color/transparent" />
        <corners android:radius="5dp"/>
    </shape>
</item>
<item android:right="18dp" android:left="18dp" android:top="10dp" android:bottom="4dp">
    <shape
        android:shape="rectangle">
        <solid android:color="@android:color/darker_gray"/>
        <corners android:radius="10dp"/>
    </shape>
</item>
</layer-list>

1 个答案:

答案 0 :(得分:0)

实际上已经存在一个已知的错误,即通过资源文件设置View的背景会导致它丢失它的填充(但需要一个参考链接。稍后再看看)。

我实际上使用这3种方法来解决这个问题,通过在实际加载图像之前/之后保存和恢复填充:

public static void setBackgroundResourceAndKeepPadding(View v, int resourceId) {
    int top = v.getPaddingTop();
    int left = v.getPaddingLeft();
    int right = v.getPaddingRight();
    int bottom = v.getPaddingBottom();

    v.setBackgroundResource(resourceId);
    v.setPadding(left, top, right, bottom);
}

public static void setBackgroundDrawableAndKeepPadding(View v, Drawable drawable) {
    int top = v.getPaddingTop();
    int left = v.getPaddingLeft();
    int right = v.getPaddingRight();
    int bottom = v.getPaddingBottom();

    setBackgroundDrawable(v, drawable);
    v.setPadding(left, top, right, bottom);
}

@SuppressLint("NewApi") 
public static void setBackgroundDrawable(View v, Drawable drawable){        
    if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN)  v.setBackgroundDrawable(drawable);
    else v.setBackground(drawable);
}

调用其中任何一个setBackgroundResourceAndKeepPadding()方法都应该绕过你遇到的填充丢失问题。

但是,这是假设您在设置背景图像之前设置了填充;否则你的新填充(似乎是5px)将接管。如果情况也是如此,您可能需要确保这不是您遇到的问题的一部分,因为高分辨率设备上的5px看起来几乎不存在。