web-dev-qa-db-ja.com

スナックバーにアイコンを追加する方法はありますか?

これは私のスナックバーコードです:

        Snackbar.make(viewHolder.productView, "Some Text Here ..", Snackbar.LENGTH_SHORT)
                .setAction("I want be a icon here instead TEXT", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        // Perform anything for the action selected
                    }
                })
                .show();

とにかく.setActionにテキストの代わりにアイコンを追加することはありますか?

私は GoogleがSnackbarのアイコンを使用しないことを提案 を知っていますが、それを使用したいと思います。

26
Farhad ArcxX

ImageSpanは長いテキスト(複数行)で正しく表示されない場合があります。代わりに、左側の複合ドローアブルを使用してください(Android:drawableLeftと同じ)。

Snackbar snackbar = Snackbar.make(layout, R.string.test, Snackbar.LENGTH_LONG);
View snackbarLayout = snackbar.getView();
TextView textView = (TextView)snackbarLayout.findViewById(Android.support.design.R.id.snackbar_text);
textView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.white_checkbox, 0, 0, 0);
textView.setCompoundDrawablePadding(getResources().getDimensionPixelOffset(R.dimen.snackbar_icon_padding));
snackbar.show();

AndroidX Materialライブラリを使用している場合は、Android.support.design.R.id.snackbar_textcom.google.Android.material.R.id.snackbar_textに置き換えます。

44
Daniel Zolnai

ImageSpanをご存知ですか?それはあなたがあなたの目標を達成するのを助けるかもしれません!以下のコードを参照してください:

SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append("My message ").append(" ");
builder.setSpan(new ImageSpan(MainActivity.this, R.drawable.ic_launcher), builder.length() - 1, builder.length(), 0);
builder.append(" next message");
Snackbar.make(parent view, builder, Snackbar.LENGTH_LONG).show();]

大きなアイコンは重力を維持しないため使用しないでください。

Ref: AndroidのTextViewで画像を表示する方法

お役に立てば幸いです。

17
Harry

Snackbarを変更できるのはこれだけです。

Snackbar snackbar = Snackbar
  .make(parentLayout, R.string.snackbar_text, Snackbar.LENGTH_LONG)
  .setAction(R.string.snackbar_action, myOnClickListener);
snackbar.setActionTextColor(Color.CYAN);
View snackbarView = snackbar.getView();
snackbarView.setBackgroundColor(Color.YELLOW);//change Snackbar's background color;
TextView textView = (TextView)snackbarView .findViewById(Android.support.design.R.id.snackbar_text);
textView.setTextColor(Color.BLUE);//change Snackbar's text color;
snackbar.show(); // Don’t forget to show!

残念ながら、Snackbarとは異なり、Toastの内容をカスタマイズすることはできません。将来は?知りません。

3
SilentKnight

スナックバーの左側にアイコンを追加するとします。次のコードは、これを実現するのに役立ちます。

SpannableStringBuilder builderTextLeft = new SpannableStringBuilder();
builderTextLeft.append(" ");
builderTextLeft.setSpan(new ImageSpan(context, R.drawable.ic_vector), 0, 1, 0);
Snackbar snackbar = Snackbar.make(parentLayout, builderTextLeft, Snackbar.LENGTH_LONG);
snackbar.show();

上記のコードでは、スナックバーの左側に情報アイコンを追加しています。

スナックバーの右側にアイコンを追加する場合は、次のことを行う必要があります。

SpannableStringBuilder buildetTextRight = new SpannableStringBuilder();
buildetTextRight.append(" ");
buildetTextRight.setSpan(new ImageSpan(context, R.drawable.ic_close),
                buildetTextRight.length()-1, buildetTextRight.length(), 0);

上記のコードでは、スナックバーの右側に閉じるアイコンを追加しています。

0
Avik Chowdhury

SnackbarContentLayoutにビューを追加することもできます

Kotlinコード:

val snackbar = Snackbar.make(....
val textView = snackbar.view.findViewById(R.id.snackbar_action) as TextView
textView.isAllCaps = false
val imgClose = ImageView(context)
imgClose.scaleType = ImageView.ScaleType.CENTER_INSIDE
val layImageParams = ViewGroup.LayoutParams(WRAP_CONTENT, MATCH_PARENT)
imgClose.setImageResource(R.drawable.ic_close)
(textView.parent as SnackbarContentLayout).addView(imgClose, layImageParams)
imgClose.setOnClickListener { snackbar.dismiss() }
snackbar.show()
0
anthorlop