With Framelayout As Root Layout, Add View On Top Of Another One, With Offset Of X,y
Solution 1:
Based on the additional information in comments, even if it is possible to overlap a different layouts inside a FrameLayout
, those layouts will only be able to position their own children.
A RelativeLayout
won't be able to position one of its child views relative to a view in a different sibling or parent Layout.
The way to go would be to flattern the heierarchy of Layouts, setting the root layout to a RelativeLayout
or a ConstraintLayout
.
ConstraintLayout
is more flexible in terms of positioning views, but it is also more difficult to learn.
Here I am leaving an alternative to be used with RelativeLayout
as the root view. The important items to look at are the setting of the LayoutParams
which is sometimes a bit confussing.
The LayoutParams
are set on the child view, but the class used depends on the parent view.
Also take in mind that to keep margins display independent you need to convert dp into pixels (for the sake of simplicity I haven't done that, but there are examples of how to do this here in SO).
It also uses View.generteViewId()
go get an id for a view created dynamically.
To make it simple I included the reference View
in the xml, but i could have also been created dynamically.
Layout
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/rlContainer"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/tvCenterText"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Texto estatico"android:layout_centerInParent="true"/></RelativeLayout>
Main Activity
publicclassDynamicViewsActivityextendsAppCompatActivity {
RelativeLayout rlContainer;
TextView centerText;
@OverrideprotectedvoidonCreate(@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");
}
publicvoidplaceTextRelativeToBottomLeftOfViewAtXY(final RelativeLayout layout, View component, int x, int y, String text) {
finalTextViewtextView=newTextView(this);
textView.setId(View.generateViewId());
RelativeLayout.LayoutParamsparams=newRelativeLayout.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);
}
}
Post a Comment for "With Framelayout As Root Layout, Add View On Top Of Another One, With Offset Of X,y"