トーストで表示される色や形がいまいちアプリに合わないと思うことは多々あるのではないでしょうか。
Snackbar を使って代替えにできます
API 29
Custom Toast
簡単な Toast は使えますが、以下のような setViewを使うようなカスタムトーストはAPI30からは非推奨になりました。
しばらくは残しておきますがいずれこの記事も削除する予定です。
- バックグラウンドからのカスタム トーストのブロック
- トーストのコールバック
- Text Toast API の変更
このため、
Toastはちょっとした確認メッセージを入れるのにとても適しています。ただテキスト、あるいは画像を表示させるのであれば他の方法もありますが、ほどほどの時間で消えてくれるところがいいですね。これをタイマー使うと煩雑なコードになりそうです。
カスタマイズ
カスタマイズとして、このくらい手を加えてみます。
- 画像付きのメッセージ
- ダイアログの形は丸角
- グラデーションのついた背景
大元のToastをインポートします
import android.widget.Toast;
1 |
Toast.makeText(this, "メッセージ", Toast.LENGTH_LONG).show(); |
これでdefaultのトーストはできあがりで、これを拡張していきます
- TextViewとImageViewを乗せたViewを作り
- custom_toast.xmlというレイアウトファイルにします
- そのViewを inflate を使ってactivity_main に挿入
- TextViewは背景を shape を使って色を付けたり、角を丸く
サンプルコード
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
//package your.package.name; import androidx.appcompat.app.AppCompatActivity; import android.content.Context; import android.os.Bundle; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private Context context; private String toastMessage; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); context = getApplicationContext(); toastMessage = "OK"; Button button = findViewById(R.id.button); // button.setOnClickListener(new View.OnClickListener() { // @Override // public void onClick(View v) { // if(toastMessage != null){ // toastMake(toastMessage, context); // } // } // }); // lambda式 button.setOnClickListener( v -> { if(toastMessage != null){ toastMake(toastMessage, context); } }); } // custom toast maker public void toastMake( String str , Context cont) { Toast toast = new Toast( cont ); LayoutInflater inflater = getLayoutInflater(); // relative_layout:custom_toast.xmlのRelativeLayoutに付けたID ViewGroup viewGroup = findViewById(R.id.relative_layout); // inflateする View view = inflater.inflate( R.layout.custom_toast, viewGroup); TextView textView = view.findViewById( R.id.message ); textView.setText( str ); // 非推奨 toast.setView( view ); // 表示時間 toast.setDuration( Toast.LENGTH_LONG ); // 位置調整 toast.setGravity(Gravity.CENTER, 0, -100); toast.show(); } } |
activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#dfe" android:orientation="vertical" android:gravity="center" tools:context=".MainActivity"> <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="340dp" android:layout_marginStart="80dp" android:layout_marginEnd="80dp" android:text="@string/button" /> </LinearLayout> |
Inflateするレイアウトファイルを作成して res/layout/ 以下に配置します。
また例えば画像(ok.png)をdrawableに入れておきます。
custom_toast.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/relative_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/round_rectangle" android:orientation="vertical" > <ImageView android:src="@drawable/ok" android:contentDescription="@string/app_name" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="80dp" android:paddingStart="200dp" android:paddingEnd="10dp" android:textColor="#f40" android:textStyle="bold" android:textSize="60sp" /> </RelativeLayout> |
背景を丸角のボックスで、エメラルド系のグラテーションを施してみます。
shape を使った定義xmlを、drawable フォルダに入れます
round_rectangle.xml
1 2 3 4 5 6 7 8 9 10 |
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:radius="20dp" /> <gradient android:angle="180" android:startColor="#8fa" android:endColor="#0a4" /> </shape> |
リソース
1 2 3 4 5 |
<resources> <string name="app_name">YourAppName</string> <string name="description">picture</string> <string name="button">Button</string> </resources> |
サンプル動画
custom_toast.xml を色々修正してアプリのテーマにあったカスタマイズができますね
関連ページ;
- Toastを表示させる
- Toastのカスタマイズ
Refferences:
Toasts | Android Developers
Toasts
Android 11 でのトーストに関する更新