Как сделать так, чтобы только часть вида (которая добавляется во время выполнения) перекрывала/перекрывала соседние виды?

В левой части следующей диаграммы показана исходная структура Activity, настроенная в XML, а в правой части показана Activity после некоторых изменений во время выполнения.

Черная рамка окружает RelativeLayout (я могу изменить ее на LinearLayout или что-то другое, если это решит мою проблему), которая является корнем макета Activity, красная рамка окружает RecyclerView, зеленая рамка находится внутри нее. заключает в себе элемент RecyclerView. Темно-синяя рамка окружает FrameLayout, к которому Fragment будет добавлено во время выполнения.

Теперь дело в том, что во время выполнения к окаймленному красной рамкой RecyclerView добавляются еще несколько элементов, которые в совокупности показаны рамкой с фиолетовой окантовкой в ​​правой части диаграммы. Только часть RecyclerView, содержащая эти новые добавленные элементы, должна перекрывать остальную часть содержимого Activity (то есть, по сути, FrameLayout)

Итак, какой макет я должен использовать в качестве корня Activity, как мне сделать возможным перекрытие соседей частью макета? Как мне это сделать? Будем признательны за любые предложения.

введите здесь описание изображения


comment
Итак, ваш вопрос заключается в том, как добиться того, чтобы xml делал то, что описано на изображениях выше? Если это так, вам нужно гарантировать, что высота зеленого поля всегда одинакова - в этом случае вы можете установить layout_height=match_parent синего поля, но добавить layout_marginTop=[static_height_of_green_box]. Также убедитесь, что красная рамка помечена под синей рамкой.   -  person ElliotM    schedule 09.09.2015
comment
@ElliotM Во-первых, большое спасибо! В этом случае вам необходимо гарантировать, что высота зеленого прямоугольника всегда одинакова она всегда одинакова, но wrap_content, а содержимое не является динамическим. Таким образом, высота зеленого прямоугольника всегда остается неизменной, и он содержит горизонтальные LinearLayout, содержащие ImageView, EditText и ImageView.   -  person Solace    schedule 09.09.2015


Ответы (1)


С помощью RelativeLayout, FrameLayout и CoordinatorLayout вы можете добиться расположения с перекрытием.

Однако может потребоваться больше деталей, чтобы узнать, что лучше для вас.

Редактировать:

Если зеленый макет имеет фиксированную высоту, скажем, 100dp, кажется, вы можете легко получить то, что хотите, с RelativeLayout

<RelativeLayout>
    <FrameLayout android:height="match_parent"
        android:width="match_parent"
        android:layout_marginTop="100dp"/>
    <RecyclerView/>
</RelativeLayout>
person Derek Fung    schedule 09.09.2015
comment
Эй, хорошая редакция! Две вещи: это layout_marginTop, и я считаю, что вам нужно переместить RecyclerView xml ниже FrameLayout xml, иначе FrameLayout будет отображаться сверху. - person ElliotM; 09.09.2015
comment
@ElliotM вам нужно переместить XML-файл RecyclerView ниже XML-файла FrameLayout, иначе FrameLayout будет отображаться сверху, но почему FrameLayout будет отображаться вверху, когда это происходит после RecyclerView в иерархии представлений ( т. е. его XML-элемент записывается после XML-элемента RecyclerView) в родительском RelativeLayout? - person Solace; 09.09.2015
comment
Во-первых, большое спасибо за ответ. Мне нравится решение, оно тоже пришло мне в голову, но, к сожалению, layout_height из RecyclerView равно wrap_content, поэтому я, вероятно, не могу пойти по этому пути =( - person Solace; 09.09.2015
comment
@Solace, чем позже вид в макете, тем позже он отображается, поэтому более поздний будет вверху. - person Derek Fung; 09.09.2015
comment
@DerekFung О, хорошо, хорошо, я понял. Спасибо - person Solace; 09.09.2015
comment
@Solace, на самом деле, что вы хотите отобразить в RecyclerView? Мне кажется странным иметь RecyclerView с wrap_content, для меня это больше похоже на LinearLayout - person Derek Fung; 09.09.2015
comment
@DerekFung Нет, нет, это не RecyclerView с высотой wrap_content, это строка RecyclerView (ViewHolder), имеющая эту высоту. Изначально это только одна строка, позже будут добавлены другие строки. - person Solace; 09.09.2015
comment
ic, возможно, вам нужно подумать о программной установке marginTop с прослушивателем глобального макета - person Derek Fung; 09.09.2015
comment
@DerekFung На самом деле я попытался установить android:marginTop="35dp" (просто стрелять в воздух) на RecyclerView, что натолкнуло меня на мысль, что мне нужно немного увеличить его, затем я попробовал 50dp, и это идеальный marginTop, который мне нужен. Я думаю, что это называется начальной загрузкой. =P Я отмечаю ваш ответ как принятый. - person Solace; 09.09.2015
comment
Рад, что это помогло вам более или менее :) - person Derek Fung; 09.09.2015