Android set height and width of Custom view programmatically
I have created a custom view named Graphview
. Here is the structure for the GraphView clas开发者_开发问答s.
public class GraphView extends View {
public GraphView(Context context, float[] values, String title, String[] horlabels, String[] verlabels, boolean type) {
super(context);
........
}
..................
.................
}
I have added the view in a tablerow using addview()
. It is working fine. Now I want to set height and width for the GraphView
. How to do that?
You can set height and width like this:
myGraphView.setLayoutParams(new LayoutParams(width, height));
If you know the exact size of the view, just use setLayoutParams()
:
graphView.setLayoutParams(new LayoutParams(width, height));
Or in Kotlin:
graphView.layoutParams = LayoutParams(width, height)
However, if you need a more flexible approach you can override onMeasure()
to measure the view more precisely depending on the space available and layout constraints (wrap_content
, match_parent
, or a fixed size). You can find more details about onMeasure()
in the android docs.
you can set the height and width of a view in a relative layout like this
ViewGroup.LayoutParams params = view.getLayoutParams();
params.height = 130;
view.setLayoutParams(params);
On Kotlin you can set width and height of any view directly using their virtual properties:
someView.layoutParams.width = 100
someView.layoutParams.height = 200
If you're using Kotlin, you can also use the following code which applies your given lambda on the current layout params:
someView.updateLayoutParams {
height = 200
}
spin12.setLayoutParams(new LinearLayout.LayoutParams(200, 120));
spin12
is your spinner and 200,120 is width
and height
for your spinner
.
This is a Kotlin based version, assuming that the parent view is an instance of LinearLayout
.
someView.layoutParams = LinearLayout.LayoutParams(100, 200)
This allows to set the width and height (100
and 200
) in a single line.
Adding on to the solution by @MorganWilde. You can use the following code if you want to use WRAP_CONTENT/MATCH_PARENT.
someView.layoutParams =
LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT)
Typical real-world example:
in a Fragment:
private LinearLayout images;
...
float dpf = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 69, getResources().getDisplayMetrics());
for (int i = 0; i < 10; i++) {
SpecialImage s = new SpecialImage(getActivity());
images.addView(s);
s.setLayoutParams(new LinearLayout.LayoutParams(
(int) dpf, LinearLayout.LayoutParams.MATCH_PARENT));
}
- useless unless use DIP conversion
- this usually happens in fragments, notice
getActivity()
- you're usually adding a few into a linear layout or similar
- typically one dimension is "fill parent"
- you must use the "correct"
LayoutParams
(ie,LinearLayout.LayoutParams
in the example
here this class take care of everything you need for working with views programmatically
public class LayoutHelper {
public static final int MATCH_PARENT = -1;
public static final int WRAP_CONTENT = -2;
private static int getSize(float size) {
return (int) (size < 0 ? size : AndroidUtilities.dp(size));
}
public static ScrollView.LayoutParams createScroll(int width, int height, int gravity) {
return new ScrollView.LayoutParams(getSize(width), getSize(height), gravity);
}
public static ScrollView.LayoutParams createScroll(int width, int height, int gravity, float leftMargin, float topMargin, float rightMargin, float bottomMargin) {
ScrollView.LayoutParams layoutParams = new ScrollView.LayoutParams(getSize(width), getSize(height), gravity);
layoutParams.leftMargin = AndroidUtilities.dp(leftMargin);
layoutParams.topMargin = AndroidUtilities.dp(topMargin);
layoutParams.rightMargin = AndroidUtilities.dp(rightMargin);
layoutParams.bottomMargin = AndroidUtilities.dp(bottomMargin);
return layoutParams;
}
public static FrameLayout.LayoutParams createFrame(int width, float height, int gravity, float leftMargin, float topMargin, float rightMargin, float bottomMargin) {
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(getSize(width), getSize(height), gravity);
layoutParams.setMargins(AndroidUtilities.dp(leftMargin), AndroidUtilities.dp(topMargin), AndroidUtilities.dp(rightMargin), AndroidUtilities.dp(bottomMargin));
return layoutParams;
}
public static FrameLayout.LayoutParams createFrame(int width, int height, int gravity) {
return new FrameLayout.LayoutParams(getSize(width), getSize(height), gravity);
}
public static FrameLayout.LayoutParams createFrame(int width, float height) {
return new FrameLayout.LayoutParams(getSize(width), getSize(height));
}
public static RelativeLayout.LayoutParams createRelative(float width, float height, int leftMargin, int topMargin, int rightMargin, int bottomMargin, int alignParent, int alignRelative, int anchorRelative) {
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(getSize(width), getSize(height));
if (alignParent >= 0) {
layoutParams.addRule(alignParent);
}
if (alignRelative >= 0 && anchorRelative >= 0) {
layoutParams.addRule(alignRelative, anchorRelative);
}
layoutParams.leftMargin = AndroidUtilities.dp(leftMargin);
layoutParams.topMargin = AndroidUtilities.dp(topMargin);
layoutParams.rightMargin = AndroidUtilities.dp(rightMargin);
layoutParams.bottomMargin = AndroidUtilities.dp(bottomMargin);
return layoutParams;
}
public static RelativeLayout.LayoutParams createRelative(int width, int height, int leftMargin, int topMargin, int rightMargin, int bottomMargin) {
return createRelative(width, height, leftMargin, topMargin, rightMargin, bottomMargin, -1, -1, -1);
}
public static RelativeLayout.LayoutParams createRelative(int width, int height, int leftMargin, int topMargin, int rightMargin, int bottomMargin, int alignParent) {
return createRelative(width, height, leftMargin, topMargin, rightMargin, bottomMargin, alignParent, -1, -1);
}
public static RelativeLayout.LayoutParams createRelative(float width, float height, int leftMargin, int topMargin, int rightMargin, int bottomMargin, int alignRelative, int anchorRelative) {
return createRelative(width, height, leftMargin, topMargin, rightMargin, bottomMargin, -1, alignRelative, anchorRelative);
}
public static RelativeLayout.LayoutParams createRelative(int width, int height, int alignParent, int alignRelative, int anchorRelative) {
return createRelative(width, height, 0, 0, 0, 0, alignParent, alignRelative, anchorRelative);
}
public static RelativeLayout.LayoutParams createRelative(int width, int height) {
return createRelative(width, height, 0, 0, 0, 0, -1, -1, -1);
}
public static RelativeLayout.LayoutParams createRelative(int width, int height, int alignParent) {
return createRelative(width, height, 0, 0, 0, 0, alignParent, -1, -1);
}
public static RelativeLayout.LayoutParams createRelative(int width, int height, int alignRelative, int anchorRelative) {
return createRelative(width, height, 0, 0, 0, 0, -1, alignRelative, anchorRelative);
}
public static LinearLayout.LayoutParams createLinear(int width, int height, float weight, int gravity, int leftMargin, int topMargin, int rightMargin, int bottomMargin) {
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(getSize(width), getSize(height), weight);
layoutParams.setMargins(AndroidUtilities.dp(leftMargin), AndroidUtilities.dp(topMargin), AndroidUtilities.dp(rightMargin), AndroidUtilities.dp(bottomMargin));
layoutParams.gravity = gravity;
return layoutParams;
}
public static LinearLayout.LayoutParams createLinear(int width, int height, float weight, int leftMargin, int topMargin, int rightMargin, int bottomMargin) {
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(getSize(width), getSize(height), weight);
layoutParams.setMargins(AndroidUtilities.dp(leftMargin), AndroidUtilities.dp(topMargin), AndroidUtilities.dp(rightMargin), AndroidUtilities.dp(bottomMargin));
return layoutParams;
}
public static LinearLayout.LayoutParams createLinear(int width, int height, int gravity, int leftMargin, int topMargin, int rightMargin, int bottomMargin) {
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(getSize(width), getSize(height));
layoutParams.setMargins(AndroidUtilities.dp(leftMargin), AndroidUtilities.dp(topMargin), AndroidUtilities.dp(rightMargin), AndroidUtilities.dp(bottomMargin));
layoutParams.gravity = gravity;
return layoutParams;
}
public static LinearLayout.LayoutParams createLinear(int width, int height, float leftMargin, float topMargin, float rightMargin, float bottomMargin) {
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(getSize(width), getSize(height));
layoutParams.setMargins(AndroidUtilities.dp(leftMargin), AndroidUtilities.dp(topMargin), AndroidUtilities.dp(rightMargin), AndroidUtilities.dp(bottomMargin));
return layoutParams;
}
public static LinearLayout.LayoutParams createLinear(int width, int height, float weight, int gravity) {
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(getSize(width), getSize(height), weight);
layoutParams.gravity = gravity;
return layoutParams;
}
public static LinearLayout.LayoutParams createLinear(int width, int height, int gravity) {
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(getSize(width), getSize(height));
layoutParams.gravity = gravity;
return layoutParams;
}
public static LinearLayout.LayoutParams createLinear(int width, int height, float weight) {
return new LinearLayout.LayoutParams(getSize(width), getSize(height), weight);
}
public static LinearLayout.LayoutParams createLinear(int width, int height) {
return new LinearLayout.LayoutParams(getSize(width), getSize(height));
}
}
and you can use it like this:
frameLayout.addView(
emptyLayout,
LayoutHelper.createFrame(
LayoutHelper.MATCH_PARENT,
LayoutHelper.WRAP_CONTENT,
Gravity.CENTER
)
);
精彩评论