2014-09-22 48 views
0

我有一对夫妇图像按钮在我的布局一个已经绘制的是,当看到一个被点击的时候,它的图像资源设置为不可见图像按钮,看不见的,将其设置为可见这样增加的背景与资源

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> 

回答

0

实际上,有一个已知的bug,其中设置一个视图的通过资源文件的背景可能会导致它丢失填充(尽管如此,还需要参考链接。稍后再看)。

实际上我用这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)是什么将接管。如果情况也是如此,您可能需要确保这不是您遇到的问题的一部分,因为高分辨率设备上的5像素几乎不存在。

+0

0123对不起,我的初学者实现了你的代码,并坐在那里告诉我方法setBackgroundResourceAndKeepPadding从来没有使用过,我有麻烦声明它在哪里需要声明它的方法来将它应用到视图?谢谢 – martinseal1987 2014-09-22 21:35:52

+0

他们是静态方法,可随时随地从应用程序中使用。假设它们是名为ViewHelper的类的一部分,那么您可以像访问其中的一个:ViewHelper.setBackgroundResourceAndKeepPadding(v,R.drawable.icon); – Guardanis 2014-09-23 14:15:12