繁体   English   中英

Android以编程方式设置自定义视图的高度和宽度

[英]Android set height and width of Custom view programmatically

我创建了一个名为Graphview的自定义视图。 这是 GraphView 类的结构。

public class GraphView extends View {

    public GraphView(Context context, float[] values, String title, String[] horlabels, String[] verlabels, boolean type) {
        super(context);
                ........
   }

   ..................
   .................
}

我使用addview()在表格行中添加了视图。 它工作正常。 现在我想为GraphView设置高度和宽度。 怎么做?

您可以像这样设置高度和宽度:

myGraphView.setLayoutParams(new LayoutParams(width, height));

如果您知道视图的确切大小,只需使用setLayoutParams()

graphView.setLayoutParams(new LayoutParams(width, height));

或者在 Kotlin 中:

graphView.layoutParams = LayoutParams(width, height)

但是,如果您需要更灵活的方法,您可以重写onMeasure()以根据可用空间和布局约束( wrap_contentmatch_parent或固定大小)更精确地测量视图。 您可以在android 文档中找到有关onMeasure()的更多详细信息。

您可以像这样在相对布局中设置视图的高度和宽度

ViewGroup.LayoutParams params = view.getLayoutParams();
params.height = 130;
view.setLayoutParams(params);

在 Kotlin 上,您可以直接使用其虚拟属性设置任何视图的宽度和高度:

someView.layoutParams.width = 100
someView.layoutParams.height = 200

如果您使用的是 Kotlin,您还可以使用以下代码将给定的 lambda 应用于当前布局参数:

someView.updateLayoutParams {
    height = 200
}
spin12.setLayoutParams(new LinearLayout.LayoutParams(200, 120));

spin12是您的微调器, 200120是您的spinnerwidthheight

这是一个基于 Kotlin 的版本,假设父视图是LinearLayout的一个实例。

someView.layoutParams = LinearLayout.LayoutParams(100, 200)

这允许在一行中设置宽度和高度( 100200 )。

由@MorganWilde 添加到解决方案中。 如果要使用 WRAP_CONTENT/MATCH_PARENT,可以使用以下代码。

someView.layoutParams =
   LinearLayout.LayoutParams(
     ViewGroup.LayoutParams.MATCH_PARENT,
     ViewGroup.LayoutParams.WRAP_CONTENT)

典型的现实世界示例:

在一个片段中:

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));
    }
  1. 没用除非使用DIP转换
  2. 这通常发生在片段中,注意getActivity()
  3. 您通常会在线性布局或类似布局中添加一些
  4. 通常一维是“填充父级”
  5. 您必须使用“正确”的LayoutParams (即示例中的LinearLayout.LayoutParams

在这里,这个类会处理以编程方式处理视图所需的一切

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));
}

}

你可以这样使用它:

        frameLayout.addView(
        emptyLayout,
        LayoutHelper.createFrame(
            LayoutHelper.MATCH_PARENT,
            LayoutHelper.WRAP_CONTENT,
            Gravity.CENTER
        )
    );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM