Android 已使用资源向drawable添加背景

Android 已使用资源向drawable添加背景,android,xml,image,background,Android,Xml,Image,Background,我的布局中有两个图像按钮,一个是不可见的,当单击可见的按钮时,它将其图像资源设置为不可见的图像按钮,并将其设置为可见,如下所示 btn1.setOnClickListener(new OnClickListener() { public void onClick(View v) { btnmt2.setImageResource(R.drawable.happy); btnmt2.setVisibility(View.VISIBL

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

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);
 if (android.os.Build.VERSION.SDK_INT < 16) {
    btnmt2.setBackgroundResource(R.drawable.dropshadow);
} else {
    btnmt2.setBackground(getResources().getDrawable(R.drawable.dropshadow));
}
但是“可见图像”按钮有一个背景(背景是xml中定义为两个形状的阴影)我希望图像在移动到“不可见图像”时保持此背景,因此我尝试在xml中添加此背景,但没有效果,图像资源似乎失去了缩放或填充,延伸到背景的完整大小,因此,我尝试将其添加到java文件中,处理不推荐使用的方法,如下所示

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);
 if (android.os.Build.VERSION.SDK_INT < 16) {
    btnmt2.setBackgroundResource(R.drawable.dropshadow);
} else {
    btnmt2.setBackground(getResources().getDrawable(R.drawable.dropshadow));
}
if(android.os.Build.VERSION.SDK_INT<16){
btnmt2.挫折背景资源(R.可绘制.阴影);
}否则{
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>

实际上存在一个已知的错误,通过资源文件设置视图的背景可能会导致其丢失填充(不过需要一个参考链接。稍后再查看)

实际上,我使用以下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);
}
publicstaticvoid setbackgroundresourceandpadding(视图v,int-resourceId){
int top=v.getPaddingTop();
int left=v.getPaddingLeft();
int right=v.getPaddingRight();
int bottom=v.getPaddingBottom();
v、 挫折资源(resourceId);
v、 设置填充(左、上、右、下);
}
公共静态空间后退地面可绘制和保留添加(视图v,可绘制){
int top=v.getPaddingTop();
int left=v.getPaddingLeft();
int right=v.getPaddingRight();
int bottom=v.getPaddingBottom();
可拉拔立根(v,可拉拔);
v、 设置填充(左、上、右、下);
}
@SuppressLint(“新API”)
公共静态空间后退地面可绘制(视图v,可绘制){
if(android.os.Build.VERSION.SDK_INT
调用这些setBackgroundResourceAndKeepPadding()方法中的任何一个都可以避免您遇到的填充丢失问题


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

抱歉,我是一个初学者我实现了你的代码,坐在那里告诉我从未使用过setbackgroundresource和keepadding方法,我在声明它时遇到困难我需要在哪里声明方法才能将它应用到视图?谢谢,它们是静态方法,可以在应用程序中的任何位置随时使用。假设它们是名为ViewHelper的类的一部分,然后您可以访问其中一个,如:ViewHelper.setBackgroundResourceAndKeepPadding(v,R.drawable.icon);