【AndroidのViewを制する】 Toastを使いこなしてViewを一定時間表示する

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

今回、紹介するToastはViewを画面下からスライドインさせることができます。
スライドインしたViewは一定時間が経過すると自動で消えます。
ユーザーに簡単な情報を提示することができます。
今回はViewを表示する方法に関連するメソッドを説明します。

Toast#setView・Toast#getViewを使ってViewを設定させる

Toast#setViewはToastで表示するViewを設定するメソッドです。
Toast#getViewは現在設定されているViewを返却するメソッドです。


    LinearLayout linearLayout = new LinearLayout(this);
    linearLayout.setOrientation(LinearLayout.VERTICAL);
    Button setViewButton = new Button(this);
    setViewButton.setText("setViewでViewを設定");
    setViewButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // ImageViewをToast表示する
            ImageView imageView = new ImageView(ToastActivity.this);
            imageView.setImageResource(R.mipmap.ic_launcher);
            Toast toast = new Toast(ToastActivity.this);
            toast.setView(imageView);
            toast.show();
        }
    });
    linearLayout.addView(setViewButton);
    setContentView(linearLayout);


Toast#setGravityを使い表示位置を変更する

Toast#setGravityはToastの表示位置を変更するメソッドです。
引数は3つあります。
  • 第1引数 : Gravityを指定します。
  • 第2引数 : x軸方向のオフセット値を設定します。正の値で右方向、負の値で左方向に表示位置がずれます。
  • 第3引数 : y軸方向のオフセット値を設定します。正の値で下方向、負の値で上方向に表示位置がずれます。
Toast#getGravityは設定されているGravityを返却します。
Toast#getXOffsetは設定されているx軸方向のオフセット値を返却します。
Toast#getYOffsetは設定されているy軸方向のオフセット値を返却します。


    LinearLayout linearLayout = new LinearLayout(this);
    linearLayout.setOrientation(LinearLayout.VERTICAL);
    Button setGravityButton = new Button(this);
    setGravityButton.setText("setGravityで表示位置を設定");
    setGravityButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ImageView imageView = new ImageView(ToastActivity.this);
            imageView.setImageResource(R.mipmap.ic_launcher);
            Toast toast = new Toast(ToastActivity.this);
            toast.setView(imageView);
            // グラビティを画面中央に設定し、そこからx軸方向に500、y軸方向に100のオフセットを設定する。
            toast.setGravity(Gravity.CENTER , 500 ,100);
            toast.show();
        }
    });
    linearLayout.addView(setGravityButton);
    setContentView(linearLayout);


Toast#setMarginを使ってToastの表示位置を変更する

Toast#setMarginはToastの表示位置を変更するメソッドです。
引数は2つあります。
  • 第1引数 : 水平方向のマージンを指定します。数値は-1~1の間で設定できます。正の値は水平右方向、負の値は水平左方向に移動されます。
  • 第2引数 : 垂直方向のマージンを指定します。数値は-1~1の間で設定できます。正の値は垂直上方向、負の値は垂直下方向に移動されます。
Toast#getHorizontalMarginは設定されている水平方向のマージンを返却します。
Toast#getVerticalMarginは設定されている垂直方向のマージンを返却します。


    LinearLayout linearLayout = new LinearLayout(this);
    linearLayout.setOrientation(LinearLayout.VERTICAL);
    Button setMarginButton = new Button(this);
    setMarginButton.setText("setMarginで表示位置を設定");
    setMarginButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ImageView imageView = new ImageView(ToastActivity.this);
            imageView.setImageResource(R.mipmap.ic_launcher);
            Toast toast = new Toast(ToastActivity.this);
            toast.setView(imageView);
            /**
             * 第1引数 : 水平方向のマージンを指定します。数値は-1~1の間で設定できます。正の値は水平右方向、負の値は水平左方向に移動されます。
             * 第2引数 : 垂直方向のマージンを指定します。数値は-1~1の間で設定できます。正の値は垂直上方向、負の値は垂直下方向に移動されます。
             */
            toast.setMargin(1.0f,-1.0f);
            toast.show();
        }
    });
    linearLayout.addView(setMarginButton);
    setContentView(linearLayout);


Toast#setDurationを使って表示時間を変更する

Toast#setDurationはToastの表示時間を変更するメソッドです。
Toastクラスの定数として定義されている「LENGTH_SHORT」と「LENGTH_LONG」を引数として使うことができます。 Toast#getDurationは設定されている表示時間を返却します。


    LinearLayout linearLayout = new LinearLayout(this);
    linearLayout.setOrientation(LinearLayout.VERTICAL);
    Button setDurationButton = new Button(this);
    setDurationButton.setText("setDurationで表示時間を設定");
    setDurationButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Random random = new Random();
            boolean isLong = random.nextBoolean();
            Toast toast = Toast.makeText(ToastActivity.this, "", Toast.LENGTH_SHORT);
            if(isLong) {
                toast.setText("Toast.LENGTH_LONGで表示");
                // 5秒間表示される
                toast.setDuration(Toast.LENGTH_LONG);
            } else {
                toast.setText("Toast.LENGTH_SHORTで表示");
                // 1秒間表示される
                toast.setDuration(Toast.LENGTH_SHORT);
            }
            toast.show();
        }
    });
    linearLayout.addView(setDurationButton);
    setContentView(linearLayout);


ToastにButtonを設定するとどうなるのか

ToastにButtonを設定してButtonが押せるかどうかを確認しました。
結果は押すことができませんでした。
これはToast内のWindowManager.LayoutParamsにFLAG_NOT_TOUCHABLEのフラグが設定されているためです。


    LinearLayout linearLayout = new LinearLayout(this);
    linearLayout.setOrientation(LinearLayout.VERTICAL);
    Button setButtonViewButton = new Button(this);
    setButtonViewButton.setText("Toastにボタンを配置するとどうなるのか");
    setButtonViewButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Button button = new Button(ToastActivity.this);
            button.setText("Toastの中のボタン");
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(ToastActivity.this , "Toastの中のボタンが押されたよ" ,Toast.LENGTH_LONG);
                }
            });
            Toast toast = new Toast(ToastActivity.this);
            toast.setView(button);
            toast.show();
        }
    });
    linearLayout.addView(setButtonViewButton);
    setContentView(linearLayout);