Custom toast message in all screens?

痴心易碎 提交于 2019-12-22 00:11:28

问题


I have developed one application which has 15 screens. Now I want to display custom toast message in all those 15 screens. To do so, I have inflated one layout. But it's working only on one screen. So, I wrote a single method to display custom Toast on all screens. Whenever I want to display toast message, I would just call that method. But i got java.lang.NullPointerException. How to resolve this? The following is my code,

public static void showToastMessage(String message){

               LayoutInflater inflater = ((Activity) context).getLayoutInflater();

                View layout = inflater.inflate(R.layout.custom_toast,
                  (ViewGroup) ((Activity) context).findViewById(R.id.customToast));
            // set a message
                TextView text = (TextView) layout.findViewById(R.id.text);
                text.setText(message);

                // Toast...
                Toast toast = new Toast(context);
                toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
                toast.setDuration(Toast.LENGTH_LONG);
                toast.setView(layout);
                toast.show();
           }

Log is

java.lang.NullPointerException

    at com.guayama.utilities.CommonMethods.showToastMessage(CommonMethods.java:474)

    at android.view.View.performClick(View.java:3511)

    at android.view.View$PerformClick.run(View.java:14105)

    at android.os.Handler.handleCallback(Handler.java:605)

    at android.os.Handler.dispatchMessage(Handler.java:92)

    at android.os.Looper.loop(Looper.java:137)

    at android.app.ActivityThread.main(ActivityThread.java:4424)

    at java.lang.reflect.Method.invokeNative(Native Method)

回答1:


change your method

from

showToastMessage(String message)

to

showToastMessage(Context context,String message);

it seems context problem to me

your function will look like this

public static void showToastMessage(Context context,String message){

               LayoutInflater inflater = context.getLayoutInflater();

                View layout = inflater.inflate(R.layout.custom_toast,
                  (ViewGroup) ((Activity) context).findViewById(R.id.customToast));
            // set a message
                TextView text = (TextView) layout.findViewById(R.id.text);
                text.setText(message);

                // Toast...
                Toast toast = new Toast(context);
                toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
                toast.setDuration(Toast.LENGTH_LONG);
                toast.setView(layout);
                toast.show();
           }



回答2:


A custom class implementation of Toast that can be used in any project.

public class ToastMessage {
        private Context context;
        private static ToastMessage instance;

    /**
     * @para
   m context
     */
    private ToastMessage(Context context) {
        this.context = context;
    }

    /**
     * @param context
     * @return
     */
    public synchronized static ToastMessage getInstance(Context context) {
        if (instance == null) {
            instance = new ToastMessage(context);
        }
        return instance;
    }

    /**
     * @param message
     */
    public void showLongMessage(String message) {
        Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
    }

    /**
     * @param message
     */
    public void showSmallMessage(String message) {
        Toast.makeText(context, message, Toast.LENGTH_LONG).show();
    }

    /**
     * The Toast displayed via this method will display it for short period of time
     *
     * @param message
     */
    public void showLongCustomToast(String message) {

        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        View layout = inflater.inflate(R.layout.layout_custom_toast, (ViewGroup) ((Activity) context).findViewById(R.id.ll_toast));
        TextView msgTv = (TextView) layout.findViewById(R.id.tv_msg);
        msgTv.setText(message);
        Toast toast = new Toast(context);
        toast.setGravity(Gravity.FILL_HORIZONTAL | Gravity.BOTTOM, 0, 0);
        toast.setDuration(Toast.LENGTH_LONG);
        toast.setView(layout);
        toast.show();

    }

    /**
     * The toast displayed by this class will display it for long period of time
     *
     * @param message
     */
    public void showSmallCustomToast(String message) {

        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        View layout = inflater.inflate(R.layout.layout_custom_toast, (ViewGroup) ((Activity) context).findViewById(R.id.ll_toast));
        TextView msgTv = (TextView) layout.findViewById(R.id.tv_msg);
        msgTv.setText(message);
        Toast toast = new Toast(context);
        toast.setGravity(Gravity.FILL_HORIZONTAL | Gravity.BOTTOM, 0, 0);
        toast.setDuration(Toast.LENGTH_SHORT);
        toast.setView(layout);
        toast.show();
    }

}



回答3:


pass Context in and use it as showToastMessage(String message,Context context)

thus:

public static void showToastMessage(String message){
   LayoutInflater inflater = ((Activity) context).getLayoutInflater();
   View layout = inflater.inflate(R.layout.custom_toast,
   (ViewGroup) ((Activity) context).findViewById(R.id.customToast));
   // set a message
   TextView text = (TextView) layout.findViewById(R.id.text);
   text.setText(message);

   // Toast...
   Toast toast = new Toast(context);
   toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
   toast.setDuration(Toast.LENGTH_LONG);
   toast.setView(layout);
   toast.show();
}



回答4:


I think this is the problem,

(Activity) context

You have not passed the context object to this method and you are trying to refer some Context Object which you could have declared globally.

So at this point if your Context Object is null you will get NullPointer. Try to pass the conetxt of your Current Activity in the parameter of your showToastMessage()




回答5:


I have worked on custom toast so please follow the below process and you will use the common method for multiple time.

My custom_toast.xml is:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/custom_toast_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@color/white">

    <android.support.v7.widget.CardView
        android:id="@+id/card_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        card_view:cardBackgroundColor="@color/grey"
        card_view:cardCornerRadius="6dp"
        card_view:cardElevation="6dp"
        card_view:contentPadding="25dp"
       >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center">

            <ImageView
                android:id="@+id/custom_toast_image"
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:gravity="center_vertical"
                android:src="@drawable/ic_launcher"/>

            <TextView
                android:id="@+id/custom_toast_message"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center_vertical"
                android:textSize="16dp"/>

        </LinearLayout>

    </android.support.v7.widget.CardView>
</LinearLayout>

Second thing create one java class: like CustomToast.java

public class CustomToast {
Context context;



public static void showToastMessage(Context context,String message){

    LayoutInflater inflater = ((Activity) context).getLayoutInflater();

    View layout = inflater.inflate(R.layout.customtoast,
            (ViewGroup) ((Activity) context).findViewById(R.id.custom_toast_layout));
    // set a message
    TextView text = (TextView) layout.findViewById(R.id.custom_toast_message);
    text.setText(message);

    // Toast...
    Toast toast = new Toast(context);
    toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
    toast.setDuration(Toast.LENGTH_LONG);
    toast.setView(layout);
    toast.show();
}

}

Third step create the object of CustomToast.java class in your activity and call the method by passing context and message.

 CustomToast customToast=new CustomToast();
  customToast.showToastMessage(ctx,message);


来源:https://stackoverflow.com/questions/11339980/custom-toast-message-in-all-screens

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!