Android大部分的控件都会有padding和layout_margin两个属性,一般来说它们的差别是:

padding控件中的内容离控件边缘的距离。

margin:  控件离它的父控件边缘的距离。

今天做了一个由根布局动态载入子布局的实验,结果发现子布局中的这两个属性能够按预期的效果显示,可是给根布局设置的padding并没有对被载入的子布局产生效果。

代码例如以下:

根布局文件名称为activity_main.xml,其xml文件定义的内容为:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="8dp" <!-- 这个布局里控件都距离它的边缘8dp -->
tools:context=".MainActivity" > </LinearLayout>

上面这个根布局会加入子布局table_layout.xml中定义的布局,这个xml文件的定义内容是:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/tableLayout_tableName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp" <!-- 这个控件离table_layout这个布局的边缘为10dp -->
android:textSize="30sp" />
</LinearLayout>

源代码中实现动态载入的代码段:

// 创建用于承载表的布局
LinearLayout subLayout = (LinearLayout) this.getLayoutInflater().inflate(R.layout.table_layout, null);
// 填充表名
tableNameTextView = ((TextView) subLayout.findViewById(R.id.tableLayout_tableName));
tableNameTextView.setText("tablename"); this.addContentView(subLayout, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

可是上面这段代码运行后。table_layout布局里面的边距设置会正常显示。可是activity_main布局中table_layout的边缘却紧紧挨着activity_main的边缘,说明activity_main的padding并没有其效果。

这个问题我纠结了将近3个消失。最终设置了根局部和子布局的margin和padding也不行,分别设置top、right、bottom、left也不行,最终的解决的方法却让我感到很匪夷所思:

仅仅须要在根布局中再加一个布局,把这个布局当做根布局来动态载入子布局就好了。

不知道为什么类型全然同样的根布局就会出错。或许'根'布局有某些特别的限制吧。

改动之后的代码是:

activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<!-- 仅仅要这么再加一个布局来取代跟布局就OK了。。 。 -->
<LinearLayout
android:id="@+id/mainLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="8dp"
android:paddingLeft="8dp"
android:paddingRight="8dp" >
</LinearLayout>
</LinearLayout>

源代码:

LinearLayout subLayout = (LinearLayout) this.getLayoutInflater().inflate(R.layout.table_layout, null);
// 填充表名
tableNameTextView = ((TextView) subLayout.findViewById(R.id.tableLayout_tableName));
tableNameTextView.setText("tablename"); LinearLayout mainLayout = (LinearLayout) findViewById(R.id.mainLayout); //通过这个新加的"根布局"来载入子布局
mainLayout.addView(subLayout);

假设转载请注明出处:http://blog.csdn.net/gophers?viewmode=contents

Android之根布局动态载入子布局时边距设置无效问题的更多相关文章

  1. Android(java)学习笔记83:各种边距设置

    1. 各种边距设置: (1)android:layout_paddingLeft 内边距,对谁用,指的是谁的内部内容边距 (2)android:layout_marginLeft 外边距,对谁用,指的 ...

  2. Android(java)学习笔记141:各种边距设置

    1. android:layout_paddingLeft 内边距,对谁用,指的是谁的内部内容边距 2. android:layout_marginLeft 外边距,对谁用,指的是谁距离外层容器的边距 ...

  3. android ListView子布局中按钮响应点击事件

    只需要在子布局的根布局中添加以下属性即可: android:descendantFocusability="blocksDescendants"

  4. 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式

    注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...

  5. android 解决ScrollView中的子布局不能够填充整个ScrollView的情况。

    在开发中如果你的xml文件的跟布局是ScrollView,在ScrollView中无论你写什么样的布局,其默认情况下都是不能填充整个布局的.也就是说你的ScrollView中的子布局设置fill_pa ...

  6. 深入浅出Android动态载入jar包技术

    在实际项目中.因为某些业务频繁变更而导致频繁升级client的弊病会造成较差的用户体验,而这也恰是Web App的优势,于是便衍生了一种思路.将核心的易于变更的业务封装在jar包里然后通过网络下载下来 ...

  7. 实现Android 动态载入APK(Fragment or Activity实现)

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38565345 近期由于项目太大了.导致编译通只是(Android对一个应用中的方法个数貌似有 ...

  8. 手机端布局,rem布局动态获取根字体大小

    手机端布局,rem布局动态获取根字体大小. 以下代码: //rem布局动态获取根字体大小 function remDynamicLayout(){ var $windowWidth = $(windo ...

  9. Android动态载入Dex机制解析

    1.什么是类载入器? 类载入器(class loader)是 Java™中的一个非常重要的概念.类载入器负责载入 Java 类的字节代码到 Java 虚拟机中. Java 虚拟机使用 Java 类的方 ...

随机推荐

  1. Centos7下mysql5.7.22主从配置

    一:服务器配置 1.1修改root密码: ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxxx'; 1.2添加远程登陆用户: GRANT ALL PRIV ...

  2. IDEA中maven的依赖jar包报红

    问题描述: 查看本地的repository中有相关的jar包,但是在IDEA中就是报红(下面红色波浪线) 解决方法: 将pom.xml中相关的dependcy配置注释掉,maven中jar包就会删除. ...

  3. Problem A 还会用继承吗?

    定义一个Base类,包括1个int类型的属性,以及满足输出格式要求的构造函数.拷贝构造函数和析构函数. 定义Base类的子类Derived,包括1个int类型的属性, 以及满足输出格式要求的构造函数. ...

  4. 2019-02-25 EST 科技文翻译

    The Definition of Theme and Rheme The point of departure is equally presented to the speaker and to ...

  5. PODOFO编译

    由于LibHaru库只能创建PDF,所以只能换了. PODOFO项目的依赖项目有: FreeType2: https://sourceforge.net/projects/freetype/files ...

  6. suse 12 sp1 系统添加zabbix agent监控

    因为之前走入一个误区,认为linux系统的zabbix安装包都是一样的,其实不同的linux的系统对应的版本是不一样的. suse系统版本(不同版本之间也是有区别的):SUSE Linux  12 S ...

  7. Python 黏包及黏包解决方案

    粘包现象 说粘包之前,我们先说两个内容,1.缓冲区.2.windows下cmd窗口调用系统指令 1 缓冲区(下面粘包现象的图里面还有关于缓冲区的解释) 每个 socket 被创建后,都会分配两个缓冲区 ...

  8. 获取页面元素的css属性

    function getStyle(obj, name){    if(obj.currentStyle)    {         return obj.currentStyle[name];//兼 ...

  9. robotframework·WEB端基础

    date:2018526 day10 一.导入库 导入的库分两种,一种是导入常用库,如String.Collections等(Library String.Collections,再运用库中的关键字) ...

  10. Spring+Tomcat的JNDI数据源连接池简单配置

    使用Tomcat JNDI数据源与Spring一起使用步骤如下: 1.将数据库驱动复制到Tomcat的lib文件夹下面 2.配置Tomcat的server.xml配置文件,在GlobalNamingR ...