Android: пересчитать размер компонентов компоновки

Согласно документации cloneElement()

React.cloneElement(
  element,
  [props],
  [...children]
)

Clone и возвратите новый элемент React, используя элемент в качестве отправной точки. Получившийся элемент будет иметь реквизит оригинального элемента с новым реквизитом, сложенным неглубоко. Новые дети заменят существующих детей. ключ и ref из исходного элемента будут сохранены.

React.cloneElement() почти эквивалентен:

{children}

Однако он также сохраняет ссылки. Это означает, что если вы получите ребенка с рефлексией на нем, вы случайно не украдете его у своего предка. Вы получите тот же ref, что и ваш новый элемент.

blockquote>

Итак, cloneElement - это то, что вы использовали бы для предоставления пользовательских реквизитов для детей. Однако в компоненте может быть несколько дочерних элементов, и вам нужно будет зациклиться на нем. Другие варианты подсказок позволяют вам сопоставить их с помощью React.Children.map. Однако React.Children.map, в отличие от React.cloneElement, изменяет ключи добавления Element и дополнительно .$ в качестве префикса. Проверьте этот вопрос для получения дополнительной информации: React.cloneElement внутри React.Children.map вызывает изменение ключей элемента

Если вы хотите этого избежать, вместо этого вы должны пойти на forEach, например

render() {
    const newElements = [];
    React.Children.forEach(this.props.children, 
              child => newElements.push(
                 React.cloneElement(
                   child, 
                   {...this.props, ...customProps}
                )
              )
    )
    return (
        
{newElements}
) }

0
задан Rafael Lima 13 July 2018 в 23:42
поделиться

1 ответ

Чтобы обновить LinearLayout или любое представление, вы используете свой метод invalidate().

Редактирование: если вы хотите переоценить представление, вызовите его requestLayout(). Не забудьте также аннулировать его.

Также ваше баннерное объявление Admob нарушает свою Политику. Баннерные объявления не могут накладываться на контент приложения.

0
ответ дан Jackey 17 August 2018 в 12:06
поделиться
  • 1
    вы, вероятно, не читали внимательно, что я написал. баннер именно так из-за проблемы макета, второй недействительный не решает его – Rafael Lima 13 July 2018 в 23:31
  • 2
    И поэтому вы подаете ответ? – Amit K. Saha 13 July 2018 в 23:33
  • 3
    invalidate не работает, поскольку 99% людей просто думают ... это не метод серебряной пули для проблем с макетами ... – Rafael Lima 13 July 2018 в 23:35
  • 4
    @RafaelLima, ваш вопрос был & quot; Как я могу заставить LinearLayout пересчитать высоту представлений? & Quot; и Джекей ответил «invalidate ()». это правильный ответ, но опять-таки это может не помочь вам из-за вашего закрытого дела. Либо вам нужно научиться правильно задавать вопрос, либо вам нужно научиться, когда спускаться вниз. Удачи! – Amit K. Saha 13 July 2018 в 23:47
  • 5
    @RafaelLima Честно говоря, я просто бросаю самые очевидные, так как скриншот меня озадачивает. LinearLayout расставляет все виды последовательно, и это не позволяет перекрывать, из-за чего я изначально полагаю, что представление, которое вы программно добавляете, не было AdView. Это перекрытие показало, что AdView находится в отдельном контейнере, который, если он ... затем недействителен и запрашивает макет для любого из отображаемых вами представлений, не будет работать. Я действительно хочу помочь, но из кода, который вы показали, и скриншота, я не могу не чувствовать, что информация отсутствует, поэтому я могу только выбросить очевидное. – Jackey 14 July 2018 в 00:18
Другие вопросы по тегам:

Похожие вопросы: