Benutzerdefinierter Toast auf Android: ein einfaches Beispiel


116

Ich bin neu in der Android-Programmierung. Was ist ein einfaches Beispiel für eine benutzerdefinierte Toastbenachrichtigung unter Android?


Was meinst du mit Custom Toast? was versuchst du zu zeigen
Thepoosh

Das ist keine wirkliche Frage. Sie sollten versuchen, Dokumente unter developer.android
adatapost

Ich habe ein benutzerdefiniertes Meldungsfeld. Wenn Sie es anpassen und einen Timer hinzufügen und sein Erscheinungsbild ändern können, poste ich es für Sie. Können Sie?
Bobs

1
Hier finden Sie ein grundlegendes Beispiel für "Custom Toast" stackoverflow.com/questions/3500197/…
Jorgesys

Antworten:


197

Verwenden Sie den folgenden Code eines benutzerdefinierten Toasts. Es kann Ihnen helfen.

toast.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toast_layout_root"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp"
    android:background="#DAAA" >

    <ImageView android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginRight="10dp" />

    <TextView android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:textColor="#FFF" />

</LinearLayout>

MainActivity.java

LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.toast_layout,
                               (ViewGroup) findViewById(R.id.toast_layout_root));

ImageView image = (ImageView) layout.findViewById(R.id.image);
image.setImageResource(R.drawable.android);
TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("Hello! This is a custom toast!");

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

Schauen Sie sich auch die folgenden Links an, um einen benutzerdefinierten Toast zu erhalten.

Kundenspezifischer Toast mit analoger Uhr

YouTube: Erstellen eines benutzerdefinierten Toasts mit der Schaltfläche in Android Studio


8
"(ViewGroup) findViewById (R.id.toast_layout_root)" kann durch "null" ersetzt werden. Da Ihre Aktivität kein toast_layout enthält, ist sie sowieso immer null.
stevo.mit

2
Mein benutzerdefinierter Toast wurde nicht angezeigt, da ich das neue Einschränkungslayout als Stammansicht meines benutzerdefinierten Toasts verwendet habe. Nachdem ich zu Linear Layout gewechselt hatte, funktionierte alles perfekt. Also seien Sie gewarnt ...
Charles Woodson

Kann wirklich jeder den Zweck von findViewById (R.id.toast_layout_root) erklären? es wird sowieso null sein, und es funktioniert perfekt,
wenn man

Ich kenne auch nicht den Zweck der Root-Ansicht (null), aber in den offiziellen Dokumenten ist auch vorhanden, wenn jemand erklären kann, warum, wäre toll! developer.android.com/guide/topics/ui/notifiers/toasts#java
Nestor Perez

Verwenden Sie diese Option, wenn der Absturz von findViewById null ist: View layout = inflater.inflate (R.layout.toast_layout, null);
Bita Mirshafiee

37

Ein Toast dient zum Anzeigen von Nachrichten für kurze Zeitintervalle. Nach meinem Verständnis möchten Sie es also anpassen, indem Sie ein Bild hinzufügen und Größe und Farbe des Nachrichtentextes ändern. Wenn das alles ist, was Sie tun möchten, müssen Sie kein separates Layout erstellen und es auf die Toast-Instanz aufblasen.

Die Standardansicht von Toast enthält eine TextViewzum Anzeigen von Nachrichten. Wenn wir also die Ressourcen-ID-Referenz dafür haben, TextViewkönnen wir damit spielen. Was können Sie tun, um dies zu erreichen:

Toast toast = Toast.makeText(this, "I am custom Toast!", Toast.LENGTH_LONG);
View toastView = toast.getView(); // This'll return the default View of the Toast.

/* And now you can get the TextView of the default View of the Toast. */
TextView toastMessage = (TextView) toastView.findViewById(android.R.id.message);
toastMessage.setTextSize(25);
toastMessage.setTextColor(Color.RED);
toastMessage.setCompoundDrawablesWithIntrinsicBounds(R.mipmap.ic_fly, 0, 0, 0);
toastMessage.setGravity(Gravity.CENTER);
toastMessage.setCompoundDrawablePadding(16);
toastView.setBackgroundColor(Color.CYAN);
toast.show();

Im obigen Code können Sie TextView über die gewünschte setCompoundDrawablesWithIntrinsicBounds(int left, int top, int right, int bottom)Position relativ zu TextView ein Bild hinzufügen .

Aktualisieren:

Haben eine Builder-Klasse geschrieben, um den oben genannten Zweck zu vereinfachen; Hier ist der Link: https://gist.github.com/TheLittleNaruto/6fc8f6a2b0d0583a240bd78313ba83bc

