How to show Snackbar at top of the screen

后端 未结 9 1649
梦谈多话
梦谈多话 2020-12-02 07:33

As the Android documentation says

Snackbars provide lightweight feedback about an operation. They show a brief message at the bottom

相关标签:
9条回答
  • 2020-12-02 08:07

    Kotlin-

        val snackBarView = Snackbar.make(view, "SnackBar Message" , Snackbar.LENGTH_LONG)
        val view = snackBarView.view
        val params = view.layoutParams as FrameLayout.LayoutParams
        params.gravity = Gravity.TOP
        view.layoutParams = params
        view.background = ContextCompat.getDrawable(context,R.drawable.custom_drawable) // for custom background
        snackBarView.animationMode = BaseTransientBottomBar.ANIMATION_MODE_FADE
        snackBarView.show()
    

    below line will resolve the animation issue.

    snackBarView.animationMode = BaseTransientBottomBar.ANIMATION_MODE_FADE
    

    Alternate solution- snackBarView.anchorView = mention viewId above whom you want to show SnackBar

    0 讨论(0)
  • 2020-12-02 08:12

    It is possible to make the snackbar appear on top of the screen using this:

    Snackbar snack = Snackbar.make(parentLayout, str, Snackbar.LENGTH_LONG);
    View view = snack.getView();
    FrameLayout.LayoutParams params =(FrameLayout.LayoutParams)view.getLayoutParams();
    params.gravity = Gravity.TOP;
    view.setLayoutParams(params);
    snack.show();
    

    From the OP:

    I had to change the first line:

    Snackbar snack = Snackbar.make(findViewById(android.R.id.content), "Had a snack at Snackbar", Snackbar.LENGTH_LONG);
    
    0 讨论(0)
  • 2020-12-02 08:12

    to show Snackbar at top of the screen (kotlin)

    // Custom snackbar : banner model
                val customSnackBar   = Snackbar.make(snackbar_id, "", Snackbar.LENGTH_INDEFINITE)
    
                val view = customSnackBar.view
                val params = view.layoutParams as CoordinatorLayout.LayoutParams
                params.gravity = Gravity.TOP
                view.layoutParams = params
    
                val layout           = customSnackBar.view as Snackbar.SnackbarLayout
                val customSnackView  = layoutInflater.inflate(R.layout.snackbar_banner, null)
    
                val actionButton1   = customSnackView.findViewById(R.id.action_button_1) as MaterialButton
                actionButton1.setOnClickListener {
                    customSnackBar.dismiss()
                }
                val actionButton   = customSnackView.findViewById(R.id.action_button_2) as MaterialButton
                actionButton.setOnClickListener {
                    customSnackBar.dismiss()
                }
    
                // We can also customize the above controls
                layout.setPadding(0, 0, 0, 0)
                layout.addView(customSnackView, 0)
    
    
                customSnackBar.show()
    

    XML:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:background="@android:color/white"
       >
    
        <TextView
            android:padding="16dp"
            android:gravity="center"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/snackbar_banner_message"
            android:textColor="@android:color/black"
            android:textSize="16sp" />
    
        <LinearLayout
            android:gravity="end"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:orientation="horizontal">
    
            <com.google.android.material.button.MaterialButton
                android:id="@+id/action_button_1"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginEnd="8dp"
                android:layout_weight="1"
                android:background="@android:color/black"
                android:text="Close"
                style="@style/Widget.MaterialComponents.Button.TextButton"
               />
    
            <com.google.android.material.button.MaterialButton
                android:id="@+id/action_button_2"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@android:color/black"
                android:text="Fix it"
                android:textStyle="bold"
                style="@style/Widget.MaterialComponents.Button.TextButton"
               />
    
        </LinearLayout>
    
    </LinearLayout>
    

    0 讨论(0)
  • 2020-12-02 08:13

    Before displaying the Snackbar, please add the following code

    View snackbarView = snackbar.getView();
    
    FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) snackbarView.getLayoutParams();
    params.gravity = Gravity.TOP;
    snackbarView.setLayoutParams(params);
    snackbarView.startAnimation(AnimationUtils.loadAnimation(host, R.anim.slide_in_snack_bar));
    

    And when dismiss()

    View snackbarView = snackbar.getView();
      
    snackbarView.startAnimation(AnimationUtils.loadAnimation(_snackbar.getContext(), R.anim.slide_out_snack_bar));
    snackbar.dismiss()
    

    slide_in_snack_bar.xml

    <translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_longAnimTime"
    android:fromYDelta="-100%p"
    android:toYDelta="0%p" />
    

    slide_out_snack_bar.xml

    <translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_longAnimTime"
    android:fromYDelta="0%p"
    android:toYDelta="-100%p" />
    
    0 讨论(0)
  • 2020-12-02 08:16

    Combined solution from the above ones:

    final ViewGroup.LayoutParams params = snackbar.getView().getLayoutParams();
    if (params instanceof CoordinatorLayout.LayoutParams) {
        ((CoordinatorLayout.LayoutParams) params).gravity = Gravity.TOP;
    } else {
        ((FrameLayout.LayoutParams) params).gravity = Gravity.TOP;
    }
    snackbar.getView().setLayoutParams(params);
    

    Still suffers from the improper animation.

    0 讨论(0)
  • 2020-12-02 08:23

    2 years later, here's my solution..

    Setting the Top and Bottom Margin changes the effect result,... I have tried to add as much customization options as i could, Overriding the animation is another option not written here.

    Thanks to everyone's answers on several questions...

    {
        // usage for setSnackBar
        int view = R.id.toolbar;
        String snackMessage = "";
        boolean useAction = false;
        Runnable ifUseActionRunnable = null;
        String actionText = "";
        int leftMargin = 0;
        int topMargin = 0;
        int rightMargin = 0;
        int bottomMargin = 0;
        int backgroundColour = Color.BLACK;
        int textColor = Color.WHITE;
        int duration = Snackbar.LENGTH_LONG;
        setSnackBar(view, snackMessage, useAction, ifUseActionRunnable, actionText, leftMargin, topMargin, rightMargin, bottomMargin, backgroundColour, textColor, duration);
    
    }
    
    Snackbar snb;
    public void setSnackBar(int targetView, String snackMessage, boolean useAction, final Runnable ifUseActionRunnable, String actionText , int leftMargin, int topMargin, int rightMargin, int bottomMargin, int backgroundColour, int textColor, int duration)
    {
        snb = Snackbar.make(findViewById(targetView), snackMessage, duration);
        View view = snb.getView();
        view.setBackgroundColor(backgroundColour);
        snb.setActionTextColor(textColor);
        FrameLayout.LayoutParams params =(FrameLayout.LayoutParams)view.getLayoutParams();
        params.gravity =  Gravity.CENTER_HORIZONTAL | Gravity.TOP;
        params.setMargins(leftMargin, topMargin, rightMargin, bottomMargin);
        view.setLayoutParams(params);
        if (useAction)
        {
            snb.setAction(actionText, new View.OnClickListener(){
                    @Override
                    public void onClick(View p1)
                    {
                        ifUseActionRunnable.run();
    
                    }
                });
        }
        if (snb.isShown())
        {
            snb.dismiss();
            snb.show();
        }
        else
        {
            snb.show();
        }
    }
    
    0 讨论(0)
提交回复
热议问题