软件编程
位置:首页>> 软件编程>> Android编程>> Android setButtonDrawable()的兼容问题解决办法

Android setButtonDrawable()的兼容问题解决办法

作者:ihrthk  发布时间:2021-12-11 04:33:52 

标签:setButtonDrawable(),兼容

Android  setButtonDrawable()的兼容问题解决办法

setButtonDrawable()的兼容问题

API16实现


/**
 * Set the background to a given Drawable, identified by its resource id.
 *
 * @param resid the resource id of the drawable to use as the background
 */
public void setButtonDrawable(int resid) {
 if (resid != 0 && resid == mButtonResource) {
  return;
 }

mButtonResource = resid;

Drawable d = null;
 if (mButtonResource != 0) {
  d = getResources().getDrawable(mButtonResource);
 }
 setButtonDrawable(d);
}

/**
 * Set the background to a given Drawable
 *
 * @param d The Drawable to use as the background
 */
public void setButtonDrawable(Drawable d) {
 if (d != null) {
  if (mButtonDrawable != null) {
   mButtonDrawable.setCallback(null);
   unscheduleDrawable(mButtonDrawable);
  }
  d.setCallback(this);
  d.setState(getDrawableState());
  d.setVisible(getVisibility() == VISIBLE, false);
  mButtonDrawable = d;
  mButtonDrawable.setState(null);
  setMinHeight(mButtonDrawable.getIntrinsicHeight());
 }

refreshDrawableState();
}

API23实现


/**
 * Sets a drawable as the compound button image given its resource
 * identifier.
 *
 * @param resId the resource identifier of the drawable
 * @attr ref android.R.styleable#CompoundButton_button
 */
public void setButtonDrawable(@DrawableRes int resId) {
 final Drawable d;
 if (resId != 0) {
  d = getContext().getDrawable(resId);
 } else {
  d = null;
 }
 setButtonDrawable(d);
}

/**
 * Sets a drawable as the compound button image.
 *
 * @param drawable the drawable to set
 * @attr ref android.R.styleable#CompoundButton_button
 */
@Nullable
public void setButtonDrawable(@Nullable Drawable drawable) {
 if (mButtonDrawable != drawable) {
  if (mButtonDrawable != null) {
   mButtonDrawable.setCallback(null);
   unscheduleDrawable(mButtonDrawable);
  }

mButtonDrawable = drawable;

if (drawable != null) {
   drawable.setCallback(this);
   drawable.setLayoutDirection(getLayoutDirection());
   if (drawable.isStateful()) {
    drawable.setState(getDrawableState());
   }
   drawable.setVisible(getVisibility() == VISIBLE, false);
   setMinHeight(drawable.getIntrinsicHeight());
   applyButtonTint();
  }
 }
}

结论

RadioButton和CheckBox都是Android app中常用的Widget,它们派生于CompoundButton,允许使用者自行设置背景和按钮的样式,不过,有时我们仅希望简单的设置一个有状态的背景,并隐藏其默认样式。可是,当我们调用setButtonDrawable(null)或setButtonDrawable(0)时,却发现完全没有效果。原来,CompoundButton的setButtonDrawable的代码实现中屏蔽了null或resid为0的Drawable,迫使我们必须传入有效的Drawable对象。

这时候,透明颜色就可以派上用场了:

button.setButtonDrawable(new ColorDrawable(Color.TRANSPARENT));

参考:

隐藏RadioButton, CheckBox图片 setButtonDrawable:

RadioButton和CheckBox都是Android app中常用的Widget,它们派生于CompoundButton,允许使用者自行设置背景和按钮的样式,不过,有时我们仅希望简单的设置一个有状态的背景,并隐藏其默认样式。可是,当我们调用setButtonDrawable(null)或setButtonDrawable(0)时,却发现完全没有效果。原来,CompoundButton的setButtonDrawable的代码实现中屏蔽了null或resid为0的Drawable,迫使我们必须传入有效的Drawable对象。

这时候,透明颜色就可以派上用场了:


button.setButtonDrawable(new ColorDrawable(Color.TRANSPARENT));

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

来源:http://blog.csdn.net/ihrthk/article/details/61442658

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com