Überprüfen Sie den HowToUse.ktobigen Link.

Ausgabe:

Geben Sie hier die Bildbeschreibung ein


Es gibt sehr wenig Chancen dafür, aber ich denke trotzdem, dass ein Scheck dafür vorhanden TextViewsein sollte, nur um sicher zu gehen, und mit einem Scheck meine ich einen Nullscheck oder einen Typprüfung. Für alle Fälle beschließt Google, die ID oder Ansicht für die Anzeige von Text in der Toast-Klasse zu ändern. Wie auch immer ... +1
DroidDev

1
Wahr! Wenn es jedoch geändert wird, können Sie ohnehin nicht auf die Ressourcen-ID zugreifen, da sie nicht vorhanden ist. Aber auch wenn Sie auf der sicheren Seite sind, würde ein NULL-Check Ihr Leben leichter machen. @DroidDev danke für den Vorschlag :)
TheLittleNaruto

16

SCHRITT 1:

Erstellen Sie zunächst ein Layout für einen benutzerdefinierten Toast in res/layout/custom_toast.xml:

<?xml version="1.0" encoding="utf-8"?>
<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="fill_parent"
    android:background="#FFF"
    android:orientation="horizontal"
    android:padding="5dp" >

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:textColor="#000" />

</LinearLayout>

SCHRITT 2: Rufen Sie im Aktivitätscode die obige benutzerdefinierte Ansicht auf und hängen Sie sie an Toast an:

// Get your custom_toast.xml ayout
LayoutInflater inflater = getLayoutInflater();

View layout = inflater.inflate(R.layout.custom_toast,
(ViewGroup) findViewById(R.id.custom_toast_layout_id));

// set a message
TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("Button is clicked!");

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

Weitere Hilfe finden Sie unter Erstellen eines benutzerdefinierten Toasts in Android:

http://developer.android.com/guide/topics/ui/notifiers/toasts.html


6

Siehe Link hier . Sie finden Ihre Lösung. Und versuche:

Erstellen einer benutzerdefinierten Toastansicht

Wenn eine einfache Textnachricht nicht ausreicht, können Sie ein benutzerdefiniertes Layout für Ihre Toastbenachrichtigung erstellen. Um ein benutzerdefiniertes Layout zu erstellen, definieren Sie ein Ansichtslayout in XML oder in Ihrem Anwendungscode und übergeben Sie das Root-View-Objekt an die setView (View) -Methode.

Beispielsweise können Sie das im Screenshot rechts sichtbare Layout für den Toast mit der folgenden XML-Datei erstellen (gespeichert als toast_layout.xml):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/toast_layout_root"
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:padding="10dp"
            android:background="#DAAA"
>

    <ImageView android:id="@+id/image"
               android:layout_width="wrap_content"
               android:layout_height="fill_parent"
               android:layout_marginRight="10dp"
    />

    <TextView android:id="@+id/text"
              android:layout_width="wrap_content"
              android:layout_height="fill_parent"
              android:textColor="#FFF"
    />
</LinearLayout>

Beachten Sie, dass die ID des LinearLayout-Elements "toast_layout" lautet. Sie müssen diese ID verwenden, um das Layout aus dem XML aufzublähen, wie hier gezeigt:

 LayoutInflater inflater = getLayoutInflater();
 View layout = inflater.inflate(R.layout.toast_layout,
                                (ViewGroup) findViewById(R.id.toast_layout_root));

 ImageView image = (ImageView) layout.findViewById(R.id.image);
 image.setImageResource(R.drawable.android);
 TextView text = (TextView) layout.findViewById(R.id.text);
 text.setText("Hello! This is a custom toast!");

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

Rufen Sie zuerst den LayoutInflater mit getLayoutInflater () (oder getSystemService ()) ab und blasen Sie dann das Layout mit inflate (int, ViewGroup) aus XML auf. Der erste Parameter ist die Layout-Ressourcen-ID und der zweite die Stammansicht. Mit diesem aufgeblasenen Layout können Sie weitere Ansichtsobjekte im Layout finden. Erfassen und definieren Sie nun den Inhalt für die ImageView- und TextView-Elemente. Erstellen Sie abschließend einen neuen Toast mit Toast (Kontext) und legen Sie einige Eigenschaften des Toasts fest, z. B. die Schwerkraft und die Dauer. Rufen Sie dann setView (View) auf und übergeben Sie das aufgeblasene Layout. Sie können den Toast jetzt mit Ihrem benutzerdefinierten Layout anzeigen, indem Sie show () aufrufen.

