Пользовательское надувание тостов – Android

Я создаю собственный класс тостов под названием MyToast:

public class MyToast extends Toast {

    public static final int RED = 0;
    public static final int BLUE = 1;

    public MyToast(Context context, String data, int color) {
        super(context);

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View layout = inflater.inflate(R.layout.my_toast, null);
        setView(layout);

        TextView tvToast = (TextView) layout.findViewById(R.id.tvToast);
        tvToast.setText(data);

        if(color == RED) {
            tvToast.setBackgroundResource(R.drawable.red_background);
            tvToast.setTextColor(context.getResources().getColor(R.color.red));
        } else {
            tvToast.setBackgroundResource(R.drawable.blue_background);
            tvToast.setTextColor(Color.WHITE);
        }
    }
}

my_toast.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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp" >

    <TextView
        android:id="@+id/tvToast"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium" />

</LinearLayout>

Использование MyToast в MainActivity:

new MyToast(context, getResources().getString(
                            R.string.uspesna_najava), MyToast.BLUE).show();

Я получаю это предупреждение:

Избегайте передачи null в качестве корня представления (необходимо для разрешения параметров макета в корневом элементе расширенного макета)

в этой части кода:

View layout = inflater.inflate(R.layout.my_toast, null);

Этот код работает хорошо, но я хочу избавиться от этого предупреждения. Я знаю, что мне нужно раздувать вот так, чтобы избежать этого предупреждения:

View layout = inflater.inflate(R.layout.my_toast, parent, false);

Но где я могу найти родителя?

На официальном сайте Android Developers они расширяют представление следующим образом:

    LayoutInflater inflater = ((Activity) context).getLayoutInflater();
    View layout = inflater.inflate(R.layout.my_toast, (ViewGroup) findViewById(R.id.toast_layout_root));

Я пробовал так, но получаю ошибку:

Метод findViewById(int) не определен для типа MyToast


person KiKo    schedule 09.12.2014    source источник
comment
Как настроить Toast в Android   -  person Top Cat    schedule 09.12.2014


Ответы (1)


Конечно, метод findViewById — это метод Activity.

Таким образом, пример кода находится в классе Activity, поэтому простой вызов findViewById не вызовет проблем.

Следовательно, ваш код находится в классе MyToast, вы должны вызвать метод для экземпляра Activity:

((Activity) context).findViewById(R.id.toast_layout_root)
person hata    schedule 09.12.2014
comment
У меня похожая проблема. Но контекст, который я передаю, относится к Сервису, а не к Деятельности. Есть ли другой способ получить метод findViewById? - person Aakaash Jois; 25.09.2016