6

実行後に消えないトースト メッセージがあります。ループに入っていることと関係があると思いますが、よくわかりません。トーストメッセージがばらばらにならない理由を誰かが理解するのを手伝ってくれますか?

 @Override
public void onClick(View v) {
    int index = 0;
    for(int i= 0; i<userArray.length; i++){
        if(email.getText().toString().equals(userArray[i])){
            index = i;
        }
        if(passArray[index].equals(password.getText().toString())){
            Toast.makeText(getBaseContext(), "SUCCESS!", Toast.LENGTH_SHORT).show();

        } else {
            Toast.makeText(getBaseContext(), "INVALID LOGIN", Toast.LENGTH_SHORT).show();
        }
    }
    Intent mainIntent = new Intent(LoginActivity.this, MainActivity.class);
    startActivityForResult(mainIntent, 0);
}

}

4

10 に答える 10

13

Service スレッドから Toast メッセージを呼び出し、Toast が非表示に設定される前にそのスレッドが作業を完了すると、Toast メッセージがスタックする可能性があります。その後、アプリを強制終了するまで、画面にトースト メッセージが表示されたままになります。

于 2013-10-30T23:15:30.460 に答える
4

AToastは必ず消えるわけではありません。

「サービス スレッドから呼び出して、Toast が非表示に設定される前にそのスレッドが作業を完了した場合、アプリを強制終了するまで画面に Toast メッセージが表示されたままになります。」

(残念ながら削除されたJonathan Coleによる元の回答からコピーされました)


状況がどのように発生するかを説明するスタック トレースの例を次に示します。

  java.lang.IllegalStateException: Handler (android.os.Handler) {123f93ea} sending message to a Handler on a dead thread
      at android.os.MessageQueue.enqueueMessage(MessageQueue.java:325)
      at android.os.Handler.enqueueMessage(Handler.java:631)
      at android.os.Handler.sendMessageAtTime(Handler.java:600)
      at android.os.Handler.sendMessageDelayed(Handler.java:570)
      at android.os.Handler.post(Handler.java:326)
      at android.widget.Toast$TN.hide(Toast.java:387)
      at android.widget.Toast.cancel(Toast.java:133)
于 2016-05-09T07:57:13.810 に答える
4

Toastいつも消えます。いつも。

したがって、複数のトースト メッセージが表示されます。保証します。ある種のカウンターでメッセージを変更するか、最初のメッセージが表示された後に無効にして、これをテストします。

かなりの数のトーストが積み重なって、連続して表示を終了するのに非常に長い時間がかかることに注意してください。待ってください。アプリが無期限にループしない限り、最終的にはなくなります。

編集:私は修正されたままです。どうやら、Toastスレッド、サービス、または IntentService から開始された場合、メッセージがスタックして表示されたままになる可能性があります。@Johnathan と @zapotec に感謝します。

于 2013-03-21T05:54:25.527 に答える
1

トーストが消えないという奇妙なケースがいくつかあります。これを処理するには、Handler を使用します。フィールドとして1つ作成し、そこにトーストが表示された状態で「post(Runnable)」を使用します。

于 2015-03-13T15:25:16.007 に答える
1

カスタムトーストハンドラーを使用した私のソリューションは次のとおりです。m アプリで完璧に動作します。

public class CustomToast {

    private LayoutInflater inflater;
    private Toast toast;
    private View customToastLayout;
    private TextView LblCustomToast;

    public CustomToast() {}

    public void showCustomToast(String toastMessage, int toastLength, AppCompatActivity context) {

        if(inflater == null) {inflater = context.getLayoutInflater();}
        if(customToastLayout == null) {customToastLayout = inflater.inflate(R.layout.toast_layout, (ViewGroup) context.findViewById(R.id.toast_layout_root));}
        if(LblCustomToast == null) {LblCustomToast = (TextView) customToastLayout.findViewById(R.id.LblCustomToast);}
        LblCustomToast.setText(toastMessage);
        if(toast == null) {toast = new Toast(context);}
        toast.setGravity(Gravity.CENTER_VERTICAL| Gravity.BOTTOM, 0, DPDensity.getPxFromDP(160, context.getResources()));
        toast.setDuration(toastLength);
        toast.setView(customToastLayout);
        if(toast.getView().isShown()) {toast.cancel();}//Toast is cancelled here if currently showing
        toast.show();

    }

}