Hinweis: Verwenden Sie den öffentlichen Konstruktor nicht für einen Toast, es sei denn, Sie definieren das Layout mit setView (View). Wenn Sie kein benutzerdefiniertes Layout verwenden können, müssen Sie makeText (Context, int, int) verwenden, um den Toast zu erstellen.


4

Benutzerdefiniertes Layout für Toast , custom_toast.xml:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Custom Toast"
        android:gravity="center"
        android:id="@+id/custom_toast_text"
        android:typeface="serif"
        android:textStyle="bold"
        />
</LinearLayout>

Und die Java-Methode (übergeben Sie einfach eine Toastnachricht an diese Methode):

public void toast(String message)
{
    Toast toast = new Toast(context);
    View view = LayoutInflater.from(context).inflate(R.layout.image_custom, null);
    TextView textView = (TextView) view.findViewById(R.id.custom_toast_text);
    textView.setText(message);
    toast.setView(view);
    toast.setGravity(Gravity.BOTTOM|Gravity.CENTER, 0, 0);
    toast.setDuration(Toast.LENGTH_LONG);
    toast.show();
}

3

Sie können den Code hier herunterladen .

Schritt 1:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btnCustomToast"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Show Custom Toast" />
  </RelativeLayout>

Schritt 2:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:gravity="center"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/custom_toast_image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/ic_launcher"/>

        <TextView
            android:id="@+id/custom_toast_message"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="My custom Toast Example Text" />

</LinearLayout>

Schritt 3:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {


    private Button btnCustomToast;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnCustomToast= (Button) findViewById(R.id.btnCustomToast);
        btnCustomToast.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // Find custom toast example layout file
                View layoutValue = LayoutInflater.from(MainActivity.this).inflate(R.layout.android_custom_toast_example, null);
                // Creating the Toast object
                Toast toast = new Toast(getApplicationContext());
                toast.setDuration(Toast.LENGTH_SHORT);

                // gravity, xOffset, yOffset
                toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
                toast.setView(layoutValue);//setting the view of custom toast layout
                toast.show();
            }
        });
    }
}

2

Ich denke, die meisten Customtoast-XML-Beispiele im Internet basieren auf derselben Quelle.

Die Android-Dokumentation, die meiner Meinung nach sehr veraltet ist. fill_parent sollte nicht mehr verwendet werden. Ich bevorzuge die Verwendung von wrap_content in Kombination mit einem xml.9.png. Auf diese Weise können Sie die Mindestgröße von Toastbackground über die Größe der bereitgestellten Quelle definieren.

Wenn komplexere Toasts erforderlich sind, sollte anstelle von LL ein Rahmen oder ein relatives Layout verwendet werden.

toast.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/points_layout"
    android:orientation="horizontal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/background"
    android:layout_gravity="center"
    android:gravity="center" >

 <TextView
    android:id="@+id/points_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:gravity="center"
    android:layout_margin="15dp"
    android:text="@+string/points_text"
    android:textColor="@color/Green" />

</LinearLayout>

background.xml

<?xml version="1.0" encoding="utf-8"?>
<nine-patch
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:src="@drawable/background_96"
   android:dither="true"/>

background_96 ist background_96.9.png.

Dies ist nicht sehr gut getestet und Hinweise sind willkommen :)


@ PeterMortensen LinearLayout
ornay odder

2

Um zu vermeiden, dass Probleme mit layout_ * -Parametern nicht ordnungsgemäß verwendet werden, müssen Sie beim Aufblasen Ihres benutzerdefinierten Layouts sicherstellen, dass Sie eine korrekte ViewGroup als übergeordnetes Element angeben.

Viele Beispiele übergeben hier null, aber stattdessen können Sie die vorhandene Toast ViewGroup als übergeordnetes Element übergeben.

val toast = Toast.makeText(this, "", Toast.LENGTH_LONG)
val layout = LayoutInflater.from(this).inflate(R.layout.view_custom_toast, toast.view.parent as? ViewGroup?)
toast.view = layout
toast.show()

Hier ersetzen wir die vorhandene Toast-Ansicht durch unsere benutzerdefinierte Ansicht. Sobald Sie einen Verweis auf Ihr Layout "Layout" haben, können Sie alle darin enthaltenen Bilder / Textansichten aktualisieren.

Diese Lösung verhindert auch, dass Abstürze "Ansicht nicht an Fenstermanager angehängt" null als übergeordnetes Element verwenden.

