2017-01-22 1 views
1

J'essaie de montrer un toast avant une boucle for, cependant, le toast ne s'affiche pas. J'ai aussi essayé d'ajouter un snack, mais ça n'a pas marché non plus. Je voudrais savoir pourquoi le toast ne tire pas d'abord. J'ai même essayé ce qui suit, mais il a continué à boucler:Afficher le toast avant une boucle for ne fonctionne pas

Toast toast = Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT); 
while (!toast.getView().isShown()) { 
    toast.show(); 
} 

Comment puis-je montrer un toast avant une boucle for?

ArrayList<String> pizzaBases = new ArrayList<>();  

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    Button button = (Button) findViewById(R.id.button); 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      main.runOnUiThread(new Runnable() { 
       public void run() { 
         Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT); 
         Snackbar.make(findViewById(android.R.id.content), "Had a snack at Snackbar", Snackbar.LENGTH_LONG).show(); 
        } 
      }); 

      SharedPreferences preferences = getPreferences(Context.MODE_PRIVATE); 

      for (int i = 0; i < 100; i++) { 
       try { 
        String pizza = preferences.getString("TypeOfBase" + i, ""); 
        if (!pizza.equals("")) { 
         pizzaBases.add(pizza); 
        } 
       } catch (NullPointerException e) { 
        //Do nothing here 
       } 
      } 
     } 
    }); 

    Button button1 = (Button) findViewById(R.id.buttonOne); 
    button1.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      for (String myString : pizzaBases) { 
       System.out.println(myString); 
      } 
     } 
    }); 
} 

J'ai essayé des solutions comme runOnUiThread, AsyncTask et en boucles, mais tous ne montrent pas de pain ni un snack-bar.

EDIT:

Je trouve que l'interface utilisateur uniquement mises à jour après la boucle se fait. Je me demande pourquoi il le fait, bien qu'il soit activé en premier.

Répondre

2

Le problème est que Toast.show() est asynchrone. Le toast ne sera pas affiché jusqu'à ce que la méthode en cours revienne, et même alors, Android peut décider de l'afficher plus tard (par exemple s'il y a déjà un autre toast affiché sur l'écran) ou même pas du tout.

Avez-vous vraiment besoin d'utiliser les toasts natifs? Peut-être que le mieux serait d'utiliser un autre système plus fiable. Qu'en est-il d'une vue personnalisée qui apparaît au-dessus de tout ce qui ressemble à un toast et que vous pouvez montrer immédiatement et de manière fiable?

+0

Je voudrais dire à l'utilisateur que la fonction est déclenchée avec succès quand il clique sur le bouton.C'est nécessaire, car l'utilisateur doit attendre et je voudrais lui dire pourquoi. Dans cet exemple c'est "Hello", mais dans la version ce sera un message différent. – Jason

+0

S'il est important que l'utilisateur voit le message immédiatement, vous ne devriez pas vous fier aux toasts. Je suggère de l'intégrer quelque part dans votre interface utilisateur, par exemple en affichant le message dans un TextView ou en changeant le texte du bouton lorsque l'utilisateur clique dessus (certains sites font cela, ils désactivent le bouton et le texte devient "Envoi. .. "avec un indicateur de progression). Mais comment l'implémenter est plus une question d'UX. Vous pouvez également utiliser quelque chose comme Crouton: https://play.google.com/store/apps/details?id=de.keyboardsurfer.app.demo.crouton – Dalmas

+0

J'ai vérifié, et a découvert que l'interface utilisateur seulement mises à jour après le pour boucle, bien qu'il se déclenche avant la boucle for .. – Jason

0

Vous n'êtes pas appeler show() sur cette ligne:

Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT); 

Il devrait être:

Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT).show(); 
+0

J'appelle .show(), j'ai oublié de le copier avec le code que j'ai fourni – Jason

0

Vous n'avez pas besoin d'utiliser runOnUiThread parce que vous êtes déjà sur la principale thread et vous n'appelez pas show() sur votre toast dans le deuxième code.
Il est également préférable de passer l'objet Context le plus proche à votre toast.

public void onClick(View view) { 
     Toast.makeText(YourActivity.this, "Hello", Toast.LENGTH_SHORT).show(); // show must be called 
     Snackbar.make(findViewById(android.R.id.content), "Had a snack at Snackbar", Snackbar.LENGTH_LONG).show(); 

     SharedPreferences preferences = getPreferences(Context.MODE_PRIVATE); 
    ... 
} 
+0

J'appelle .show(), j'ai oublié de le copier avec le code que j'ai fourni. Je vais regarder dedans! – Jason

+0

Avant getApplicationContext, j'ai utilisé MainActivity.this, et cela n'a malheureusement pas fonctionné non plus. – Jason

+0

@Jason Etes-vous sûr que votre onClick est appelé? Mettez un point d'arrêt dedans et vérifiez s'il atteint la méthode 'onClick'. –

0

Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT);

  • Lorsque vous êtes toast spectacle que vous devez appeler la méthode .show().

  • Si vous montrez Toast en Activity il sera préférable d'utiliser context de Activity

Correction

Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT).show();


Snackbar.make(findViewById(android.R.id.content), "Had a snack at Snackbar", Snackbar.LENGTH_LONG).show();

Si vous voulez montrer SnackBar que vous devez fournir la vue de l'activité actuelle ne android.R.id.content

Correction

Snackbar.make(findViewById(R.id.parent_of_your_activity), "Had a snack at Snackbar", Snackbar.LENGTH_LONG).show();


  • Vous n'avez pas besoin d'utiliser runOnUiThread parce que vous êtes déjà sur le fil principal

  • Vous pouvez obtenir Context

    1. via YourActivity.this ou this dans Activity se

    2. via getContext() dans Fragment classe

+0

Le casse-croûte était juste pour vérifier Si un casse-croûte fonctionnerait mais un pain grillé ne fonctionne pas. J'appelle .show(), j'ai oublié de le copier en créant cette question. – Jason

+0

Pouvez-vous s'il vous plaît plus de code de cette classe? –

+0

J'ai modifié le code dans la question maintenant! – Jason