Может ли 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();
}