Vermeiden Sie außerdem die Verwendung von ConstraintLayout als benutzerdefiniertes Layout-Stammverzeichnis. Dies scheint nicht zu funktionieren, wenn es in einem Toast verwendet wird.


2

Das habe ich benutzt

AllMethodsInOne.java

public static Toast displayCustomToast(FragmentActivity mAct, String toastText, String toastLength, String succTypeColor) {

    final Toast toast;

    if (toastLength.equals("short")) {
        toast = Toast.makeText(mAct, toastText, Toast.LENGTH_SHORT);
    } else {
        toast = Toast.makeText(mAct, toastText, Toast.LENGTH_LONG);
    }

    View tView = toast.getView();
    tView.setBackgroundColor(Color.parseColor("#053a4d"));
    TextView mText = (TextView) tView.findViewById(android.R.id.message);

    mText.setTypeface(applyFont(mAct));
    mText.setShadowLayer(0, 0, 0, 0);

    tView.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            toast.cancel();
        }
    });
    tView.invalidate();
    if (succTypeColor.equals("red")) {
        mText.setTextColor(Color.parseColor("#debe33"));
        tView.setBackground(mAct.getResources().getDrawable(R.drawable.toast_rounded_red));
        // this is to show error message
    }
    if (succTypeColor.equals("green")) {
        mText.setTextColor(Color.parseColor("#053a4d"));
        tView.setBackground(mAct.getResources().getDrawable(R.drawable.toast_rounded_green));
        // this is to show success message
    }


    return toast;
}

YourFile.java

Während Sie anrufen, schreiben Sie einfach unten.

AllMethodsInOne.displayCustomToast(act, "This is custom toast", "long", "red").show();

toast_rounded_red dies kann nicht gefunden werden. Wo schaffen wir es?
Goops17

@ goops17: Das ist eine zeichnbare Datei mit roter, grüner Hintergrundfarbe. Stattdessen können Sie Hintergrundfarbe geben ...
Fahim Parkar

1

Code für die Datei MainActivity.java.

package com.android_examples.com.toastbackgroundcolorchange;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {

 Button BT;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 BT = (Button)findViewById(R.id.button1);
 BT.setOnClickListener(new View.OnClickListener() {

 @Override
 public void onClick(View v) {

 Toast ToastMessage = Toast.makeText(getApplicationContext(),"Change Toast Background color",Toast.LENGTH_SHORT);
 View toastView = ToastMessage.getView();
 toastView.setBackgroundResource(R.layout.toast_background_color);
 ToastMessage.show();

 }
 });
 }
}

Code für die Layoutdatei activity_main.xml.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:paddingBottom="@dimen/activity_vertical_margin"
 android:paddingLeft="@dimen/activity_horizontal_margin"
 android:paddingRight="@dimen/activity_horizontal_margin"
 android:paddingTop="@dimen/activity_vertical_margin"
 tools:context="com.android_examples.com.toastbackgroundcolorchange.MainActivity" >

 <Button
 android:id="@+id/button1"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_centerHorizontal="true"
 android:layout_centerVertical="true"
 android:text="CLICK HERE TO SHOW TOAST MESSAGE WITH DIFFERENT BACKGROUND COLOR INCLUDING BORDER" />

</RelativeLayout>

Code für die Layoutdatei toast_background_color.xml, die im Ordner res-> layout erstellt wurde.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

 <stroke
    android:width="3dp"
    android:color="#ffffff" ></stroke>
<padding android:left="20dp" android:top="20dp"
    android:right="20dp" android:bottom="20dp" />
<corners android:radius="10dp" />
<gradient android:startColor="#ff000f"
    android:endColor="#ff0000"
    android:angle="-90"/>

</shape>

1

