[Android] Toast:トーストのレイアウトをカスタマイズする

トーストは短いテキストを通知するポップアップです。もしそれだけでは情報が十分でない場合、トーストのレイアウトをカスタマイズすることができます。ここではトーストのレイアウトをカスタマイズする方法を説明します。
広 告
目次
前提条件
- トーストの表示方法を理解していること
動作確認端末
- Google Nexus 5 – 5.0.0 – API21(エミュレータ)
1. トーストのレイアウトをカスタマイズする
トーストのレイアウトをカスタマイズするためには、レイアウトXML、もしくはJavaコードでレイアウト定義し、そのViewオブジェクトをToast#setView(View)メソッドに渡します。
ここでは例として、レイアウトXMLで定義する方法で説明します。まず以下のように、左側にアイコン、右側にテキストを表示するレイアウトを用意します。ファイル名はtoast_layout.xml
とします。
res/layout/toast_layout.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:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="8dp" android:background="#DAAA" > <ImageView android:src="@android:drawable/sym_def_app_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="8dp" /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#FFF" /> </LinearLayout>
次にJavaコード側の実装内容についてです。Java側でレイアウトXMLからView
オブジェクトを取得するためには、LayoutInflateを使います。LayoutInflate
はgetLayoutInflate()メソッドもしくはgetSystemService(LAYOUT_INFLATER_SERVICE)メソッドから取得することができます。このLayoutInflate
オブジェクトのinfalte(int, ViewGroup)メソッドの戻り値が、レイアウトXMLのView
オブジェクトです。infalte(int, View)メソッドのパラメータについて以下のとおりです。
型 | 説明 | |
第1引数 | int | レイアウトXMLのリソースID |
第2引数 | ViewGroup | レイアウトのルートViewGroup オブジェクト |
最後にToast(Context)コンストラクタからオブジェクトを作成した後、setView(View)メソッドにレイアウトのView
オブジェクトを設定し、show()メソッドを実行することで、レイアウトをカスタマイズしたトーストが表示されます。
以上をまとめたサンプルコードは以下のとおりです。
java/<package name> /MainActivity.java
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); final View layout = inflater.inflate(R.layout.toast_layout, (ViewGroup) findViewById(R.id.toast_layout_root)); final TextView text = (TextView) layout.findViewById(R.id.text); text.setText("カスタムトーストを表示"); final Toast toast = new Toast(getApplicationContext()); toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0); toast.setDuration(Toast.LENGTH_LONG); toast.setView(layout); toast.show(); } }
実行すると以下のようなになります。

setView(View)
メソッドを使ってレイアウトを定義する場合、Toast
オブジェクトはコンストラクタから作成します。setView(View)
を使用しない場合は、makeText()メソッドからToast
オブジェクトを作成しなければなりません。