2013-02-14 5 views
0

Я написал пользовательский вид, который переопределяет onMeasure() и onLayout(), чтобы выполнить очень конкретную задачу, игнорируя некоторые атрибуты, такие как layout_height и layout_width. Поскольку уже не имеет смысла указывать эти атрибуты, я хочу опустить их в своем XML-макете. Но если я делаю, я получаю исключение говорит, что атрибуты необходимы:Программно добавить в AttributeSet в пользовательском представлении

RuntimeException: Binary XML file line #49: You must supply a layout_width attribute. 

Есть ли способ, чтобы больше не требует определенных обязательных атрибутов?

Я собирался попробовать добавить эти свойства программным путем в конструкторе View, но у AttributeSet только есть методы для извлечения значений, а не для их установки. Я посмотрел, могу ли я найти решение, используя attrs.xml, но не видел ничего перспективного. Идеи?

+0

Почему вы не можете просто использовать эти атрибуты (с любым желаемым значением) и игнорировать их, если они вам не нужны? – Luksprog

+0

Я могу (и делать), но я бы предпочел избежать беспорядка указания «обязательных» атрибутов, которые полностью игнорируются. Похоже, для этого есть прецедент. Например, SlidingDrawer от Android также не учитывает высоту и ширину. Поэтому мне было любопытно, если Android предоставил возможность опустить стандартные атрибуты, которые обычно (но не всегда) требуются. Кажется, это не так, но я подумал, что это стоит того. – spaaarky21

+0

'SlidingDrawer' не учитывает высоту и ширину, но для этого ** требуется ** те атрибуты, которые будут присутствовать (чтобы вы могли увидеть, как инженеры SDK решили проблему, с которой вы столкнулись). Во всяком случае, эта проверка выполняется, когда «LayoutParams» для представления построены, поэтому вы не можете много сделать (и в любом случае это не стоило бы усилий). – Luksprog

ответ

0

Для того, чтобы закрыть этот вопрос, я продолжу и обобщу обсуждение, которое прошло до сих пор, а также некоторые дополнительные сведения.

Проще говоря, layout_width и layout_height всегда должны быть установлены независимо от того, соблюдают ли они вид, на который они установлены. Даже представления, предоставляемые Android, которые игнорируют эти атрибуты, по-прежнему требуют их установки в XML-макете.

Когда макет раздувается, пользовательский вид создается до того, как выбрано исключение проверки. Когда я регистрирую класс AttributeSet, предоставленный конструктору View, я вижу, что это XmlBlock $ Parser. Я полагаю, что могу установить фиктивное значение layout_height и layout_width, выполнив команду AttributeSet и вызвав setProperty(), чтобы проверка прошла успешно без указания этих атрибутов в XML. Однако, этот подход предполагает, что предоставленный атрибут всегда является конкретной реализацией во всех ситуациях и во всех версиях Android.

+0

За исключением случаев с детьми GridLayout. Там нет необходимости иметь представления layout_width или layout_height. Мне потребовалось некоторое время, когда мой собственный, внутренний, «layout_width/height» отсутствующий сигнал тревоги ушел, когда я их тоже увижу. – lilbyrdie

Смежные вопросы