Reputation: 113
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
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
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();
Upvotes: 4
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:
Happy coding!!
Upvotes: 3