web-dev-qa-db-ja.com

アクティビティのテーマに合わせてトーストの背景を変更

すべてのアクティビティで使用するカスタムテーマを作成しました。テーマでは、Android:backgroundを設定すると、ダイアログやトーストメッセージが非常に奇妙に見えます。

トーストや他のダイアログがテーマのプロパティを吸収しないようにするにはどうすればよいですか?

22
Malfist

次のコードでカスタムトーストを簡単に作成できます。

Toast toast = Toast.makeText(context, resTxtId, Toast.LENGTH_LONG);
View view = toast.getView();
view.setBackgroundResource(R.drawable.custom_bkg);
TextView text = (TextView) view.findViewById(Android.R.id.message);
/*here you can do anything with text*/
toast.show();

または、完全にカスタムのトーストをインスタンス化できます。

Toast toast = new Toast(context);
toast.setDuration(Toast.LENGTH_LONG);

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View view = inflater.inflate(R.layout.custom_layout, null);
toast.setView(view);
toast.show();

ダイアログのカスタマイズは、より複雑なルーチンです。しかし、同様の回避策があります。

53
Dmitry

質問には回答済みで、この段階では投稿はかなり古いものです。しかし、私はこの質問に出くわした人たちに答えを残したいと思いました。

今日、この問題に遭遇しました。解決方法は、次のようなトーストメッセージを表示することでした。

Toast.makeText(getApplicationContext(), "Checking login details...", Toast.LENGTH_SHORT).show();

これとは対照的に(メッセージがビュー内から呼び出されていると想定):

Toast.makeText(v.getContext(), "Checking login details...", Toast.LENGTH_SHORT).show();

それは私が抱えていた問題を解決しました。とにかくそれが役に立てば幸いです。これは、同様のトピックに関する私の質問へのリンクです。

トーストの背景色が変更されています

29
Javacadabra

これは、アクティビティ全体でカスタマイズされたトーストに使用される完全な例です。

displayToast

// display customized Toast message
    public static int SHORT_TOAST = 0;
    public static int LONG_TOAST = 1;
    public static void displayToast(Context caller, String toastMsg, int toastType){

        try {// try-catch to avoid stupid app crashes
            LayoutInflater inflater = LayoutInflater.from(caller);

            View mainLayout = inflater.inflate(R.layout.toast_layout, null);
            View rootLayout = mainLayout.findViewById(R.id.toast_layout_root);

            ImageView image = (ImageView) mainLayout.findViewById(R.id.image);
            image.setImageResource(R.drawable.img_icon_notification);
            TextView text = (TextView) mainLayout.findViewById(R.id.text);
            text.setText(toastMsg);

            Toast toast = new Toast(caller);
            //toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
            toast.setGravity(Gravity.BOTTOM, 0, 0);
            if (toastType==SHORT_TOAST)//(isShort)
                toast.setDuration(Toast.LENGTH_SHORT);
            else
                toast.setDuration(Toast.LENGTH_LONG);
            toast.setView(rootLayout);
            toast.show();
        }
        catch(Exception ex) {// to avoid stupid app crashes
            Log.w(TAG, ex.toString());
        }
    }

および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="fill_parent"
              Android:layout_height="fill_parent"
              Android:padding="10dp"
              Android:background="#DAAA"
              >
    <ImageView Android:id="@+id/image"
               Android:layout_width="wrap_content"
               Android:layout_height="fill_parent"
               Android:layout_marginRight="10dp"
               />
    <TextView Android:id="@+id/text"
              Android:layout_width="wrap_content"
              Android:layout_height="fill_parent"
              Android:textColor="#FFF"
              />
</LinearLayout>
5
guleryuz