В книгах по основам Java было написано что для вызова метода нужно указать сначала ссылку на объект, а потом после точки сам метод. Если же метод статический то указывается класс, а потом после точки метод. А в книге по android читаю TextView brands = (TextView) findViewById(R.id.brands);.Почему не указывается ни класс ни объект? Это из-за того что объявление метода находится в том же классе что и вызов? Или же это просто упрощение, а AndroidStudio в дальнейшем при сборке сама добавляет всё что нужно?
метод findViewById()
- метод класса Activity
(и ее наследников), поэтому при вызове данного метода в классе активити указывать экземпляр класса нет необходимости, это ее собственный метод. Если вы непременно хотите поставить точку и обатиться к объекту, то можете вызывать этот метод у текущего экземпляра класса:
Button btn = this.findViewById(R.id.button);
Если найти элемент на разметке нужно не в пределах активити, а в фрагменте, диалоге (эти классы не содержат собственного метода findViewById()
) или другом ViewGroup
, то для поиска необходимо использовать тот экземпляр ViewGroup
, в котором предположительно находится данный элемент, например в фрагменте:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment1, container, false);
Button btn = rootView.findViewById(R.id.button);
return rootView;
}
в этих случаях используется метод findViewById()
класса View
, а не Activity
и указывать экземпляр класса, в котором осуществлять поиск обязательно, так как поиск осуществляется за пределами экземпляра класса View
Android Studio тут не причём. Это так будет работать в любой IDE или даже в Блокноте.
Это из-за того что объявление метода находится в том же классе что и вызов?
Да, всё верно. Метод public View findViewById(@IdRes int id)
объявлен в классе Activity
. Поэтому, если вы вызываете его внутри класса Activity
или любого из его наследников, например AppCompatActivity
, FragmentActivity
и т.д., то вы сразу пишете название метода:
TextView brands = (TextView) findViewById(R.id.brands);
Также можно явно указать экземпляр класса:
TextView brands = (TextView) this.findViewById(R.id.brands);
В данном случае эти два выражения эквивалентны.
Но вот Fragment
не является наследником класса Activity
, поэтому мы не можем использовать этот метод тем же способом внутри фрагмента. Вместо этого мы вызываем этот метод у View
, которая также не является наследником Activity
, но имеет такой же метод, который ни как не связан с методом активити, хотя и называется точно также:
TextView brands = (TextView) getView().findViewById(R.id.brands);
TextView brands = (TextView) findViewById(R.id.brands);
Попробуем разобрать
TextView brands
- TextView
это тип данных, класс, которому должна соответствовать переменная brands
.
(TextView)
- К данному типу данных, класса, вы приводите то значение, которое будет сформировано в вызове функции findViewById
, параметром которой является id
созданного вами View
(в данном случае TextView
) в layout
-представлении.
findViewById - public метод вашего Активити, поэтому он вызывается без объекта с точкой впереди.
Ссылка на view пишется так findViewById(R.id.(id обьекта))
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Добрый деньУ меня есть задача по реализации реляционной базы - консолидатора на базе Postgres
При попытке сохранить отчет на компьютер, в названии файлов вместо пробела проставляется сепаратор "+"Подскажите что можно сделать?
ПриветствуюУ меня приложение получает текст из БД, текст в БД обработан HTML тегами, я реализовал кнопку Share и прописал в методе onClick следующий...