Can I set the position of the widget with programming in android instead the xml code. For example:
And like these. Are there methods instead the above xml code to use?
Yes you can set all the circled attributes via code aswell. For example this code aligns the button1 to the left of its parent (RelativeLayout) and positions button2 left of button1.
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
button1.setLayoutParams(params);
params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
params.addRule(RelativeLayout.RIGHT_OF, button1.getId());
button2.setLayoutParams(params);
Keep in mind that
layout_alignTop
layout_alignEnd
layout_alignParentBottom
layout_alignParentLeft
layout_alignParentStart
layout_toRightOf
layout_above
layout_below
layout_centerInParent
layout_centerHorizontal
will work only if the view you are setting the attributes to, is inside a RelativeLayout.
Original answer,
Yes you can, for example
Button button1 = new Button(R.id.buttonn);
Button button2 = new Button(R.id.buttonn2);
button1.setX(button2.getX);
There are more functions like setX , if you need something spesificly just ask for it :)
Related
I have this section in my layout file:
<RelativeLayout>
<LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView></TextView>
<TextView></TextView>
</LinearLayout>
</RelativeLayout>
My objective is to set the gravity of the items inside the linearLayout and then to add a margin to the whole LinearLayout programmatically.
This is what I have:
linearLayout_textBackground.setGravity(gravity); //where gravity is the int of the desired gravity
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
linearLayout_textBackground.setLayoutParams(layoutParams);
linearLayout_textBackground.requestLayout();
I would like to set the margin in using layoutParams but when I run the above code, I notice that my gravity value had been reset. However, if I comment out linearLayout_textBackground.setLayoutParams(layoutParams);, my gravity value are set correctly.
Why is the gravity resetting after I setLayoutParams to my layout?
When you do this :
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
You are creating new reference for your layout parameters the one you mention here will change the others not mentioned will be changed to default of android. If you want to change gravity then you need to change it after creating new params like:
Use this:
linearLayout_textBackground.setGravity(gravity);
after this:
linearLayout_textBackground.setLayoutParams(layoutParams);
or define your layout gravity in defining layoutParams.
But the recommended way of setting your gravity is inside your xml as follows:
android:layout_gravity="center"
then you dont need to do this :
linearLayout_textBackground.setGravity(gravity);
Thanks to #M.Saad Lakhan's answer, I noticed that I was creating a new reference of the parameters. So what I ended up doing is getting the actual params of the layout:
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)
linearLayout_textBackground.getLayoutParams();
This fixed the problem.
If I'm creating RelativeLayout of my own in code (not in XML) and wish to set its various attributes (android:layout_centerVertical, etc) what is the syntax for doing this?
I think you need to use LayoutParams. This should help you out:
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
Button button1;
button1.setLayoutParams(params);
params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
params.addRule(RelativeLayout.RIGHT_OF, button1.getId());
Button button2;
button2.setLayoutParams(params);
You need to create the LayoutParams object and then use addRule() to add rules to it. Then you just set the parameters to the View you want. Be careful when importing LayoutParams because there are different imports for different types of View. I think you'll want the one called RelativeLayout.LayoutParams
Here is a link to the dev guide for extra help
I've been trying to add multiple textviews and buttons when onClick, and this is the best code I have found that actually works:
RelativeLayout relative = (RelativeLayout) findViewById(R.id.RelativeLayout01);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
(LayoutParams.WRAP_CONTENT), (LayoutParams.WRAP_CONTENT));
TextView tv = new TextView(getApplicationContext());
tv.setLayoutParams(lp);
tv.setText("Shift" + mShiftCount);
EditText edittv = new EditText(getApplicationContext());
edittv.setLayoutParams(lp);
relative.addView(tv);
relative.addView(edittv);
This seems to be the best code to add additional items that are alike to that of what I already have in my main.XML file.
My issue is that when these are added, they appear at the top of the screen and I am unsure how to add further parameters to the objects.
How would I go about placing the textview and edittext below my other elements specified in the XML?
What you need to do is create a RelativeLayout.LayoutParams (refer here) when you add the views like tv and edittv to the RelativeLayout. In your RelativeLayout.LayoutParams, you need to define the same parameters you would give to your other RelativeLayout objects. Here is an example:
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
params.addRule(RelativeLayout.BELOW, R.id.idOfWhatYouWantToBeBelowOf);
addView(tv, params);
First off there are definitely some static components to your view and some dynamic components. can you please specify what is your layout file so that i can give you a much more detail in your application.
I'm using a FrameLayout to display (on demand) some text on the screen. I want the text to be in a certain place, so I thought setGravity() would do the job... but no, it seems to have no effect whatsoever on where the text goes (and other objects like ImageView don't even have this method).
So first, what exactly is TextView.setGravity() used for? (Edit: I understand this much better now, thanks! Still not clear on the following part of the question though.)
Second, it seems the only way to update a FrameLayout in this way is to create a new FrameLayout.LayoutParams object with the settings you want, and then use the setLayoutParams() method to apply it. (This seems to automatically update the view so is a requestLayout() call necessary?) And is there a simpler / more straightforward way to achieve this for a FrameLayout... say, without creating a new LayoutParams object as I'm doing now?
Thanks! For reference, below is a (working) code snippet showing how I'm setting up this FrameLayout and TextView.
FrameLayout fl1 = new FrameLayout(this);
FrameLayout.LayoutParams flp1 = new FrameLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
fl1.setId(9001);
fl1.setLayoutParams(flp1);
.....
tv1 = new TextView(this);
FrameLayout.LayoutParams tvp1 = new FrameLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM));
tv1.setId(9006);
tv1.setLayoutParams(tvp1); // This works
tv1.setBackgroundColor(Color.GRAY);
tv1.setTextColor(Color.BLACK);
tv1.setText("Dynamic layouts ftw!");
tv1.setGravity(Gravity.CENTER); // This does NOT work
.....
fl1.addView(tv1);
1) view.setGravity means hows the view should positions if children.
In the case of the textview it refers to the positioning of the text.
When in linearlayouts or viewgroups it refers to its child views.
2) I checked your code. You are already using textview.setGravity method. In that case you dont need to specify gravity parameters in the FrameLayout.LayoutParams constructor.
Other thing I noticed is that you gave the textview the width and height as wrap content which will only take the size of the text. So there is no meaning in giving gravity as the textview has no extra area to position the text to the center. You need to give the width of the textview as fill_parent. That should make your gravity property work.
Btw this is a very good article about Gravities. It explains both about gravity and the layout_gravity attribute.
If you want your textview to wrap the content then you should add your textview to a linearlayout and setgravity to the linear layout.
This should give what your are trying to do
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);
FrameLayout fr = new FrameLayout(this);
fr.setLayoutParams(lp);
fr.setBackgroundColor(Color.RED);
LinearLayout.LayoutParams lp2 = new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
LinearLayout l = new LinearLayout(this);
l.setLayoutParams(lp2);
l.setGravity(Gravity.CENTER);
l.setBackgroundColor(Color.BLUE);
ViewGroup.LayoutParams vp = new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
TextView t = new TextView(this);
t.setLayoutParams(vp);
t.setText("Blessan Mathew");
t.setBackgroundColor(Color.CYAN);
l.addView(t);
fr.addView(l);
tv1.setGravity(Gravity.CENTER);
belongs to the gravity of the TEXT inside the TextView.
As documentation states:
Sets the horizontal alignment of the text and the vertical gravity
that will be used when there is extra space in the TextView beyond
what is required for the text itself.
I have a dynamic layout and I have a button. How can I set the property layout_alignParentBottom to that button so that it would appear in the bottom of my relative layout?
Or do you know another way?
This will only work if your layout is a RelativeLayout, as other ViewGroups don't understand alignParentBottom.
RelativeLayout layout = findViewById(R.id.my_relative_layout);
Button button = new Button(this); // your button
lp = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); // You might want to tweak these to WRAP_CONTENT
lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
layout.addView(button, lp);