自定义 Snackbar 无法正常工作

Posted

技术标签:

【中文标题】自定义 Snackbar 无法正常工作【英文标题】:Custom Snackbar doesn't work properly 【发布时间】:2016-07-28 12:14:02 【问题描述】:

我正在尝试显示一个自定义 Snackbar,如下例所示:

how to customize snackBar's layout?

这是我创建 Snackbar 的自定义代码:

protected void showSnackBar(View view) 

    Snackbar snackbar = Snackbar.make(view, "", Snackbar.LENGTH_INDEFINITE);
    Snackbar.SnackbarLayout layout = (Snackbar.SnackbarLayout) snackbar.getView();
    TextView textView = (TextView) layout.findViewById(android.support.design.R.id.snackbar_text);
    textView.setVisibility(View.INVISIBLE);

    LayoutInflater inflater = LayoutInflater.from(this);

    View snackView = inflater.inflate(R.layout.custom_snackbar, null);

    layout.addView(snackView, 0);

    ViewGroup group = (ViewGroup) snackbar.getView();
    group.setBackgroundColor(ContextCompat.getColor(this, R.color.green_wasabi));

    snackbar.show();


我的目标是在我的基础活动中有一个方法可以从任何其他活动中调用。

但我的问题是当我显示 Snackbar 时,它显示在键盘下方:

另外它没有显示布局的所有视图:

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/relativelayout_sync_schedule_runs"
android:layout_
android:layout_
android:padding="10dp"
android:background="@color/green_wasabi"
android:layout_alignParentBottom="true"
android:layout_gravity="center_horizontal|bottom">

<ProgressBar
    android:id="@+id/progressbar_infinite"
    android:layout_
    android:layout_
    style="@android:style/Widget.Material.ProgressBar.Small"
    android:layout_centerVertical="true"
    android:layout_marginRight="15dp"
    android:layout_toLeftOf="@+id/textview_sync_runs"
    android:layout_toStartOf="@+id/textview_sync_runs" />


<com.runator.ui.widget.text.CustomTextView
    android:id="@+id/textview_sync_runs"
    android:layout_
    android:layout_
    android:text="@string/import_runs"
    android:textColor="@color/black_midnight"
    style="@style/texts.medium_medium_big"
    app:font_type="bold"
    android:gravity="center"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"/>

如果有人有任何建议,我很乐意听到。

提前致谢。

【问题讨论】:

你能分享你属于 BaseActivity 的 layout.xml 文件吗? 我的 BaseActivity 没有布局 您似乎正在使用半透明导航栏(在您的样式/主题中设置或以编程方式设置)。这就是为什么您的布局会延伸到显示屏的整个高度,并且您的快餐栏会附加在底部。您可以尝试将 android:fitsSystemWindows="true" 添加到布局中的父元素,但内容不会延伸到导航栏后面。如果您仍然希望内容在其后面伸展,但将零食放在顶部,则必须在显示时以编程方式更改其位置。 【参考方案1】:

你能试试在你的 Baseactivity 上添加 Snackbar 的代码吗?

Snackbar snackbar = Snackbar.make( rootView, text, Snackbar.LENGTH_LONG );
View snackBarView = snackbar.getView();
snackBarView.setBackgroundColor( this.mContext.getResources().getColor( R.color.pepapp_bright_red ) );
snackbar.show();

【讨论】:

花同样的问题【参考方案2】:

首先,您不需要以编程方式设置背景颜色,因为您已经在 xml 文件中这样做了,所以删除这些行

ViewGroup group = (ViewGroup) snackbar.getView();
group.setBackgroundColor(ContextCompat.getColor(this, R.color.green_wasabi));

其次,尝试将活动的Coordinator Layout作为参数传递,而不是Linear/Relative Layout,即在活动中添加协调器布局作为父布局并传递它。

检查 xml 视图中协调器布局的布局边界。它不应该扩展活动范围。

【讨论】:

工作正常!谢谢!!【参考方案3】:

下面的代码与 Snackbar 相同,但包含自定义(UI、动画、动作...)组件。

public class CustomSnackBar extends 
        BaseTransientBottomBar<CustomSnackBar> 

    /**
     * Time duration till the snackbar is visible to user
     */
    public static final int DURATION_SEC_2 = 2000;

    /**
     * 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.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 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Snackbar 的高度自定义

将自定义图像 UIButtons 添加到自定义 UIToolbar 无法正常工作

使用自定义 AbstractAuthenticationProcessingFilter 和自定义 CustomAuthenticationProvider 的身份验证无法正常工作

使用可下载字体作为自定义 Snackbar 字体

自定义 UISlider 图像无法正常工作

Magento MAGMI - 自定义选项无法正常工作