Android之根布局动态载入子布局时边距设置无效问题
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之根布局动态载入子布局时边距设置无效问题的更多相关文章
- Android(java)学习笔记83:各种边距设置
1. 各种边距设置: (1)android:layout_paddingLeft 内边距,对谁用,指的是谁的内部内容边距 (2)android:layout_marginLeft 外边距,对谁用,指的 ...
- Android(java)学习笔记141:各种边距设置
1. android:layout_paddingLeft 内边距,对谁用,指的是谁的内部内容边距 2. android:layout_marginLeft 外边距,对谁用,指的是谁距离外层容器的边距 ...
- android ListView子布局中按钮响应点击事件
只需要在子布局的根布局中添加以下属性即可: android:descendantFocusability="blocksDescendants"
- 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式
注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...
- android 解决ScrollView中的子布局不能够填充整个ScrollView的情况。
在开发中如果你的xml文件的跟布局是ScrollView,在ScrollView中无论你写什么样的布局,其默认情况下都是不能填充整个布局的.也就是说你的ScrollView中的子布局设置fill_pa ...
- 深入浅出Android动态载入jar包技术
在实际项目中.因为某些业务频繁变更而导致频繁升级client的弊病会造成较差的用户体验,而这也恰是Web App的优势,于是便衍生了一种思路.将核心的易于变更的业务封装在jar包里然后通过网络下载下来 ...
- 实现Android 动态载入APK(Fragment or Activity实现)
尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38565345 近期由于项目太大了.导致编译通只是(Android对一个应用中的方法个数貌似有 ...
- 手机端布局,rem布局动态获取根字体大小
手机端布局,rem布局动态获取根字体大小. 以下代码: //rem布局动态获取根字体大小 function remDynamicLayout(){ var $windowWidth = $(windo ...
- Android动态载入Dex机制解析
1.什么是类载入器? 类载入器(class loader)是 Java™中的一个非常重要的概念.类载入器负责载入 Java 类的字节代码到 Java 虚拟机中. Java 虚拟机使用 Java 类的方 ...
随机推荐
- 关于A中用到B, B中用到A的问题
//A.h #ifndef AH #define AH class B; class A { public: B* b; void setB(); ~A(); }; #endif //B.h #ifn ...
- Tsi721信号及处理(转)
reference: https://blog.csdn.net/shanghaiqianlun/article/details/50545581 1. PCIe信号 名称 类型 描述 PC ...
- mybatis学习(五)----实现关联表查询
一.一对一的表查询 查询班级表中班级号为1的对应的记录(包括教师的具体信息) 1.首先建立数据表 数据表class和techear,class表中只有一个外键techear_id,sql脚本如下: C ...
- mybatis学习(一)----入门
一.Mybatis介绍 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名 ...
- angular2架构详解
参考 http://codin.im/2016/09/18/angular2-architecture-intro/ http://www.tuicool.com/articles/EvEZjmZ ...
- 解析url中参数
兼容不带参数等情况 function getUrlParam(){ var params = {}; var search = location.search; search = /\?/.test( ...
- C# Sublime text3 环境配置(一)
下载地址:http://www.sublimetext.com/3 1.安装完之后,tools菜单下最下一个点一下,安装Package Control 插件2.Preferences菜单下,点Pack ...
- path-control demo js
THREE.Spline = function(a) { function b(a, b, c, d, e, f, g) { a = 0.5 * (c - a); d = 0.5 * (d - b); ...
- 深度强化学习介绍 【PPT】 Human-level control through deep reinforcement learning (DQN)
这个是平时在实验室讲reinforcement learning 的时候用到PPT, 交期末作业.汇报都是一直用的这个,觉得比较不错,保存一下,也为分享,最早该PPT源于师弟汇报所做.
- WordPress无插件实现SMTP给评论用户发送邮件提醒
wordpress中集成PHPMalier给评论用户发送邮件提醒 首先你得去下载PHPMalier. 注:PHPMailer需PHP的socket扩展支持.如果PHPMailer连接邮箱需要ssl加 ...