LayoutParams setMargins 不适用于 API 23 及更低版本

LayoutParams setMargins not working on API 23 and lower

我正在尝试以编程方式添加视图并将其设置到屏幕上的特定位置。

添加视图:

View view = new View(this);

然后我要添加一个 GlobalLayoutListener

ViewTreeObserver observer = slidingTabLayout.getViewTreeObserver();

最后在 onGlobalLayout 中设置它的位置:

public void onGlobalLayout() {

       int width = Resources.getSystem().getDisplayMetrics().widthPixels;

       int viewWidth = (int) (width * 0.18);

       int viewHeight = (int) (viewWidth / 3);

       LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(viewWidth, viewHeight);

       layoutParams.setMargins((int) (0.81 * width), (int) (slidingTabLayout.getY() + slidingTabLayout.getHeight() - (height / 2)), 0, 0);

       view.setLayoutParams(layoutParams); 
}

我也试过使用ViewGroup.MarginLayoutParams

使用 API 24 及以上效果很好,但 API 23(及更低)忽略边距,视图位于屏幕的左上角。

如何解决此问题以支持所有 API 级别?

我遇到了类似的问题,并使用不同的方法解决了 API > 23 和 API <= 23。

所以对于 API <= 23 而不是使用边距,我使用了 setX(float x) 和 setY(float y)。

在你的情况下它会是这样的:

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
    layoutParams.setMargins((int) (0.81 * width), (int) (slidingTabLayout.getY() + slidingTabLayout.getHeight() - (viewHeight / 2)), 0, 0);
    view.setLayoutParams(layoutParams);
} else {
    view.setX((int) (0.81 * width));
    view.setY((int) (slidingTabLayout.getY() + slidingTabLayout.getHeight() - (viewHeight / 2)));
    view.setLayoutParams(layoutParams);
}