プログラムでトーストポップアップに画像を追加することはできますか?
はい、setView()メソッドを使用してトースト通知にイメージビューまたは任意のビューを追加できます。このメソッドを使用して、要件に応じてトーストをカスタマイズできます。
ここでは、Toast通知に膨らませるカスタムレイアウトファイルを作成し、setView()メソッドを使用してToast通知でこのレイアウトを使用しました。
cust_toast_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:id="@+id/relativeLayout1"
Android:background="@Android:color/white">
<TextView
Android:textAppearance="?android:attr/textAppearanceLarge"
Android:id="@+id/textView1" Android:layout_height="wrap_content"
Android:layout_width="fill_parent"
Android:text="PM is here"
Android:gravity="center"
Android:textColor="@Android:color/black">
</TextView>
<ImageView
Android:layout_height="wrap_content"
Android:layout_width="fill_parent"
Android:src="@drawable/new_logo"
Android:layout_below="@+id/textView1"
Android:layout_margin="5dip"
Android:id="@+id/imageView1">
</ImageView>
<TextView
Android:id="@+id/textView2"
Android:layout_height="wrap_content"
Android:layout_width="fill_parent"
Android:text="This is the demo of Custom Toast Notification"
Android:gravity="center"
Android:layout_below="@+id/imageView1"
Android:textColor="@Android:color/black">
</TextView>
</RelativeLayout>
CustomToastDemoActivity.Java
LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.cust_toast_layout,
(ViewGroup)findViewById(R.id.relativeLayout1));
Toast toast = new Toast(this);
toast.setView(view);
toast.show();
単に、次を使用してください:
Toast toast = new Toast(myContext);
ImageView view = new ImageView(myContext);
view.setImageResource(R.drawable.image_icon);
toast.setView(view);
toast.show();
プログラムで任意のビューを作成し(LayoutInflaterを使用せずにこれを行う方法を尋ねていると仮定しているため)、作成したToastでsetViewを呼び出すことができます。
//Create a view here
LinearLayout v = new LinearLayout(this);
//populate layout with your image and text or whatever you want to put in here
Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(v);
toast.show();
Knickediのソリューションは優れていますが、テキストの隣にアイコンのみが必要な場合は、Toastに同じIDの事前定義されたTextViewがあり、TextViewにアイコンを設定するという事実を利用できます。
Toast toast = Toast.makeText(context, text, Toast.LENGTH_SHORT);
TextView tv = (TextView) toast.getView().findViewById(Android.R.id.message);
if (null!=tv) {
tv.setCompoundDrawablesWithIntrinsicBounds(icon, 0, 0, 0);
tv.setCompoundDrawablePadding(context.getResources().getDimensionPixelSize(R.dimen.padding_toast));
Toast aa = Toast.makeText(getBaseContext(), "OPEN",Toast.LENGTH_SHORT);
ImageView cc = new ImageView(getBaseContext());
cc.setImageResource(R.drawable.a);
aa.setView(cc);
aa.show();
カスタムレイアウトを作成する可能性は常にあります。私がそれについて嫌いな事実が1つありました。それは、システムのデフォルトのトーストUIを壊します。これは、プラットフォームや実装によって異なる場合があります。システムのデフォルトリソースを使用する簡単な方法はないので、トーストをハックしてイメージを強制的に入れることにしました。
ヒント:デフォルトリソースは次のように取得できます。Toast.makeToast(context, "", 0).getView().getBackground()
トーストメッセージの前に画像を表示するヘルパーを次に示します。Helper.makeImageToast(context, R.drawable.my_image, "Toast with image", Toast.LENGTH_SHORT).show()
これを使用して、成功、情報、またはエラーを示します。トースト情報をより良く、より表現力豊かにします...
(ハックは、内部トーストがLinearLayout
を使用しているという事実に基づいているため、システムや実装に依存しないことに注意する必要があります。コメントを参照してください。)
public static Toast makeImageToast(Context context, int imageResId, CharSequence text, int length) {
Toast toast = Toast.makeText(context, text, length);
View rootView = toast.getView();
LinearLayout linearLayout = null;
View messageTextView = null;
// check (expected) toast layout
if (rootView instanceof LinearLayout) {
linearLayout = (LinearLayout) rootView;
if (linearLayout.getChildCount() == 1) {
View child = linearLayout.getChildAt(0);
if (child instanceof TextView) {
messageTextView = (TextView) child;
}
}
}
// cancel modification because toast layout is not what we expected
if (linearLayout == null || messageTextView == null) {
return toast;
}
ViewGroup.LayoutParams textParams = messageTextView.getLayoutParams();
((LinearLayout.LayoutParams) textParams).gravity = Gravity.CENTER_VERTICAL;
// convert dip dimension
float density = context.getResources().getDisplayMetrics().density;
int imageSize = (int) (density * 25 + 0.5f);
int imageMargin = (int) (density * 15 + 0.5f);
// setup image view layout parameters
LinearLayout.LayoutParams imageParams = new LinearLayout.LayoutParams(imageSize, imageSize);
imageParams.setMargins(0, 0, imageMargin, 0);
imageParams.gravity = Gravity.CENTER_VERTICAL;
// setup image view
ImageView imageView = new ImageView(context);
imageView.setImageResource(imageResId);
imageView.setLayoutParams(imageParams);
// modify root layout
linearLayout.setOrientation(LinearLayout.HORIZONTAL);
linearLayout.addView(imageView, 0);
return toast;
}
MakeImageToast関数に渡す画像にToastのテキストを表示する方が良いと思うので、Knickediコードをシェーディングし、:
public class utility {
public static Toast makeImageToast(Context context, int imageResId, CharSequence text, int length) {
Toast toast = Toast.makeText(context, text, length);
View rootView = toast.getView();
LinearLayout linearLayout = null;
View messageTextView = null;
// check (expected) toast layout
if (rootView instanceof LinearLayout) {
linearLayout = (LinearLayout) rootView;
if (linearLayout.getChildCount() == 1) {
View child = linearLayout.getChildAt(0);
if (child instanceof TextView) {
messageTextView = (TextView) child;
((TextView) child).setGravity(Gravity.CENTER);
}
}
}
// cancel modification because toast layout is not what we expected
if (linearLayout == null || messageTextView == null) {
return toast;
}
ViewGroup.LayoutParams textParams = messageTextView.getLayoutParams();
((LinearLayout.LayoutParams) textParams).gravity = Gravity.CENTER;
// convert dip dimension
float density = context.getResources().getDisplayMetrics().density;
int imageSize = (int) (density * 25 + 0.5f);
int imageMargin = (int) (density * 15 + 0.5f);
// setup image view layout parameters
LinearLayout.LayoutParams imageParams = new LinearLayout.LayoutParams(imageSize, imageSize);
imageParams.setMargins(0, 0, imageMargin, 0);
imageParams.gravity = Gravity.CENTER;
// setup image view
ImageView imageView = new ImageView(context);
imageView.setImageResource(imageResId);
imageView.setLayoutParams(imageParams);
// modify root layout
linearLayout.setOrientation(LinearLayout.HORIZONTAL);
linearLayout.setBackgroundResource(imageResId);
linearLayout.setGravity(Gravity.CENTER);
linearLayout.setHorizontalGravity(Gravity.CENTER);
linearLayout.setHorizontalGravity(Gravity.CENTER);
//addView(imageView, 0);
return toast;
}
}
そして、これはそれの使用です:
utility.makeImageToast(getApplicationContext(),
R.drawable.your_image,"your_text",Toast.LENGTH_LONG).show();