Android 如何定制snackBar';什么样的布局?
是否有任何方法将snackBar的布局更改为自定义视图 现在它是黑色的,我们可以改变背景色。 但我不知道如何将一个新的布局放大,并将其作为snackBars背景Android 如何定制snackBar';什么样的布局?,android,android-layout,android-custom-view,android-snackbar,snackbar,Android,Android Layout,Android Custom View,Android Snackbar,Snackbar,是否有任何方法将snackBar的布局更改为自定义视图 现在它是黑色的,我们可以改变背景色。 但我不知道如何将一个新的布局放大,并将其作为snackBars背景 谢谢…答案是:不要定制Snackbar。它包含的元素不应超过一个短文本和一个操作。看 更新: 如果你想定制Snackbar,我已经在我的应用程序中实现了以下功能: //生成snackbar Snackbar sb=Snackbar.make(rootView,snack.text,duration); //设置te操作按钮文本颜色 sb
谢谢…答案是:不要定制Snackbar。它包含的元素不应超过一个短文本和一个操作。看 更新: 如果你想定制Snackbar,我已经在我的应用程序中实现了以下功能:
//生成snackbar
Snackbar sb=Snackbar.make(rootView,snack.text,duration);
//设置te操作按钮文本颜色
sb.setActionTextColor(mCurrentActivity.getResources().getColor(R.color.snack_text_action));
//获取snackbar的视图
View sbView=sb.getView();
//设置背景色
sbView.setBackgroundColor(mCurrentActivity.getResources().getColor(BackgroundResid));
//获取snackbar文本的textview
TextView TextView=(TextView)sbView.findviewbyd(android.support.design.R.id.snackbar_text);
//设置文本颜色
textView.setTextColor(mCurrentActivity.getResources().getColor(R.color.snack_text));
//增加snackbar中的最大文本行数。默认值为2。
textView.setMaxLines(10);
我从未尝试过,但通过获取Snackbar的根视图,您可以通过编程方式向Snackbar添加新视图。Snackbar不允许您设置自定义布局。然而,正如Primoz990建议的那样,您可以获得Snackbar的视图。getView函数返回Snackbar.Snackbar布局,它是一个水平线性布局对象,其子对象是TextView和按钮。要将自己的视图添加到Snackbar,只需隐藏TextView,然后将视图添加到Snackbar.Snackbar布局
//创建Snackbar
Snackbar Snackbar=Snackbar.make(containerLayout,“”,Snackbar.LENGTH\u LONG);
//获取Snackbar的布局视图
Snackbar.SnackbarLayout布局=(Snackbar.SnackbarLayout)Snackbar.getView();
//隐藏文本
TextView TextView=(TextView)layout.findviewbyd(android.support.design.R.id.snackbar_text);
textView.setVisibility(View.INVISIBLE);
//夸大我们的习惯观点
视图snackView=mInflater.flate(R.layout.my_snackbar,null);
//配置视图
ImageView ImageView=(ImageView)snackView.findViewById(R.id.image);
设置图像位图(图像);
TextView textViewTop=(TextView)snackView.findViewById(R.id.text);
textViewTop.setText(文本);
textViewTop.setTextColor(Color.WHITE);
//如果视图未覆盖整个snackbar布局,请添加此行
布局。设置填充(0,0,0,0);
//将视图添加到Snackbar的布局中
layout.addView(snackView,0);
//显示Snackbar
snackbar.show();
XML方式:
用于Snackbar
的原始布局xml文件是以下文件:
design\u layout\u snackbar\u include.xml
:
请尝试以下代码
Snackbar snackbar = Snackbar.make(container, "No Internet Connection", Snackbar.LENGTH_LONG);
View sbView = snackbar.getView();
sbView.setBackgroundColor(ContextCompat.getColor(this, R.color.colorPrimary));
snackbar.show();
注意:
容器-布局的父视图
有可能从一开始 I.在值/布局文件夹中声明自定义布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/snackbar_action"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/design_snackbar_extra_spacing_horizontal"
android:layout_marginStart="@dimen/design_snackbar_extra_spacing_horizontal"
android:layout_gravity="center_vertical|right|end"
android:paddingTop="@dimen/design_snackbar_padding_vertical"
android:paddingBottom="@dimen/design_snackbar_padding_vertical"
android:paddingLeft="@dimen/design_snackbar_padding_horizontal"
android:paddingRight="@dimen/design_snackbar_padding_horizontal"
android:visibility="gone"
android:textColor="?attr/colorAccent"
style="?attr/borderlessButtonStyle"/>
<TextView
android:gravity="center_vertical|right"
android:id="@+id/snackbar_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingTop="@dimen/design_snackbar_padding_vertical"
android:paddingBottom="@dimen/design_snackbar_padding_vertical"
android:paddingLeft="@dimen/design_snackbar_padding_horizontal"
android:paddingRight="@dimen/design_snackbar_padding_horizontal"
android:textAppearance="@style/TextAppearance.Design.Snackbar.Message"
android:maxLines="@integer/design_snackbar_text_max_lines"
android:layout_gravity="center_vertical|left|start"
android:ellipsize="end"/>
</LinearLayout>
三、 加
四、 添加用于创建具有自定义布局的Snackbar的方法和填充方法
public class final CustomSnackbar ...{
...
public static CustomSnackbar make(ViewGroup parent, @Duration int duration) {
// inflate custom layout
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View content = inflater.inflate(R.layout.snackbar_view, parent, false);
// create snackbar with custom view
ContentViewCallback callback= new ContentViewCallback(content);
CustomSnackbar customSnackbar = new CustomSnackbar(parent, content, callback);
// Remove black background padding on left and right
customSnackbar.getView().setPadding(0, 0, 0, 0);
// set snackbar duration
customSnackbar.setDuration(duration);
return customSnackbar;
}
// set text in custom layout
public CustomSnackbar setText(CharSequence text) {
TextView textView = (TextView) getView().findViewById(R.id.snackbar_text);
textView.setText(text);
return this;
}
// set action in custom layout
public CustomSnackbar setAction(CharSequence text, final OnClickListener listener) {
Button actionView = (Button) getView().findViewById(R.id.snackbar_action);
actionView.setText(text);
actionView.setVisibility(View.VISIBLE);
actionView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onClick(view);
// Now dismiss the Snackbar
dismiss();
}
});
return this;
}
}
V.创建CustomSnackbar
的实例并调用show()
方法
CustomSnackbar customSnackbar = CustomSnackbar.make(rooView, CustomSnackbar.LENGTH_INDEFINITE);
customSnackbar.setText("No network connection!");
customSnackbar.setAction("Retry", new View.OnClickListener() {
@Override
public void onClick(View v) {
// handle click here
}
});
customSnackbar.show();
有关Snackbar及其自定义的详细信息,请访问
完整的CustomSnackbar.class
code:
import android.support.annotation.NonNull;
import android.support.design.widget.BaseTransientBottomBar;
import android.support.v4.view.ViewCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
public class CustomSnackbar extends BaseTransientBottomBar<CustomSnackbar> {
/**
* Constructor for the transient bottom bar.
*
* @param parent The parent for this transient bottom bar.
* @param content The content view for this transient bottom bar.
* @param callback The content view callback for this transient bottom bar.
*/
private CustomSnackbar(ViewGroup parent, View content, ContentViewCallback callback) {
super(parent, content, callback);
}
public static CustomSnackbar make(@NonNull ViewGroup parent, @Duration int duration) {
final LayoutInflater inflater = LayoutInflater.from(parent.getContext());
final View content = inflater.inflate(R.layout.snackbar_view, parent, false);
final ContentViewCallback viewCallback = new ContentViewCallback(content);
final CustomSnackbar customSnackbar = new CustomSnackbar(parent, content, viewCallback);
customSnackbar.getView().setPadding(0, 0, 0, 0);
customSnackbar.setDuration(duration);
return customSnackbar;
}
public CustomSnackbar setText(CharSequence text) {
TextView textView = (TextView) getView().findViewById(R.id.snackbar_text);
textView.setText(text);
return this;
}
public CustomSnackbar setAction(CharSequence text, final View.OnClickListener listener) {
Button actionView = (Button) getView().findViewById(R.id.snackbar_action);
actionView.setText(text);
actionView.setVisibility(View.VISIBLE);
actionView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onClick(view);
// Now dismiss the Snackbar
dismiss();
}
});
return this;
}
private static class ContentViewCallback implements BaseTransientBottomBar.ContentViewCallback {
private View content;
public ContentViewCallback(View content) {
this.content = content;
}
@Override
public void animateContentIn(int delay, int duration) {
ViewCompat.setScaleY(content, 0f);
ViewCompat.animate(content).scaleY(1f).setDuration(duration).setStartDelay(delay);
}
@Override
public void animateContentOut(int delay, int duration) {
ViewCompat.setScaleY(content, 1f);
ViewCompat.animate(content).scaleY(0f).setDuration(duration).setStartDelay(delay);
}
}
}
import android.support.annotation.NonNull;
导入android.support.design.widget.BaseTransientBottomBar;
导入android.support.v4.view.ViewCompat;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.Button;
导入android.widget.TextView;
公共类CustomSnackbar扩展了BaseTransientBottomBar{
/**
*瞬时底杆的构造函数。
*
*@param parent此临时底部栏的父级。
*@param content此临时底部栏的内容视图。
*@param callback此临时底部栏的内容视图回调。
*/
私有CustomSnackbar(视图组父级、视图内容、ContentViewCallback回调){
超级(父级、内容、回调);
}
公共静态CustomSnackbar make(@NonNull ViewGroup parent,@Duration int Duration){
最终LayoutFlater充气器=LayoutFlater.from(parent.getContext());
最终视图内容=充气机充气(R.layout.snackbar_视图,父视图,false);
final ContentViewCallback viewCallback=新ContentViewCallback(content);
最终CustomSnackbar CustomSnackbar=新的CustomSnackbar(父级、内容、视图回调);
customSnackbar.getView().setPadding(0,0,0,0);
customSnackbar.setDuration(持续时间);
返回自定义snackbar;
}
公共自定义快捷键设置文本(字符序列文本){
TextView TextView=(TextView)getView().findViewById(R.id.snackbar_text);
textView.setText(text);
归还这个;
}
公共CustomSnackbar设置操作(CharSequence文本,final View.OnClickListener侦听器){
按钮操作视图=(按钮)getView().findViewById(R.id.snackbar_操作);
actionView.setText(文本);
actionView.setVisibility(View.VISIBLE);
actionView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
onClick(视图);
//现在,关闭Snackbar
解雇();
}
});
归还这个;
}
私有静态类ContentViewCallback实现BaseTransientBottomBar.ContentViewCallback{
私有视图内容;
公共内容视图回调(查看内容){
this.content=内容;
}
@凌驾
public void animateContentIn(整数延迟,整数持续时间){
ViewCompat.setScaleY(内容,0f);
ViewCompat.animate(content).scaleY(1f).setDuration(duration).setStartDelay(delay);
public class final CustomSnackbar ...{
...
private static class ContentViewCallback implements
BaseTransientBottomBar.ContentViewCallback {
// view inflated from custom layout
private View content;
public ContentViewCallback(View content) {
this.content = content;
}
@Override
public void animateContentIn(int delay, int duration) {
// add custom *in animations for your views
// e.g. original snackbar uses alpha animation, from 0 to 1
ViewCompat.setScaleY(content, 0f);
ViewCompat.animate(content)
.scaleY(1f).setDuration(duration)
.setStartDelay(delay);
}
@Override
public void animateContentOut(int delay, int duration) {
// add custom *out animations for your views
// e.g. original snackbar uses alpha animation, from 1 to 0
ViewCompat.setScaleY(content, 1f);
ViewCompat.animate(content)
.scaleY(0f)
.setDuration(duration)
.setStartDelay(delay);
}
}
}
public class final CustomSnackbar ...{
...
public static CustomSnackbar make(ViewGroup parent, @Duration int duration) {
// inflate custom layout
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View content = inflater.inflate(R.layout.snackbar_view, parent, false);
// create snackbar with custom view
ContentViewCallback callback= new ContentViewCallback(content);
CustomSnackbar customSnackbar = new CustomSnackbar(parent, content, callback);
// Remove black background padding on left and right
customSnackbar.getView().setPadding(0, 0, 0, 0);
// set snackbar duration
customSnackbar.setDuration(duration);
return customSnackbar;
}
// set text in custom layout
public CustomSnackbar setText(CharSequence text) {
TextView textView = (TextView) getView().findViewById(R.id.snackbar_text);
textView.setText(text);
return this;
}
// set action in custom layout
public CustomSnackbar setAction(CharSequence text, final OnClickListener listener) {
Button actionView = (Button) getView().findViewById(R.id.snackbar_action);
actionView.setText(text);
actionView.setVisibility(View.VISIBLE);
actionView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onClick(view);
// Now dismiss the Snackbar
dismiss();
}
});
return this;
}
}
CustomSnackbar customSnackbar = CustomSnackbar.make(rooView, CustomSnackbar.LENGTH_INDEFINITE);
customSnackbar.setText("No network connection!");
customSnackbar.setAction("Retry", new View.OnClickListener() {
@Override
public void onClick(View v) {
// handle click here
}
});
customSnackbar.show();
import android.support.annotation.NonNull;
import android.support.design.widget.BaseTransientBottomBar;
import android.support.v4.view.ViewCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
public class CustomSnackbar extends BaseTransientBottomBar<CustomSnackbar> {
/**
* Constructor for the transient bottom bar.
*
* @param parent The parent for this transient bottom bar.
* @param content The content view for this transient bottom bar.
* @param callback The content view callback for this transient bottom bar.
*/
private CustomSnackbar(ViewGroup parent, View content, ContentViewCallback callback) {
super(parent, content, callback);
}
public static CustomSnackbar make(@NonNull ViewGroup parent, @Duration int duration) {
final LayoutInflater inflater = LayoutInflater.from(parent.getContext());
final View content = inflater.inflate(R.layout.snackbar_view, parent, false);
final ContentViewCallback viewCallback = new ContentViewCallback(content);
final CustomSnackbar customSnackbar = new CustomSnackbar(parent, content, viewCallback);
customSnackbar.getView().setPadding(0, 0, 0, 0);
customSnackbar.setDuration(duration);
return customSnackbar;
}
public CustomSnackbar setText(CharSequence text) {
TextView textView = (TextView) getView().findViewById(R.id.snackbar_text);
textView.setText(text);
return this;
}
public CustomSnackbar setAction(CharSequence text, final View.OnClickListener listener) {
Button actionView = (Button) getView().findViewById(R.id.snackbar_action);
actionView.setText(text);
actionView.setVisibility(View.VISIBLE);
actionView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onClick(view);
// Now dismiss the Snackbar
dismiss();
}
});
return this;
}
private static class ContentViewCallback implements BaseTransientBottomBar.ContentViewCallback {
private View content;
public ContentViewCallback(View content) {
this.content = content;
}
@Override
public void animateContentIn(int delay, int duration) {
ViewCompat.setScaleY(content, 0f);
ViewCompat.animate(content).scaleY(1f).setDuration(duration).setStartDelay(delay);
}
@Override
public void animateContentOut(int delay, int duration) {
ViewCompat.setScaleY(content, 1f);
ViewCompat.animate(content).scaleY(0f).setDuration(duration).setStartDelay(delay);
}
}
}
Snackbar.with(this,null)
.type(Type.SUCCESS)
.message("Profile updated successfully!")
.duration(Duration.SHORT)
.show();
View view = getLayoutInflater().inflate(R.layout.custom_view, null);
Snackbar.with(this,null)
.type(Type.UPDATE)
.contentView(view, 76)
.duration(Duration.SHORT)
.show();
private Snackbar showSnackbar(CoordinatorLayout coordinatorLayout, int duration) { // Create the Snackbar
Snackbar snackbar = Snackbar.make(coordinatorLayout, "", duration);
// 15 is margin from all the sides for snackbar
int marginFromSides = 15;
float height = 100;
//inflate view
View snackView = getLayoutInflater().inflate(R.layout.snackbar_layout, null);
// White background
snackbar.getView().setBackgroundColor(Color.WHITE);
// for rounded edges
snackbar.getView().setBackground(getResources().getDrawable(R.drawable.round_edges));
Snackbar.SnackbarLayout snackBarView = (Snackbar.SnackbarLayout) snackbar.getView();
FrameLayout.LayoutParams parentParams = (FrameLayout.LayoutParams) snackBarView.getLayoutParams();
parentParams.setMargins(marginFromSides, 0, marginFromSides, marginFromSides);
parentParams.height = (int) height;
parentParams.width = FrameLayout.LayoutParams.MATCH_PARENT;
snackBarView.setLayoutParams(parentParams);
snackBarView.addView(snackView, 0);
return snackbar;
}
CoordinatorLayout coordinatorLayout = findViewById(R.id.coordinator_layout);
final Snackbar snackbar = showSnackbar(coordinatorLayout, Snackbar.LENGTH_LONG);
snackbar.show();
View view = snackbar.getView();
TextView tv = (TextView) view.findViewById(R.id.snackbar_action);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
snackbar.dismiss();
}
});
private static ViewGroup findSuitableParent(View view) {
ViewGroup fallback = null;
do {
if (view instanceof CoordinatorLayout) {
// We've found a CoordinatorLayout, use it
return (ViewGroup) view;
} else if (view instanceof FrameLayout) {
if (view.getId() == android.R.id.content) {
// If we've hit the decor content view, then we didn't find a CoL in the
// hierarchy, so use it.
return (ViewGroup) view;
} else {
// It's not the content view but we'll use it as our fallback
fallback = (ViewGroup) view;
}
}
if (view != null) {
// Else, we will loop and crawl up the view hierarchy and try to find a parent
final ViewParent parent = view.getParent();
view = parent instanceof View ? (View) parent : null;
}
} while (view != null);
// If we reach here then we didn't find a CoL or a suitable content view so we'll fallback
return fallback;
}
View custom = LayoutInflater.from(this).inflate(R.layout.custom_view, null);
snackbar.getView().setPadding(0,0,0,0);
((ViewGroup) snackbar.getView()).removeAllViews();
((ViewGroup) snackbar.getView()).addView(custom);
TextView textView = custom.findViewById(R.id.text);
View button = custom.findViewById(R.id.button);
textView.setText("Your text here");
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// do something
}
});
private fun showSnackbar() {
val snackbar = Snackbar.make(
binding.root,
"",
Snackbar.LENGTH_INDEFINITE
)
(snackbar.view as Snackbar.SnackbarLayout).apply {
findViewById<View>(R.id.snackbar_text).visibility = View.INVISIBLE
findViewById<View>(R.id.snackbar_action).visibility = View.INVISIBLE
val snackbarBinding = DataBindingUtil.inflate<SnackbarBinding>(
LayoutInflater.from(this@SnackbarActivity),
R.layout.snackbar,
binding.root as ViewGroup,
false
)
setPadding(0, 0, 0, 0)
addView(snackbarBinding.root, 0)
}
snackbar.setDuration(8000).show()
}
class CustomSnackbar(private val view: View) {
fun showSnackBar(title: String, cancelFun: () -> Unit = {}) {
val snackView = View.inflate(view.context, R.layout.snackbar, null)
val binding = SnackbarBinding.bind(snackView)
val snackbar = Snackbar.make(view, "", Snackbar.LENGTH_LONG)
(snackbar.view as ViewGroup).removeAllViews()
(snackbar.view as ViewGroup).addView(binding.root)
snackbar.view.setPadding(0, 0, 0, 0)
snackbar.view.elevation = 0f
snackbar.setBackgroundTint(
ContextCompat.getColor(
view.context,
android.R.color.transparent
)
)
binding.tvTitle.text = title
binding.btnCancel.setOnClickListener {
cancelFun()
snackbar.dismiss()
}
snackbar.show()
}
}