Оказывается, что мои два запроса в этом посте были больше связаны, чем ожидалось.
Я понял, что, установив LayoutParams моего представления в совершенно новый экземпляр, я переписал информацию о расположении макета, необходимую для Относительного макета, чтобыРасположите мой вид.
Путем «обнуления» этой информации мой вид имеет правильные размеры, но макет не знает, где его разместить, поэтому просто не знает.
Следующий код для нового onMeasure показывает, как просто изменяя высоту и ширину LayoutParams, уже прикрепленных к моему представлению, я избегаю как перезаписи информации о положении макета, так и создания новых LayoutParams на основе типа родителя.
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int specWidth = MeasureSpec.getSize(widthMeasureSpec);
int specHeight = MeasureSpec.getSize(heightMeasureSpec);
int newWidth = (int) Math.ceil(parentWidth * 0.8);
int newHeight = (int) Math.ceil(parentHeight * 0.8);
this.setMeasuredDimension(newWidth, newHeight);
this.getLayoutParams().height = newHeight;
this.getLayoutParams().width = newWidth;
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
Теперь я буду честен и скажу, что этот код по-прежнему не содержит ошибок.Многократный перенос действия на передний план и фон постоянно уменьшает размер этого настраиваемого представления.Коэффициент уменьшения 0,8 применяется снова и снова при каждом запуске операции (я подозреваю, что настройка LayoutParams имеет к этому отношение, она может быть на самом деле ненужной, но у меня нет времени на тестирование).
НО, это все же ответило на вопрос, касающийся этого поста, а именно, почему мое мнение вообще не появилось, несмотря на наличие правильных размеров.