Jim
Jim

Reputation: 113

Customview like Toast

I have a customview. I want to show the customview like a toast in android.

Toast.makeText(getApplicationContext(),"text",Toast.LENGTH_LONG).show()

That is, i want my custom view to showup anywhere in the app(globally within the app) by changing basic attributes like text.

Please point me in the right direction.

Please note: I dont want to use addView() and removeView() to add and remove custom view. Customizing Toast will also not work in my case because i need to use this customview.

Upvotes: 1

Views: 2127

Answers (3)

Dharmishtha
Dharmishtha

Reputation: 1343

Create common method in Common.java file.

public static void displayCustomToast(Activity activity, String message, String length) {

    // if you want to set typeface for toast text then use this //
    Typeface tfShruti = Typeface.createFromAsset(activity.getAssets(), "fonts/shruti.ttf");

    LayoutInflater inflater = activity.getLayoutInflater();

    View layout = inflater.inflate(R.layout.custom_layout,
            (ViewGroup) activity.findViewById(R.id.custom_toast_layout_id));
    // set a message
    TextView text = (TextView) layout.findViewById(R.id.tv_toast);
    text.setText(message);
    text.setTypeface(tfShruti);

    // Toast...
    Toast toast = new Toast(activity.getApplicationContext());
    toast.setGravity(Gravity.BOTTOM, 0, 0);
    //toast.setMargin(0,10);
    //toast.setGravity(Gravity.TOP | Gravity.LEFT, 40, 60);
    //toast.setDuration(Toast.LENGTH_LONG);

    if (length.equalsIgnoreCase("short")) {
        toast.setDuration(Toast.LENGTH_SHORT);
    } else {
        toast.setDuration(Toast.LENGTH_LONG);
    }
    toast.setView(layout);
    toast.show();
}

Create layout like this .

custom_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/custom_toast_layout_id"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="20dp"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    android:background="@drawable/rectangle_fill_black_color"
    android:orientation="vertical"
    android:padding="5dp">

    <TextView
        android:id="@+id/tv_toast"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello"
        android:textColor="#ffffff"
        android:textSize="17sp" />


</LinearLayout>

Then use this method anywhere in project like this.

 Common.displayCustomToast(activity, message, "long"); 

or

 Common.displayCustomToast(activity, context.getResources().getString(R.string.please_check_internet), "short");

Upvotes: 0

Abhishek
Abhishek

Reputation: 3398

Its really easy you can do it by extending Toast class

Let say My Custom Toast calss is NexoolCustomToast which extends Toast class. Below is the code of custom Toast Class.

   import android.app.Activity;
   import android.app.Application;
   import android.content.Context;
   import android.view.Gravity;
   import android.view.LayoutInflater;
   import android.view.View;
   import android.widget.TextView;
   import android.widget.Toast;

   /**
    * Created by Abhishek on 24-03-2017.
    */

   /**
    * By Default shows Error i.e. Fail toast
    * */
   public class NexoolCustomToast extends Toast {

       private Context mContext;

       private View mView;

       private LayoutInflater mLayoutInflater;

       private TextView mTitleTextView, mMessageTextView;

       /**
        * Construct an empty Toast object.  You must call {@link #setView} before you
        * can call {@link #show}.
        *
        * @param context The context to use.  Usually your {@link Application}
        *                or {@link Activity} object.
        */
       public NexoolCustomToast(Context context) {
           super(context);
           mContext = context;
           mLayoutInflater = LayoutInflater.from(context);
           mView = mLayoutInflater.inflate(R.layout.nexool_fail_custom_toast, null);
           initialiseView(mView);
           setView(mView);
           setGravity(Gravity.TOP | Gravity.END, 0, 0);
       }

       public NexoolCustomToast(Context context, boolean state) {
           super(context);
           mContext = context;
           mLayoutInflater = LayoutInflater.from(context);
           if (state) {
               mView = mLayoutInflater.inflate(R.layout.nexool_success_custom_toast, null);
           } else {
               mView = mLayoutInflater.inflate(R.layout.nexool_fail_custom_toast, null);
           }
           initialiseView(mView);
           setView(mView);
           setGravity(Gravity.TOP | Gravity.END, 0, 0);
       }

       private void initialiseView(View mView) {

           mTitleTextView = (TextView) mView.findViewById(R.id.titleTextView);

           mMessageTextView = (TextView) mView.findViewById(R.id.messageTextView);

       }

       public void setTitle(String title) {

           if (title != null && title.length() != 0) {

               mTitleTextView.setText(title);

           } else {

               mTitleTextView.setVisibility(View.GONE);

           }

       }

       public void setMessage(String message) {

           if (message != null && message.length() != 0) {

               mMessageTextView.setText(message);

           } else {

               mMessageTextView.setVisibility(View.GONE);

           }

       }

       @Override
       public void show() {
           super.show();
       }

       @Override
       public void cancel() {
           super.cancel();
       }

       public static NexoolCustomToast makeText(Context mContext, String mTitle, String mMessage) {
           NexoolCustomToast mNexoolCustomToast = new NexoolCustomToast(mContext);

           mNexoolCustomToast.setTitle(mTitle);

           mNexoolCustomToast.setMessage(mMessage);

           return mNexoolCustomToast;
       }

       public static NexoolCustomToast makeText(Context mContext, String mTitle, String mMessage, boolean state) {
           NexoolCustomToast mNexoolCustomToast = new NexoolCustomToast(mContext, state);

           mNexoolCustomToast.setTitle(mTitle);

           mNexoolCustomToast.setMessage(mMessage);

           return mNexoolCustomToast;
       }
   }

