关于Android设置控件margin无效的解决办法

一、需求

右上角跳过按钮距离状态栏50px以及距离右边50px,相对位置如图。

二、获取状态栏高度

图片中黑色部分需要顶上状态栏,那么设置Button的margin值时,就应该把状态栏的高度考虑进去,这简单

int resourceId = context.getResources().getIdentifier("status_bar_height",
                                                        "dimen", 
                                                        "android");
int statusBarHeight = context.getResources().getDimensionPixelSize(resourceId);

三、设置margin值

//设置按钮偏移位置(相对于状态栏的top)
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)mBtnSkip.getLayoutParams();
        params.setMargins(0,
                        statusBarHeight + 50,
                        50,
                        0);
        mBtnSkip.setLayoutParams(params);

这样就可以实现了在不同的手机,该跳过按钮,都距离顶部和右边都有50px的间距

四、可能会出现的问题

1.java.lang.ClassCastException

如果是LayoutParams的类转型错误,那么请检查

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)mBtnSkip.getLayoutParams();

这里涉及到LayoutParams的知识。

LayoutParams are used by views to tell their parents how they want to be laid out

LayoutParams中存储的值也就是该控件告诉Layout的参数,一旦LayoutParams类型错误,自然转型就会出现问题。这时候查看Java代码中的LayoutsParams和XML布局中的类型是否一致即可解决。

2.Java代码中设置Margin参数无效

当你看到呈现出来的效果和XML布局中的参数一致的时候,这时候你应该要知道,可能是XML中的参数和Java代码中设置的参数产生了覆盖。

  • 当Java代码与XML布局中同时设置Margin的值时,XML布局的值会覆盖Java代码中设置的值。

    其实,这幅图片呈现的效果只是在XML布局中声明的marginTop:50px;marginRight:50px;因为这是相对于状态栏顶部的,所以此处不符合需求。
  • 当Java代码或XML布局中只存在一个对Margin的值进行定义的时候,会随定义的内容生效

你可能感兴趣的:(Android)