You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中如何让TextView左侧Drawable贴近文本(或自定义SnackBar)

解决SnackBar图标与文本间距过大的问题

你遇到的图标和文本间距过大的问题,核心是TextView默认的CompoundDrawable间距(drawablePadding)过大,同时可以调整TextView的内边距进一步优化紧凑度。以下是具体修改方案:

关键修改点

  1. 设置图标与文本的间距:通过compoundDrawablePadding手动指定图标和文本之间的距离,替换系统默认的较大间距。
  2. 调整TextView内边距:SnackBar的默认TextView带有左右内边距,可适当缩小让整体布局更紧凑。
  3. 合并Gravity设置:修复原代码中两次设置gravity导致的覆盖问题。

修改后的完整代码

fun showSuccessFullMsg(message: String, anchorView: View) {
    val snackBarView = Snackbar.make(binding.root, message, Snackbar.LENGTH_LONG)
    val view = snackBarView.view
    val params = view.layoutParams as FrameLayout.LayoutParams
    snackBarView.setBackgroundTint(resources.getColor(android.R.color.white))
    // 合并gravity设置,避免覆盖
    params.gravity = Gravity.TOP or Gravity.CENTER_HORIZONTAL
    val actionBarHeight = anchorView.height

    params.setMargins(32, actionBarHeight.plus(36), 32, 0)
    view.layoutParams = params

    val textView = view.findViewById<TextView>(com.google.android.material.R.id.snackbar_text)
    textView.textAlignment = View.TEXT_ALIGNMENT_CENTER
    val drawable = resources.getDrawable(
        R.drawable.ic_double_check,
        resources.newTheme()
    )
    (textView.layoutParams as LinearLayout.LayoutParams).gravity = Gravity.CENTER_HORIZONTAL
    drawable.bounds = Rect(0, 0, 32, 24)
    textView.setCompoundDrawablesRelativeWithIntrinsicBounds(drawable, null, null, null)
    
    // 核心修改:设置图标与文本的间距(此处设为8dp,可按需调整)
    textView.compoundDrawablePadding = dpToPx(8)
    // 可选:缩小TextView左右内边距,让布局更紧凑
    textView.setPadding(dpToPx(4), textView.paddingTop, dpToPx(4), textView.paddingBottom)
    
    textView.isSingleLine = true
    textView.ellipsize = TextUtils.TruncateAt.END
    view.background = ContextCompat.getDrawable(
        this,
        com.proxglobal.ringtone.R.drawable.bg_snackbar
    )
    snackBarView.animationMode = BaseTransientBottomBar.ANIMATION_MODE_FADE
    snackBarView.setTextColor(Color.parseColor("#23C16B"))
    snackBarView.show()
}

// 辅助方法:dp转px
private fun dpToPx(dp: Int): Int {
    return (dp * resources.displayMetrics.density).toInt()
}

额外说明

如果图标本身带有多余的透明边距,可先通过矢量图编辑工具裁剪空白,再配合compoundDrawablePadding调整,效果会更贴合预期。

内容的提问来源于stack exchange,提问作者Nguyễn Kim Khánh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 20:55:49