In this class I am using xml layout from nexool_fail_custom_toast.xml, nexool_success_custom_toast.xml with four layout screen size(layout-large, layout-normal, layout-small, layout-xlarge).

      //layout-large/nexool_fail_custom_toast.xml
      <?xml version="1.0" encoding="utf-8"?>
      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/transparent">

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:background="@android:color/white"
                android:layout_alignParentEnd="true"
                android:layout_marginTop="?android:attr/actionBarSize"
                android:layout_marginBottom="15dp"
                android:layout_marginRight="15dp"
                android:elevation="5dp">

                <ImageButton
                    android:id="@+id/cancelToastImageButton"
                    android:layout_width="25dp"
                    android:layout_height="match_parent"
                    android:background="@android:color/holo_red_dark"
                    android:scaleType="centerInside"/>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    android:padding="15dp">

                    <TextView
                        android:id="@+id/titleTextView"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="Error Title"
                        android:minWidth="300sp"
                        android:textColor="@android:color/holo_red_dark"
                        android:textAppearance="?android:attr/textAppearanceMedium" />

                    <TextView
                        android:id="@+id/messageTextView"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="Error Message"
                        android:minWidth="300sp"
                        android:paddingTop="10dp"
                        android:textColor="@android:color/black"
                        android:textAppearance="?android:attr/textAppearanceSmall"/>

                </LinearLayout>


            </LinearLayout>

        </RelativeLayout>







       //layout-large/nexool_success_custom_toast.xml
       <?xml version="1.0" encoding="utf-8"?>
       <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:background="@android:color/transparent">

           <LinearLayout
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:orientation="horizontal"
               android:background="@android:color/white"
               android:layout_alignParentEnd="true"
               android:layout_marginTop="?android:attr/actionBarSize"
               android:layout_marginBottom="15dp"
               android:layout_marginRight="15dp"
               android:elevation="5dp">

               <ImageButton
                   android:id="@+id/cancelToastImageButton"
                   android:layout_width="25dp"
                   android:layout_height="match_parent"
                   android:background="@android:color/holo_green_light"
                   android:scaleType="centerInside"/>

               <LinearLayout
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:orientation="vertical"
                   android:padding="15dp">

                   <TextView
                       android:id="@+id/titleTextView"
                       android:layout_width="match_parent"
                       android:layout_height="wrap_content"
                       android:text="Error Title"
                       android:minWidth="300sp"
                       android:textColor="@android:color/holo_green_light"
                       android:textAppearance="?android:attr/textAppearanceMedium" />

                   <TextView
                       android:id="@+id/messageTextView"
                       android:layout_width="match_parent"
                       android:layout_height="wrap_content"
                       android:text="Error Message"
                       android:minWidth="300sp"
                       android:paddingTop="10dp"
                       android:textColor="@android:color/black"
                       android:textAppearance="?android:attr/textAppearanceSmall"/>

               </LinearLayout>


               </LinearLayout>

               </RelativeLayout>

Now make above two xml files for layout-small, layout-normal, layout-xlarge by changing text size or width and height of views which are inside of these files.

** How to use **

For green success layout

    NexoolCustomToast.makeText(mContext, "Success", "Success Message", true).show();

For red failure layout

    NexoolCustomToast.makeText(mContext, "Fail", "Fail Message", false).show();

    //OR

    NexoolCustomToast.makeText(mContext, "Fail", "Fail Message").show();

Custom Toast

Upvotes: 4

Hemant Parmar
Hemant Parmar

Reputation: 3976

You can own custom toast, method will take text and show.have look.

public void showToast(String msg) {

        LayoutInflater li = getLayoutInflater();
        View layout = li.inflate(R.layout.custom_toast,
        (ViewGroup) findViewById(R.id.custom_toast_layout));
        TextView toastmsg = (TextView) layout.findViewById(R.id.custom_toast_message);
        toastmsg.setText(msg);
        Toast toast = new Toast(this);
        toast.setDuration(Toast.LENGTH_LONG);
        toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
        toast.setView(layout);
        toast.show();


    }

custom_toast_message.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:gravity="center"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/custom_toast_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/toast_bg"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/custom_toast_image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:contentDescription="Custom Toast"
            android:padding="15dp"
            android:src="@drawable/icon_toast_alert" />

        <TextView
            android:id="@+id/custom_toast_message"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:contentDescription="Custom Toast"
            android:padding="15dp"
            android:text="Custom Toast"
            android:textAlignment="center"
            android:textColor="@color/colorWhite"
            android:textSize="18sp" />
    </LinearLayout>

</LinearLayout>

custom toast look like this:

enter image description here

Happy coding!!

Upvotes: 3

Related Questions