2017-01-22 3 views
1

Я пытаюсь показать тост перед циклом for, однако тост не отображается. Я также попытался добавить закусочную, но это тоже не сработало. Я хотел бы знать, почему тост не срабатывает в первую очередь. Я даже пробовал следующее, но он продолжал цикл:Показывать тост до цикла for не работает

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

Как я могу показать тост перед циклом 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); 
      } 
     } 
    }); 
} 

Я попытался решения, как runOnUiThread, AsyncTask и в то время как петли, но все они не показывают тостов, ни закусочную.

EDIT:

Я обнаружил, что UI только обновления ПОСЛЕ цикл выполняется. Мне интересно, почему это происходит, хотя оно активировано первым.

ответ

2

Проблема в том, что Toast.show() является асинхронным. Тост не будет отображаться до тех пор, пока не вернется текущий метод, и даже тогда Android может решить показать его позже (например, если на экране есть еще один тост) или даже совсем нет.

Вам действительно нужно использовать местные тосты? Может быть, лучше всего использовать другую более надежную систему. Как насчет пользовательского представления, которое появляется поверх всего, что выглядит как тост, и что вы можете показать сразу и надежно?

+0

Я хотел бы сообщить пользователю, что функция успешно запущена, когда он нажимает кнопку.Это необходимо, поскольку пользователь должен ждать, и я хотел бы обратиться к нему, почему. В этом примере это «Привет», но в релизе это будет другое сообщение. – Jason

+0

Если важно, чтобы пользователь сразу увидел сообщение, вы не должны полагаться на тосты. Я бы предложил интегрировать его где-нибудь в вашем пользовательском интерфейсе, например, показывая сообщение в TextView или изменяя текст кнопки, когда пользователь нажимает на нее (некоторые веб-сайты делают это, они отключают кнопку, а текст изменяется на «Отправка». .. »вместе с индикатором прогресса). Но как реализовать это скорее вопрос UX. Вы также можете использовать что-то вроде Crouton: https://play.google.com/store/apps/details?id=de.keyboardsurfer.app.demo.crouton – Dalmas

+0

Я проверил и узнал, что пользовательский интерфейс обновляется только после loop, хотя он срабатывает перед циклом for. – Jason

0

Вы не вызывая метод показа() на этой линии:

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

Оно должно быть:

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

Я звоню .show(), я забыл скопировать его с кодом, который я предоставил – Jason

0

Вам не нужно использовать runOnUiThread, потому что ты уже на главной нить, и вы не звоните show() на свой тост во втором коде.
Лучшее в своем ответе: Context Объект к вашему тосту.

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

Я звоню .show(), я забыл скопировать его с кодом, который я предоставил. Я посмотрю! – Jason

+0

До getApplicationContext я использовал MainActivity.this, и он, к сожалению, тоже не работал. – Jason

+0

@Jason Вы уверены, что ваш 'onClick' даже называется? Поместите там точку останова и проверьте, достиг ли она метода 'onClick'. –

0

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

  • Когда вы показать тост вы должны вызвать метод .show().

  • Если вы показываете Toast в Activity будет лучше использовать Activity «s context

коррекция

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


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

Если вы хотите, чтобы показать SnackBar чем вы должны обеспечить представление текущей деятельности не android.R.id.content

Коррекция

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


  • Вам не нужно использовать runOnUiThread Потому что вы уже в главной теме

  • Вы можете получить Context

    1. через YourActivity.this или this в Activity сам

    2. через getContext() в Fragment классе

+0

Закусочная была только для проверки Если закусочная будет работать, но тост не делает. Я звоню .show(), я забыл скопировать его при создании этого вопроса. – Jason

+0

Можете ли вы больше кода этого класса? –

+0

Я редактировал код в вопросе сейчас! – Jason