#java #android
В книгах по основам Java было написано, что для вызова метода нужно указать сначала ссылку на объект, а потом после точки сам метод. Если же метод статический то указывается класс, а потом после точки метод. А в книге по Android читаю TextView brands = (TextView) findViewById(R.id.brands);. Почему не указывается ни класс ни объект? Это из-за того, что объявление метода находится в том же классе что и вызов? Или же это просто упрощение, а AndroidStudio в дальнейшем при сборке сама добавляет всё что нужно?
Ответы
Ответ 1
метод 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Ответ 2
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);Ответ 3
TextView brands = (TextView) findViewById(R.id.brands); Попробуем разобрать TextView brands - TextView это тип данных, класс, которому должна соответствовать переменная brands. (TextView) - К данному типу данных, класса, вы приводите то значение, которое будет сформировано в вызове функции findViewById, параметром которой является id созданного вами View (в данном случае TextView) в layout-представлении. findViewById - public метод вашего Активити, поэтому он вызывается без объекта с точкой впереди.Ответ 4
Ссылка на view пишется так findViewById(R.id.(id обьекта))
Комментариев нет:
Отправить комментарий