Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set height of Snackbar in Android

I have a Snackbar in need to set its height or set height to wrap content. Is there any way?

Snackbar snack = Snackbar.make(findViewById(R.id.activity_container), "Message", Snackbar.LENGTH_SHORT);

View view = snack.getView();
TextView tv = (TextView) view.findViewById(android.support.design.R.id.snackbar_text);
view.setBackgroundColor(Color.RED);
tv.setTextColor(Color.WHITE);
tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
tv.setGravity(Gravity.CENTER_HORIZONTAL);
like image 588
user8076850 Avatar asked Feb 05 '23 08:02

user8076850


2 Answers

We are going to provide multiple answers. First a statement or two! You can set the height and width of a Snackbar but it is messy and time consuming period. One realization about a Snackbar widget is most tutorials do not talk about styling. The opinion is they should be just the size that the widget gives you NOT MY VIEW. So we have noticed that the text size and number of max lines plays a BIG roll is the size of a well styled Snackbar. So design your Snackbar and style away OK how to implement the mess Suggestion DO NOT DO THIS declare this variable where you would declare any other variable in your Activity

 RelativeLayout rl;

Then when you need to increase the size of your RelativeLayout that is in your XML file but is not the root Layout in this case use this code

    rl = (RelativeLayout) findViewById(R.id.svRL);
    rl.getLayoutParams().height = 1480;

When you get done with this increased size which can mess with the size of other object in the root Layout you might want to set the size of the root Layout back to what it was. In this case the root Layout was set to layout height 615dp we are working with a Nexus 7 Tablet. If you have not noticed this yet here is the MESS part that 1480 is in units of pixels and you need it in dp. I am sure the conversion can be made just do not ask me. So here is the set back line of code

 rl.getLayoutParams().height = 1230;

Now for a easy way to design and style two types of Snackbar's one with an Action button and one with out. First you need a CoordinatorLayout in what ever Activity corresponding XML file that looks like this Note it has an id

        <android.support.design.widget.CoordinatorLayout
        android:id="@+id/coorSB"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true" >
        <!-- android.support.design.widget.SnackBar -->

        <!--stuff you want inside the coordinator ... -->
    </android.support.design.widget.CoordinatorLayout>

Now we are ready to do some work in the Activity to design and style after a little advanced string and color set up. Please do not be offended I am being very thorough because you seem to be very new to programming.

    <string name="snackbar_text">I Am a NEW SnackBAR TEXT</string>
<string name="snackbar_action">EXIT</string>
<string name="second_text">Second Text</string>
<string name="csb_text">I am the Custom Guy</string>
<string name="csb_action">EXIT</string>
<string name="the_text">Password must have one Numeric Value\n"
"One Upper &amp; Lower Case Letters\n"
"One Special Character $ @ ! % * ? &amp;\n"
"NO Spaces in the PASSWORD"</string>

Now for the Rainbow many ways to manage Color this is my mine.

<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303f9f</color>
<color name="colorAccent">#FF4081</color>
<color name="color_Black">#000000</color>
<color name="color_White">#FFFFFF</color>
<color name="color_darkGray">#606060</color>
<color name="color_lightGray">#C0C0C0</color>
<color name="color_super_lightGray">#E0E0E0</color>
<color name="color_Red">#FF0000</color>
<color name="color_Yellow">#FFFF66</color>
<color name="color_deepBlue">#0000ff</color>
<color name="color_lightBlue">#3333FF</color>
<color name="color_Purple">#9C27B0</color>
<color name="color_Transparent">@android:color/transparent</color>

Done with house keeping in your Activity where you declare variables add this

    private CoordinatorLayout myLayout;
Snackbar sb = null;

private CoordinatorLayout noActLayout;
Snackbar sbNoAct = null;

There here is the implementation of both types of Snackbars

    public void makeNoAct(View view){
        // this is declared on a Button android:onClick="makeNoAct"
    noActLayout = (CoordinatorLayout)findViewById(R.id.coorSB);

    sbNoAct = Snackbar.make(noActLayout,R.string.the_text,1);// any interger will make it happy
            sbNoAct.setDuration(3000);// 3 sec               // OR Snackbar.LENGTH_LONG
                                                             // matters NOT you are setting duration
    View sbView = sbNoAct.getView();
    sbView.setBackgroundColor(ContextCompat.getColor(this, R.color.color_Black));
    TextView textViewNoAct = (TextView) sbView.findViewById(android.support.design.R.id.snackbar_text);
    //set text color
    textViewNoAct.setTextColor(ContextCompat.getColor(this,R.color.color_Yellow));
    textViewNoAct.setMaxLines(10);
    textViewNoAct.setTextSize(24);
    //increase max lines of text in snackbar. default is 2.
    sbNoAct.show();

    int height = sbView.getHeight();
    etNewData.setText(String.valueOf(height));

}

public void makeCOOR(View view) {
    // this is declared on a Button android:onClick="makeCOOR"
    // We were to Lazy to write an OnClickListener
    myLayout = (CoordinatorLayout) findViewById(R.id.coorSB);

    sb = Snackbar.make(myLayout, R.string.csb_text, Snackbar.LENGTH_INDEFINITE)
            .setAction(R.string.csb_action, myOnClickListener)
            .setActionTextColor(ContextCompat.getColor(context, R.color.color_Red));

    View sbView = sb.getView();
    sbView.setBackgroundColor(ContextCompat.getColor(this, R.color.color_White));
    TextView textView = (TextView) sbView.findViewById(android.support.design.R.id.snackbar_text);
    //set text color
    textView.setTextColor(ContextCompat.getColor(this,R.color.color_deepBlue));
    textView.setTextSize(30);
    //increase max lines of text in snackbar. default is 2.
    textView.setMaxLines(10);
    // NOTE new View
    TextView textAction = (TextView) sbView.findViewById(android.support.design.R.id.snackbar_action);
    //set Action text color
    textAction.setTextColor(ContextCompat.getColor(this,R.color.color_Red));
    textAction.setTextSize(30);
            sb.show();
    }

    View.OnClickListener myOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // OR use and Intent to go somewhere have a nice trip
            sb.dismiss();
            System.out.println("========= I WAS DISMISSED ===============");
        }
    };

Enjoy the code and let us know with a comment if this solves your issue.

like image 144
Vector Avatar answered Feb 06 '23 22:02

Vector


This is very simple to change the height or width of Snackbar . Just we need to write 2 , 3 line of code to do this. Check the below code snippet .

Snackbar snackbar =   Snackbar.make(view, "Your message", Snackbar.LENGTH_LONG);
        snackbar.setAction("Ok", new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        //your click action.
                    }
                });

        Snackbar.SnackbarLayout layout = (Snackbar.SnackbarLayout)snackbar.getView();
        layout.setMinimumHeight(50);//your custom height.
        snackbar.show();
like image 36
Deepak gupta Avatar answered Feb 06 '23 22:02

Deepak gupta