动态向LinearLayout添加RelativeLayout出现布局对齐异常问题
我看你遇到的问题是在DrawerLayout的contentPanel里动态添加RelativeLayout后,ProgressBar覆盖了Logo图片。这种情况大概率是因为动态添加的RelativeLayout没有正确获取到占满父容器的布局参数,导致内部的相对布局规则失效了。
先分析下原因:当你用LayoutInflater.from(this).inflate(R.layout.slider_layout, null)加载布局,或者你的view(也就是那个RelativeLayout)是通过无父容器的方式inflate出来的,这时候View的LayoutParams会是null。当你把它添加到contentPanel(LinearLayout)时,系统会默认给它设置wrap_content的宽高,这样RelativeLayout的大小就不是全屏,里面的Logo设置layout_centerHorizontal="true"和layout_centerVertical="true"就只是在RelativeLayout自身的范围内居中,而下面的LinearLayout因为layout_below="@+id/logo"的规则,在小范围的RelativeLayout里就很容易和Logo重叠。
给你两个可行的解决方案:
方案1:手动设置LayoutParams确保占满父容器
修改你的getRootView方法,在添加View之前给它设置LinearLayout的LayoutParams,强制宽高为match_parent:
protected View getRootView(View view) { // 加载DrawerLayout布局 DrawerLayout sliderLayout = (DrawerLayout) LayoutInflater.from(this) .inflate(R.layout.slider_layout, null); LinearLayout contentPanel = (LinearLayout) sliderLayout.findViewById(R.id.contentPanel); // 给要添加的RelativeLayout设置占满父容器的布局参数 LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT ); view.setLayoutParams(layoutParams); contentPanel.addView(view); return sliderLayout; }
方案2:Inflate时传入父容器(推荐)
如果你是通过inflate获取那个RelativeLayout的实例,建议在inflate时传入contentPanel作为父容器,并设置attachToRoot为false,这样LayoutInflater会自动给RelativeLayout生成合适的LayoutParams:
// 假设你是这样获取RelativeLayout实例的 View relativeLayoutView = LayoutInflater.from(this) .inflate(R.layout.your_relative_layout_xml, contentPanel, false); // 然后直接添加到contentPanel contentPanel.addView(relativeLayoutView);
这样RelativeLayout就能占满contentPanel的整个空间,内部的Logo居中、LinearLayout在Logo下方的规则就能正常生效,不会出现重叠的情况。
另外,你可以检查下RelativeLayout里的layout_below="@+id/logo"是否正确(你的代码里是对的),确保Logo的id没有重复或者拼写错误。
内容的提问来源于stack exchange,提问作者Sneha Bansal

