Может ли findViewById(android.R.id.content) когда-либо возвращать ноль для Snackbars?

Я хочу иметь возможность отображать Снэк-бары, но меня смущает мысль о том, что я должен предоставить им представление. Вы могли бы подумать, что это позволит вам отображать снэк-бар внизу экрана по умолчанию, но, возможно, я что-то упустил.

В любом случае, предположительно, это можно сделать с помощью представления:

findViewById(android.R.id.content)

Однако я получаю предупреждение, что это может быть нулевым, даже если кажется, что оно всегда работает везде, где я это пробую. Когда это может быть нулевым?

2 ответа

Решение

findViewById всегда может быть нулевым, если вы пытаетесь найти представление, которое не существует в текущем макете.

Предупреждение это просто помощь. Это, вероятно, очень общий характер, и если вы загляните внутрь источника класса Activity, вы найдете этот метод:

@Nullable
public View findViewById(@IdRes int id) {
    return getWindow().findViewById(id);
}

Nullable аннотация просто сообщает компилятору, что может быть возможность получить null Ссылка здесь и Линт будет реагировать на это. Он не знает, как отличить findViewById(android.R.id.content) или какой-то другой звонок с findViewById(R.id.myCustomLayoutId), Вы могли бы, вероятно, добавить проверку Lint самостоятельно.

Вы можете безопасно использовать findViewById(android.R.id.content) всякий раз, когда вы внутри Activity,

Вы можете безопасно использовать getView() внутри Fragment всякий раз, когда onCreateView был вызван.

Передайте активность, если вы не в AppCompatActivity

public static void snackBar(Activity activity, String MESSAGE) {
    Snackbar.make(activity.findViewById(android.R.id.content), MESSAGE, Snackbar.LENGTH_LONG).show();
}

Если у вас есть контекст, вы можете попробовать вот так

public static void snackBar(Context context, String MESSAGE) {
    Snackbar.make(((Activity)context).findViewById(android.R.id.content), MESSAGE, Snackbar.LENGTH_LONG).show();
}
Другие вопросы по тегам