Синтаксис вызова findViewById() в android

271
02 июня 2017, 11:23

В книгах по основам Java было написано что для вызова метода нужно указать сначала ссылку на объект, а потом после точки сам метод. Если же метод статический то указывается класс, а потом после точки метод. А в книге по android читаю TextView brands = (TextView) findViewById(R.id.brands);.Почему не указывается ни класс ни объект? Это из-за того что объявление метода находится в том же классе что и вызов? Или же это просто упрощение, а AndroidStudio в дальнейшем при сборке сама добавляет всё что нужно?

Answer 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

Answer 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);
Answer 3
TextView brands = (TextView) findViewById(R.id.brands);

Попробуем разобрать

TextView brands - TextView это тип данных, класс, которому должна соответствовать переменная brands.

(TextView) - К данному типу данных, класса, вы приводите то значение, которое будет сформировано в вызове функции findViewById, параметром которой является id созданного вами View (в данном случае TextView) в layout-представлении.

findViewById - public метод вашего Активити, поэтому он вызывается без объекта с точкой впереди.

Answer 4

Ссылка на view пишется так findViewById(R.id.(id обьекта))

READ ALSO
База консолидатор

База консолидатор

Добрый деньУ меня есть задача по реализации реляционной базы - консолидатора на базе Postgres

189
StreamResource вставляет разделитель “+” между словами(Vaadin)

StreamResource вставляет разделитель “+” между словами(Vaadin)

При попытке сохранить отчет на компьютер, в названии файлов вместо пробела проставляется сепаратор "+"Подскажите что можно сделать?

165
Поделиться текстом с HTML тегами

Поделиться текстом с HTML тегами

ПриветствуюУ меня приложение получает текст из БД, текст в БД обработан HTML тегами, я реализовал кнопку Share и прописал в методе onClick следующий...

156