2011年10月13日木曜日

Toast

Androidアプリを使っていると、数秒間だけ表示するメッセージ通知を見かけます。これはToast (トースト)といいます。


Toastでメッセージを表示する

Toastはメッセージを表示すると、一定時間が経過すると、メッセージは自動的に消えます。表示するときはフェードイン、消える時はフェードアウトします。

表示する期間(時間)は2秒または4秒です。短いメッセージは2秒でも読めるかもしれませんが、長くなると2秒では読めないかもしれませんので、そういう場合は4秒表示するようにします。

使い方はいたって簡単です。
Toast.makeText(this, "message", Toast.LENGTH_SHORT).show();
これで2秒間、メッセージを表示します。4秒表示する場合は、makeText()の第3引数にToast.LENGTH_LONG を指定します。第1引数はコンテキスト、第2引数は表示する文字列を指定します。

サンプルプログラムは前回の「Button」をご覧ください。


Toastのメッセージをキャンセルする

ところでToastを表示している間に、別のToastを表示するとどうなるでしょう?実は1つめのToast表示が終わるまで、2つめのToastは表示されません。

これは都合の悪い場合があります。Toastで表示している間に次の操作を行い、その時もToast表示することになった場合、最初のToast表示が終わるまでに時間がかかってしまいます。何度も繰り返して操作すると、いつまで経ってもToast表示が終わらないかもしれません。

前回の「Button」のサンプルで試してみるとよくわかります。

これを回避するにはcancel()メソッドを使います。「Button」のサンプルをベースに、Toastをキャンセルできるように作り直したものが、今回のサンプルです。

Androidプロジェクトの設定
プロジェクト名:ToastTest1
ビルドターゲット:Android 2.1-update1
アプリケーション名:ToastTest1
パッケージ名:jp.co.triware.samples.ToastTest1
アクティビティーの作成:ToastTest1
最小SDKバージョン:7
ToastTest1.java
package jp.co.triware.samples.ToastTest1;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class ToastTest1 extends Activity {
    private static final String TAG = "ToastTest1";
    private Toast myToast = null;   // Toastをキャンセルするために変数を用意

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Toastのインスタンスを生成し、以後はこれを使用
        myToast = Toast.makeText(this, "dummy", Toast.LENGTH_SHORT);

        // "SHORT"ボタン
        Button btnShort = (Button)findViewById(R.id.short_btn);
        btnShort.setOnClickListener(new View.OnClickListener() {
            // @Override // JDK1.5ではビルドエラー
            public void onClick(View v) {
                Log.d(TAG, "[SHORT] button");
                // Toastをキャンセル
                myToast.cancel();
                // メッセージと期間をセットして表示
                myToast.setText("SHORTボタンが押されました。");
                myToast.setDuration(Toast.LENGTH_SHORT);
                myToast.show();
            }
        });

        // "LONG"ボタン
        Button btnLong = (Button)findViewById(R.id.long_btn);
        btnLong.setOnClickListener(new View.OnClickListener() {
            // @Override // JDK1.5ではビルドエラー
            public void onClick(View v) {
                Log.d(TAG, "[LONG] button");
                // Toastをキャンセル
                myToast.cancel();
                // メッセージと期間をセットして表示
                myToast.setText("LONGボタンが押されました。");
                myToast.setDuration(Toast.LENGTH_LONG);
                myToast.show();
            }
        });

        // "cancel"ボタン
        Button btnCancel = (Button)findViewById(R.id.cancel_btn);
        btnCancel.setOnClickListener(new View.OnClickListener() {
            // @Override // JDK1.5ではビルドエラー
            public void onClick(View v) {
                Log.d(TAG, "[cancel] button");
                // Toastをキャンセル
                myToast.cancel();
            }
        });
    }
}

Toastをキャンセルするには同じインスタンスである必要があるため、ここではmyToastという変数を使っています。
"SHORT"ボタンや"LONG"ボタンがクリックされた時はキャンセルしてからメッセージを表示します。この時、makeText()メソッドでメッセージを作成すると(インスタンスを作成すると)時間がかかってスムーズに動いてくれませんので、最初にインスタンスは作っておいて、必要に応じてテキストや期間(時間)を変更します。
"cancel"ボタンがクリックされた時は、Toastをキャンセルします。

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <Button
        android:id="@+id/short_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="SHORT"
        />
    <Button
        android:id="@+id/long_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="LONG"
        />
    <Button
        android:id="@+id/cancel_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="cancel"
        />
</LinearLayout>

実行結果

"SHORT"や"LONG"を表示している間に"LONG"や"SHORT"をクリックすると、2秒/4秒表示の完了を待たずに表示が切り替わります(フェードアウト・フェードインする時間はかかります)。"cancel"をクリックするとメッセージ表示が消えます。

0 件のコメント:

コメントを投稿