有没有办法将图标添加到 Snackbar?
Is there any way to add an icon to a Snackbar?
这是我的 Snackbar 代码:
Snackbar.make(viewHolder.productView, "Some Text Here ..", Snackbar.LENGTH_SHORT)
.setAction("I want be a icon here instead TEXT", new View.OnClickListener() {
@Override
public void onClick(View v) {
// Perform anything for the action selected
}
})
.show();
是否可以在 .setAction
中添加图标而不是文本?
这是您可以更改的所有内容 Snackbar
:
Snackbar snackbar = Snackbar
.make(parentLayout, R.string.snackbar_text, Snackbar.LENGTH_LONG)
.setAction(R.string.snackbar_action, myOnClickListener);
snackbar.setActionTextColor(Color.CYAN);
View snackbarView = snackbar.getView();
snackbarView.setBackgroundColor(Color.YELLOW);//change Snackbar's background color;
TextView textView = (TextView)snackbarView .findViewById(android.support.design.R.id.snackbar_text);
textView.setTextColor(Color.BLUE);//change Snackbar's text color;
snackbar.show(); // Don’t forget to show!
遗憾的是,到目前为止,我们仍然无法像 Toast
那样自定义 Snackbar
的内容。在将来?我不知道。
你听说过 ImageSpan 吗?它可能会帮助您实现目标!
见以下代码:
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append("My message ").append(" ");
builder.setSpan(new ImageSpan(MainActivity.this, R.drawable.ic_launcher), builder.length() - 1, builder.length(), 0);
builder.append(" next message");
Snackbar.make(parent view, builder, Snackbar.LENGTH_LONG).show();]
不要使用大图标,因为它们不会保持引力。
参考:How to display image in Android's TextView?
希望对您有所帮助。
ImageSpan 对于较长的文本(多行)可能看起来不正确。相反,使用左侧复合可绘制对象(与 android:drawableLeft
相同)。
Snackbar snackbar = Snackbar.make(layout, R.string.test, Snackbar.LENGTH_LONG);
View snackbarLayout = snackbar.getView();
TextView textView = (TextView)snackbarLayout.findViewById(android.support.design.R.id.snackbar_text);
textView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.white_checkbox, 0, 0, 0);
textView.setCompoundDrawablePadding(getResources().getDimensionPixelOffset(R.dimen.snackbar_icon_padding));
snackbar.show();
如果您使用的是 AndroidX Material 库,请将 android.support.design.R.id.snackbar_text
替换为 com.google.android.material.R.id.snackbar_text
。
您还可以向 SnackbarContentLayout 添加视图
科特林代码:
val snackbar = Snackbar.make(....
val textView = snackbar.view.findViewById(R.id.snackbar_action) as TextView
textView.isAllCaps = false
val imgClose = ImageView(context)
imgClose.scaleType = ImageView.ScaleType.CENTER_INSIDE
val layImageParams = ViewGroup.LayoutParams(WRAP_CONTENT, MATCH_PARENT)
imgClose.setImageResource(R.drawable.ic_close)
(textView.parent as SnackbarContentLayout).addView(imgClose, layImageParams)
imgClose.setOnClickListener { snackbar.dismiss() }
snackbar.show()
假设您要在快餐栏左侧添加一个图标。以下代码可帮助您实现此目的:
SpannableStringBuilder builderTextLeft = new SpannableStringBuilder();
builderTextLeft.append(" ");
builderTextLeft.setSpan(new ImageSpan(context, R.drawable.ic_vector), 0, 1, 0);
Snackbar snackbar = Snackbar.make(parentLayout, builderTextLeft, Snackbar.LENGTH_LONG);
snackbar.show();
在上面的代码中,我在快餐栏的左侧添加了一个信息图标。
如果要在快餐栏右侧添加图标,需要执行以下操作:
SpannableStringBuilder buildetTextRight = new SpannableStringBuilder();
buildetTextRight.append(" ");
buildetTextRight.setSpan(new ImageSpan(context, R.drawable.ic_close),
buildetTextRight.length()-1, buildetTextRight.length(), 0);
在上面的代码中,我在快餐栏的右侧添加了一个关闭图标。
简单的 2020 解决方案,如果您只想要没有操作文本的图标:
Snackbar.make(anchor, message, Snackbar.LENGTH_INDEFINITE).apply {
setAction(" ") { // onClick event }
// the " " is just so android can create the view, otherwise it won't, it will be cleared later
val textView = view.findViewById<TextView>(com.google.android.material.R.id.snackbar_action)
textView.text = "" // clear the text to keep only the icon
textView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_whatever, 0, 0, 0)
show()
}
如果你使用的是 Kotlin 那么你也可以使用这个扩展函数(对于 com.google.android.material):
import com.google.android.material.snackbar.Snackbar
import android.widget.TextView
import android.graphics.PorterDuff
import android.graphics.drawable.Drawable
import androidx.annotation.ColorInt
fun Snackbar.setIcon(drawable: Drawable, @ColorInt colorTint: Int): Snackbar {
return this.apply {
setAction(" ") {}
val textView = view.findViewById<TextView>(com.google.android.material.R.id.snackbar_action)
textView.text = ""
drawable.setTint(colorTint)
drawable.setTintMode(PorterDuff.Mode.SRC_ATOP)
textView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null)
}
}
像这样将它与您的小吃店一起使用:
Snackbar.make(view, "Hey there!", Snackbar.LENGTH_SHORT)
.setIcon(
getDrawable(R.drawable.ic_launcher)!!,
resources.getColor(android.R.color.white, theme)
)
.show()
这是我的 Snackbar 代码:
Snackbar.make(viewHolder.productView, "Some Text Here ..", Snackbar.LENGTH_SHORT)
.setAction("I want be a icon here instead TEXT", new View.OnClickListener() {
@Override
public void onClick(View v) {
// Perform anything for the action selected
}
})
.show();
是否可以在 .setAction
中添加图标而不是文本?
这是您可以更改的所有内容 Snackbar
:
Snackbar snackbar = Snackbar
.make(parentLayout, R.string.snackbar_text, Snackbar.LENGTH_LONG)
.setAction(R.string.snackbar_action, myOnClickListener);
snackbar.setActionTextColor(Color.CYAN);
View snackbarView = snackbar.getView();
snackbarView.setBackgroundColor(Color.YELLOW);//change Snackbar's background color;
TextView textView = (TextView)snackbarView .findViewById(android.support.design.R.id.snackbar_text);
textView.setTextColor(Color.BLUE);//change Snackbar's text color;
snackbar.show(); // Don’t forget to show!
遗憾的是,到目前为止,我们仍然无法像 Toast
那样自定义 Snackbar
的内容。在将来?我不知道。
你听说过 ImageSpan 吗?它可能会帮助您实现目标! 见以下代码:
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append("My message ").append(" ");
builder.setSpan(new ImageSpan(MainActivity.this, R.drawable.ic_launcher), builder.length() - 1, builder.length(), 0);
builder.append(" next message");
Snackbar.make(parent view, builder, Snackbar.LENGTH_LONG).show();]
不要使用大图标,因为它们不会保持引力。
参考:How to display image in Android's TextView?
希望对您有所帮助。
ImageSpan 对于较长的文本(多行)可能看起来不正确。相反,使用左侧复合可绘制对象(与 android:drawableLeft
相同)。
Snackbar snackbar = Snackbar.make(layout, R.string.test, Snackbar.LENGTH_LONG);
View snackbarLayout = snackbar.getView();
TextView textView = (TextView)snackbarLayout.findViewById(android.support.design.R.id.snackbar_text);
textView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.white_checkbox, 0, 0, 0);
textView.setCompoundDrawablePadding(getResources().getDimensionPixelOffset(R.dimen.snackbar_icon_padding));
snackbar.show();
如果您使用的是 AndroidX Material 库,请将 android.support.design.R.id.snackbar_text
替换为 com.google.android.material.R.id.snackbar_text
。
您还可以向 SnackbarContentLayout 添加视图
科特林代码:
val snackbar = Snackbar.make(....
val textView = snackbar.view.findViewById(R.id.snackbar_action) as TextView
textView.isAllCaps = false
val imgClose = ImageView(context)
imgClose.scaleType = ImageView.ScaleType.CENTER_INSIDE
val layImageParams = ViewGroup.LayoutParams(WRAP_CONTENT, MATCH_PARENT)
imgClose.setImageResource(R.drawable.ic_close)
(textView.parent as SnackbarContentLayout).addView(imgClose, layImageParams)
imgClose.setOnClickListener { snackbar.dismiss() }
snackbar.show()
假设您要在快餐栏左侧添加一个图标。以下代码可帮助您实现此目的:
SpannableStringBuilder builderTextLeft = new SpannableStringBuilder();
builderTextLeft.append(" ");
builderTextLeft.setSpan(new ImageSpan(context, R.drawable.ic_vector), 0, 1, 0);
Snackbar snackbar = Snackbar.make(parentLayout, builderTextLeft, Snackbar.LENGTH_LONG);
snackbar.show();
在上面的代码中,我在快餐栏的左侧添加了一个信息图标。
如果要在快餐栏右侧添加图标,需要执行以下操作:
SpannableStringBuilder buildetTextRight = new SpannableStringBuilder();
buildetTextRight.append(" ");
buildetTextRight.setSpan(new ImageSpan(context, R.drawable.ic_close),
buildetTextRight.length()-1, buildetTextRight.length(), 0);
在上面的代码中,我在快餐栏的右侧添加了一个关闭图标。
简单的 2020 解决方案,如果您只想要没有操作文本的图标:
Snackbar.make(anchor, message, Snackbar.LENGTH_INDEFINITE).apply {
setAction(" ") { // onClick event }
// the " " is just so android can create the view, otherwise it won't, it will be cleared later
val textView = view.findViewById<TextView>(com.google.android.material.R.id.snackbar_action)
textView.text = "" // clear the text to keep only the icon
textView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_whatever, 0, 0, 0)
show()
}
如果你使用的是 Kotlin 那么你也可以使用这个扩展函数(对于 com.google.android.material):
import com.google.android.material.snackbar.Snackbar
import android.widget.TextView
import android.graphics.PorterDuff
import android.graphics.drawable.Drawable
import androidx.annotation.ColorInt
fun Snackbar.setIcon(drawable: Drawable, @ColorInt colorTint: Int): Snackbar {
return this.apply {
setAction(" ") {}
val textView = view.findViewById<TextView>(com.google.android.material.R.id.snackbar_action)
textView.text = ""
drawable.setTint(colorTint)
drawable.setTintMode(PorterDuff.Mode.SRC_ATOP)
textView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null)
}
}
像这样将它与您的小吃店一起使用:
Snackbar.make(view, "Hey there!", Snackbar.LENGTH_SHORT)
.setIcon(
getDrawable(R.drawable.ic_launcher)!!,
resources.getColor(android.R.color.white, theme)
)
.show()