// Eine benutzerdefinierte Toastklasse, in der Sie nach Bedarf benutzerdefinierten oder Standard-Toast anzeigen können.)

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

    /**
     * @param 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();
    }

}

1

Einfache Möglichkeit, den Toast anzupassen,

private void MsgDisplay(String Msg, int Size, int Grav){
    Toast toast = Toast.makeText(this, Msg, Toast.LENGTH_LONG);
    TextView v = (TextView) toast.getView().findViewById(android.R.id.message);
    v.setTextColor(Color.rgb(241, 196, 15));
    v.setTextSize(Size);
    v.setGravity(Gravity.CENTER);
    v.setShadowLayer(1.5f, -1, 1, Color.BLACK);
    if(Grav == 1){
        toast.setGravity(Gravity.BOTTOM, 0, 120);
    }else{
        toast.setGravity(Gravity.BOTTOM, 0, 10);
    }
    toast.show();
}

1

Für alle Kotlin-Benutzer

Sie können eine Erweiterung wie folgt erstellen:

fun FragmentActivity.showCustomToast(message : String,color : Int) {
 val toastView = findViewById<TextView>(R.id.toast_view)
 toastView.text = message
 toastView.visibility = View.VISIBLE
 toastView.setBackgroundColor(color)

 // create a daemon thread
 val timer = Timer("schedule", true)

 // schedule a single event
 timer.schedule(2000) {
    runOnUiThread { toastView.visibility = View.GONE }
 }
}

1

Es ist sehr einfach, unsere eigenen Gewohnheiten zu erstellen Toast.

Befolgen Sie einfach die folgenden Schritte.

Schritt 1

Erstellen Sie das gewünschte benutzerdefinierte Layout

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:backgroundTint="@color/black"
    android:orientation="vertical"
    android:padding="@dimen/size_10dp"
    app:cardCornerRadius="@dimen/size_8dp"
    app:cardElevation="@dimen/size_8dp">

    <TextView
        android:id="@+id/txt_message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="@dimen/size_12dp"
        android:textAlignment="center"
        android:textColor="@color/white"
        android:textSize="@dimen/text_size_16sp"
        tools:text="Hello Test!!" />

</androidx.cardview.widget.CardView>

Schritt 2

Erstellen Sie nun die benutzerdefinierte Klasse, die mit erweitert wird Toast.

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.shop.shoppinggare.R;

import org.apache.commons.lang3.StringUtils;
import org.w3c.dom.Text;

public class CustomToast extends Toast {
    private Context context;
    private String message;

    public CustomToast(Context context, String message) {
        super(context);
        this.context = context;
        this.message = message;
        View view = LayoutInflater.from(context).inflate(R.layout.toast_custom, null);
        TextView txtMsg = view.findViewById(R.id.txt_message);
        txtMsg.setText(StringUtils.capitalize(message));
        setView(view);
        setDuration(Toast.LENGTH_LONG);

    }


}

Wir haben den benutzerdefinierten Toast erstellt.

Schritt 3

Nun endlich, wie können wir es nutzen.

new CustomToast(contex,"message").show();

Genießen!!


0

Heads Up, Updates für Toast in Android 11

Benutzerdefinierte Toasts aus dem Hintergrund werden blockiert. Android 11 schützt Benutzer, indem benutzerdefinierte Toastansichten abgelehnt werden. Aus Sicherheitsgründen und um eine gute Benutzererfahrung zu gewährleisten, blockiert das System Toasts, die benutzerdefinierte Ansichten enthalten, wenn diese Toasts von einer App für Android 11 aus dem Hintergrund gesendet werden.

addCallback () -Methode in Android R hinzugefügt Wenn Sie benachrichtigt werden möchten, wenn ein Toast (Text oder benutzerdefiniert) angezeigt wird oder verschwindet.

Der wichtigste Text in der Toast-API ändert, dass für Apps, die auf Android 11 abzielen, die getView()Methode null zurückgibt, wenn Sie darauf zugreifen. Stellen Sie also sicher, dass Sie Ihre Apps vor FATAL EXCEPTION schützen. Sie wissen, was ich meine :)


0

Wenn Sie diese Bibliothek mit dem Namen Toasty verwenden , haben Sie meiner Meinung nach genügend Flexibilität, um einen benutzerdefinierten Toast mit dem folgenden Ansatz zu erstellen :

Toasty.custom(yourContext, "I'm a custom Toast", yourIconDrawable, tintColor, duration, withIcon, 
shouldTint).show();

Sie können auch formatierten Text an Toasty übergeben. Hier ist das Code-Snippet


-1
val inflater = layoutInflater
val container: ViewGroup = findViewById(R.id.custom_toast_container)
val layout: ViewGroup = inflater.inflate(R.layout.custom_toast, container)
val text: TextView = layout.findViewById(R.id.text)
text.text = "This is a custom toast"
with (Toast(applicationContext)) {
    setGravity(Gravity.CENTER_VERTICAL, 0, 0)
    duration = Toast.LENGTH_LONG
    view = layout
    show()
}

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/custom_toast_container"
              android:orientation="horizontal"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:padding="8dp"
              android:background="#DAAA"
              >
    <ImageView android:src="@drawable/droid"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:layout_marginRight="8dp"
               />
    <TextView android:id="@+id/text"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:textColor="#FFF"
              />
</LinearLayout>

Referenz: https://developer.android.com/guide/topics/ui/notifiers/toasts

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.