Ссылка на представления с одним и тем же идентификатором в разных макетах с расширениями kotlin для Android

В моем Android-проекте у меня есть два макета: num_info и num_info_pack. У обоих есть представления с идентификатором "circle". Поэтому я подумал, что ссылка на эти представления с помощью layout_name.circle решит проблему:

val inetView = activity.layoutInflater.inflate(R.layout.num_info_pack, parent, false)
    inetView.circle.setBackgroundResource(background)

Но круг подчеркнут красным и говорит:

Неопределенность разрешения перегрузки. Все эти функции совпадают.

public val View.circle: Просмотр! определено в kotlinx.android.synthetic.main.num_info_pack.view

public val View.circle: RelativeLayout! определено в kotlinx.android.synthetic.main.num_info_inet_plus_pack.view

Почему не понимает, о каком круге я говорю, если я конкретно говорю inetView.circle?


person Nazerke    schedule 19.05.2017    source источник


Ответы (3)


В дополнение к уже очень хорошим ответам, если у вас есть одинаковые идентификаторы в нескольких макетах в вашем проекте, не имеет значения, какой из них вы выберете. Подобные идентификаторы, независимо от того, какой макет он определен, в конечном итоге указывают на одно и то же представление. Таким образом, вы можете отказаться от других операций импорта, оставив только важные для вас макеты в текущем activity/fragment/view

надеюсь, это поможет

person Kingsley Adio    schedule 19.05.2017
comment
Действительно. Кто-нибудь хочет поделиться, почему это было отклонено? : O - person Kingsley Adio; 07.06.2017
comment
То, что вы сказали, на самом деле правильно. Вам просто нужно явно импортировать из одного из макетов, и он все равно будет указывать на правильный вид. - person Edward van Raak; 26.07.2018
comment
@KingsleyAdio, все было именно так, как ты сказал. Я только что импортировал из одного из макетов, и он понял это. У меня был собственный вид, который принимает разные макеты. Котлин все это понимает, просто импортировав любой из идентификаторов макета. большое спасибо. - person j2emanue; 03.10.2018
comment
@KingsleyAdio, ха-ха. В первое время я тоже не мог поверить в это. Если вы поместите какие-то коды или подробные пояснения, это будет убедительно. В любом случае, я голосую за вас. - person zwh; 17.01.2020

Решение здесь в импорте. Вы должны импортировать два макета, например

import kotlinx.android.synthetic.main.num_info_pack

а также

import kotlinx.android.synthetic.main.num_info_inet_plus_pack

Удалите один из них и оставьте один с соответствующим файлом макета, который вы хотите импортировать. Должно работать нормально.

person VipulKumar    schedule 18.08.2017

У меня сейчас нет студии Android, но я думаю, что это решит вашу проблему:

package XXX

import kotlinx.android.synthetic.main.num_info_inet_plus_pack.view.circle as inetViewCircle
import kotlinx.android.synthetic.main.num_info_pack.view as circle
//...
val inetView = activity.layoutInflater.inflate(R.layout.num_info_pack, parent, false)
inetViewCircle.setBackgroundResource(background)

Не знаю, сработает ли это, потому что я не могу проверить это прямо сейчас. Пожалуйста, дайте мне знать, работает ли он.

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

person glee8e    schedule 19.05.2017
comment
эй, да, это мое текущее решение, которое дает им разные имена. но таких случаев довольно много. так что это не выглядит опрятным, чтобы иметь такое большое количество импорта. Кроме того, inetView не является синтетическим объектом kotlin, это объект Android, поэтому inetView.inetViewCircle не работает. inetViewCircle.setBackground .... работает. - person Nazerke; 19.05.2017
comment
Ох, это интересно. Удаляю этот ответ. Не могли бы вы добавить обходной путь в текст вопроса? - person glee8e; 19.05.2017
comment
Вы можете оставить этот ответ. Это обходной путь. Я только что отредактировал это, теперь все в порядке - person Nazerke; 19.05.2017