ここにXMLレイアウトがあります

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toast_layout_root"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="15dp"
    android:paddingTop="5dp"
    android:paddingRight="15dp"
    android:paddingBottom="5dp"
    android:orientation="vertical"
    android:background="@drawable/custom_toast_bg"
    android:gravity="bottom|center"
    android:layout_marginBottom="50dp">

    <TextView android:id="@+id/LblCustomToast"
        android:text="Test"
        android:textSize="16dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/lightLime"
        android:layout_gravity="center"
        android:gravity="center"/>

</LinearLayout>

そして、ここに使用法があります:

customToast = new CustomToast();
customToast.showCustomToast(getString(R.string.your_message), Toast.LENGTH_SHORT, (AppCompatActivity) mainActivityContext);
于 2016-08-28T22:31:47.390 に答える
1

この問題がありました。私が見つけたのは、10 を超えるトーストをインスタンス化したということです。それぞれが次の画面を表示する前に、次の画面が消えるまで待機し、合計 20 秒間画面に表示されました。

すべてのトーストを配列リストに保存してから、それらをすべてキャンセルすると問題が解決することがわかりました。

private ArrayList<Toast> toasts;
public void sendToast(final String message) {
    if (null == toasts) {
        toasts = new ArrayList<Toast>();
    }
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            try {
                Toast toast = Toast.makeText(NJActivity.this, message, Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.TOP|Gravity.CENTER, 0, 300);
                toast.show();
                toasts.add(toast);
            } catch(Exception e) {/* do nothing, just means that the activity doesn't exist anymore*/}
        }
    });
}


public void removeToast() {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            if (null != toasts) {
                for(Toast toast:toasts) {
                    toast.cancel();
                }
                toasts = null;
            }
        }
    });     
}

次に、停止時に破棄して、 removeToast() メソッドを呼び出しました

@Override
public void onDestroy() {
    super.onDestroy();
    removeToast();
}

@Override
protected void onStop () {
    super.onStop();
    removeToast();
}
于 2014-05-27T23:36:28.177 に答える
0

私は以前に同じ問題を抱えていましたが、これが私を助けてくれました。このように、onCreateでToastを作成しました

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sample);

    Context context = getApplicationContext();
    CharSequence text = "~I'm a toast that will dissapear~!";
    int duration = Toast.LENGTH_SHORT;
    Toast toast = Toast.makeText(context, text, duration);
    toast.setGravity(Gravity.TOP, 0, 0);}

そして、別のスレッドで実行されるメソッドから単に呼び出しました

toast.show();

それが役立つことを願っています!

PS問題は、トーストが1つのスレッドで作成され、別のスレッド(uithread)から呼び出されたことだと思います

于 2019-12-07T13:13:42.450 に答える
-1
  I m guessing it has something to do with it being in the loop but I'm not sure.

はい、ループを保持しているforので、ループが何度も実行されるので、そのToastように表示されます。

コードでトーストを複数回表示しています。

何度もトーストしたくない場合は、forループの外に書き出すことができます。

于 2013-03-21T05:57:04.290 に答える
-1

トーストはもう少し長く滞在します。生成されると常に消えます。ループのように、それらは互いに継続的に生成されているので、常にそこにいるような錯覚を与えます。あなたが辛抱強く残り、少し長く待つならば、しばらくするとすべてが消えます。

成功メッセージを表示したい場合。

成功と失敗で表示したい成功メッセージのメッセージを作成alert dialogueし、更新し続けてください。Text View

Toastまたは、ログインに失敗した場合にのみレイズしてみてください。

またはInfintie Loop、同じアプローチに固執したいかどうかを確認してください

于 2013-03-21T06:04:03.410 に答える
-1

問題は、トーストが画面に何度も表示され、閉じるのに時間がかかることだと思います。トーストをループの外に置いてコードを確認し、条件が複数回真であるかどうかも確認してください。要するに、DEBUGあなたのコードです。

于 2013-03-21T06:02:21.060 に答える