web-dev-qa-db-fra.com

Toast personnalisé sur Android: un exemple simple

Je suis nouveau dans la programmation Android. Qu'est-ce qu'un exemple simple montrant une notification de pain grillé personnalisée sur Android?

96
Sandy

Utilisez le code ci-dessous d'un pain grillé personnalisé. Cela peut vous aider.

toast.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>

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();

Et consultez les liens ci-dessous également pour un Toast personnalisé.

Toast personnalisé avec horloge analogique

YouTube: Créer un toast personnalisé avec un bouton dans Android Studio

173
Dipak Keshariya

Un toast est pour montrer des messages pour de courts intervalles de temps; Donc, selon ma compréhension, vous souhaitez le personnaliser en y ajoutant une image et en modifiant la taille et la couleur du texte du message. Si c'est tout ce que vous voulez faire, vous n'avez pas besoin de faire une mise en page séparée et de la gonfler à l'instance de Toast.

La vue par défaut de Toast contient une variable TextView permettant d'afficher des messages. Donc, si nous avons la référence d'identifiant de ressource de cette TextView, nous pouvons jouer avec. Voici donc ce que vous pouvez faire pour y parvenir:

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();

Dans le code ci-dessus que vous pouvez voir, vous pouvez ajouter une image à TextView via setCompoundDrawablesWithIntrinsicBounds(int left, int top, int right, int bottom) quelle que soit la position par rapport à TextView que vous souhaitez.

Sortie:

Enter image description here

28
TheLittleNaruto

ÉTAPE 1:

Commencez par créer une mise en page pour un toast personnalisé dans 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>

STEP 2: Dans le code d'activité, obtenez la vue personnalisée ci-dessus et joignez-la à Toast:

// 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();

Pour plus d’aide, voyez comment nous créons des toasts personnalisés dans Android:

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

15
ρяσѕρєя K

Voir lien ici . Vous trouvez votre solution. Et essaye:

Créer une vue Toast personnalisée

Si un simple message texte ne suffit pas, vous pouvez créer une mise en page personnalisée pour votre notification de pain grillé. Pour créer une présentation personnalisée, définissez une disposition de Vue, en XML ou dans le code de votre application, puis transmettez l'objet View racine à la méthode setView (View).

Par exemple, vous pouvez créer la mise en forme de la rôtie visible dans la capture d'écran à droite avec le code XML suivant (enregistré sous le nom 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>

Notez que l'ID de l'élément LinearLayout est "toast_layout". Vous devez utiliser cet ID pour gonfler la mise en page à partir du XML, comme indiqué ci-dessous:

 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();

Commencez par récupérer LayoutInflater avec getLayoutInflater () (ou getSystemService ()), puis gonflez la mise en page à partir de XML en utilisant inflate (int, ViewGroup). Le premier paramètre est l'ID de ressource de présentation et le second est la vue racine. Vous pouvez utiliser cette mise en page gonflée pour rechercher d'autres objets View dans la mise en page. Capturez et définissez donc maintenant le contenu des éléments ImageView et TextView. Enfin, créez un nouveau pain grillé avec Toast (contexte) et définissez certaines propriétés du pain grillé, telles que la gravité et la durée. Ensuite, appelez setView (View) et transmettez-le à la disposition gonflée. Vous pouvez maintenant afficher le pain grillé avec votre mise en page personnalisée en appelant show ().

Remarque: N'utilisez pas le constructeur public pour un Toast sauf si vous allez définir la présentation avec setView (View). Si vous n'avez pas de disposition personnalisée à utiliser, vous devez utiliser makeText (Context, int, int) pour créer le pain grillé.

4
Deepak Swami

C'est ce que j'ai utilisé

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, tText, Toast.LENGTH_SHORT);
    } else {
        toast = Toast.makeText(mAct, tText, 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

En appelant, écrivez simplement ci-dessous.

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

Je pense que la plupart des exemples XML personnalisés par Customtoast sont basés sur la même source.

La documentation Android, qui est très obsolète à mon avis. fill_parent ne devrait plus être utilisé. Je préfère utiliser wrap_content en combinaison avec xml.9.png. De cette façon, vous pouvez définir la taille minimale de toastbackground tout au long de la taille de la source fournie.

Si des toasts plus complexes sont requis, utilisez une mise en page ou une mise en page au lieu de LL.

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 est background_96.9.png.

Ce n’est pas très bien testé, et les astuces sont appréciées :)

1
ornay odder

Vous pouvez télécharger le code ici .

Étape 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>

Étape 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>

Étape 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();
            }
        });
    }
}
1
nirav kalola

Code pour le fichier 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 du fichier de mise en forme 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 du fichier de mise en page toast_background_color.xml créé dans le dossier res-> layout.

<?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>
0
Waruna Manjula

Pour éviter les problèmes liés à l'utilisation incorrecte des paramètres layout_ *, vous devez vous assurer que, lorsque vous gonflez votre présentation personnalisée, vous spécifiez un ViewGroup correct en tant que parent.

De nombreux exemples donnent null ici, mais vous pouvez également remplacer le groupe existant de Toast ViewGroup en tant que parent.

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()

Ici, nous remplaçons la vue Toast existante par notre vue personnalisée. Une fois que vous avez une référence à votre mise en page, vous pouvez mettre à jour toutes les vues images/texte qu’elle pourrait contenir. 

Cette solution empêche également tout blocage "View non attaché au gestionnaire de fenêtres" d'utiliser null en tant que parent.

En outre, évitez d’utiliser ConstraintLayout comme racine de votre modèle personnalisé, cela ne semble pas fonctionner lorsqu’il est utilisé à l’intérieur d’un Toast.

0
Andrew Kelly
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>

Référence: https://developer.Android.com/guide/topics/ui/notifiers/toasts

0
Ajay Prajapati

Pour tous les utilisateurs de Kotlin

Vous pouvez créer une extension comme suit:

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 }
 }
}
0
lukas

Disposition personnalisée pour les rôties, 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>

Et la méthode Java (il suffit de passer un message toast à cette méthode):

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();
}
0
saigopi

// Une classe de pain grillé personnalisée dans laquelle vous pouvez afficher le pain grillé personnalisé ou par défaut selon vos besoins 

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();
    }

}
0
Amardeep

Moyen simple de personnaliser le pain grillé,

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();
}
0
Chathura