На основании дополнительной информации в комментариях, даже если есть возможность перекрывать различные макеты внутри FrameLayout
, эти макеты смогут позиционировать только своих собственных дочерних элементов.RelativeLayout
не сможет позиционировать одно из своих дочерних представлений относительно представления в другом родственном или родительском макете.
Можно пойти путем выравнивания иерархии макетов, установив кореньмакет на RelativeLayout
или ConstraintLayout
.
ConstraintLayout
более гибок с точки зрения позиционирования видов, но его также сложнее освоить.
Здесь я оставляюАльтернатива для использования с RelativeLayout
в качестве корневого представления.Важными элементами, на которые следует обратить внимание, является параметр LayoutParams
, который иногда немного сбивает с толку.
LayoutParams
установлен на дочернем представлении, но используемый класс зависит от родительского представления.
Также имейте в виду, что для сохранения независимости полей необходимо конвертировать dp в пиксели (для простоты я этого не делал, но есть примеры того, как это сделать здесь, в SO).
Он также использует View.generteViewId()
иди и получите идентификатор для динамически создаваемого представления.
Для простоты я включил ссылку View
в xml, но я мог бы также быть создан динамически.
Макет
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rlContainer"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tvCenterText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Texto estatico"
android:layout_centerInParent="true"/>
</RelativeLayout>
Основная деятельность
public class DynamicViewsActivity extends AppCompatActivity {
RelativeLayout rlContainer;
TextView centerText;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dynamicviews);
rlContainer = findViewById(R.id.rlContainer);
centerText = findViewById(R.id.tvCenterText);
placeTextRelativeToBottomLeftOfViewAtXY(rlContainer, centerText, 100,10, "Hola");
}
public void placeTextRelativeToBottomLeftOfViewAtXY(final RelativeLayout layout, View component, int x, int y, String text) {
final TextView textView = new TextView(this);
textView.setId(View.generateViewId());
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(x, y, x,y);
params.addRule(RelativeLayout.LEFT_OF, component.getId());
params.addRule(RelativeLayout.ALIGN_BASELINE, component.getId());
textView.setLayoutParams(params);
textView.setText(text);
layout.addView(textView);
}
}