Android 布局详解

1.重用布局

当一个布局文件被多处使用时,最好<include>标签来重用布局。

例如:workspace_screen.xml的布局文件,在另一个布局文件中被重复使用三次,那么可使用如下的布局代码:

<LinearLayout

  androd:layout_width=”fill_parent”

  androd:layout_height=”fill_parent” >

  <!-- 引用三次workspace_screen -->

  <include android:id=”@+id/cell1 layout=”@layout/workspace_screen” />

  <include android:id=”@+id/cell2 layout=”@layout/workspace_screen” />

  <include android:id=”@+id/cell3 layout=”@layout/workspace_screen” />

</LinearLayout>

  上面的代码中的<include>标签还使用了一个android:id属性,实际上,该属性指定的是workspace_screen.xml布局文件中的根节点的android:id属性值。若原根节点已经设置了android:id属性值,那么<include>标签的android:id属性值将被覆盖workspace_screen.xml布局文件中的根节点的android:id属性值。<include>标签还可以覆盖被引用的布局文件根节点额所有与布局有关的属性(也就是以“android:layout_”开头的属性)。通过覆盖属性值,可以使被引用的布局文件中的视图拥有不同的布局风格。例如,下面的布局文件代码引用了image_holder.xml文件两次,但只有第一个<include>标签覆盖了一些属性:

<!-- 覆盖了根节点中的width和height -->

<include layout=”@layout/image_holder”

  android:layout_width=”fill_parent”

  android:layout_height=”fill_parent” />
<!-- 下面的没有覆盖任何属性 -->

<include layout=”@layout/image_holder” />

注意:如果像覆盖布局的尺寸,必须同时覆盖android:layout_width和android:layout_height。不能只覆盖其中一个属性,否则对这两个属性值的覆盖都无效。

<include>标签在设计与设备相关的布局文件时非常重要,例如,将手机横屏(landscape)和竖屏(portrait)时可以使用不同的布局文件,但有可能横多视图的布局是相同的。这样就可以在res/layout目录中放置横屏和竖屏都需要用到的布局,而在res/layout-land和res/layout-port目录中的布局文件可以使用<include>标签引用这些布局。

2.布局别名

  在res目录下的所有子目录都是资源目录,例如res/values、res/layout等。这些木中存储的都是默认的资源。但在满足某些情况下系统需要使用另外的资源,例如,支持国际化的程序如果当前环境是中文,就要求所有字符串资源从res/values-zh目录中去读,若环境是英文的,则要去res/valuse-en中去读。其中res/values-zh、res/valuse-en就是本地化资源目录。所谓本地化目录就是满足特定要求的资源文件存放的目录,例如,屏幕的尺寸、不同的android版本、不同的语言环境、不同的屏幕方向等等。若果系统方向没有满足当前特定要求的本地化资源目录,就会从默认的资源目录中去寻找资源。例如,现在本地资源目录只有res/values-zh和res/values-en,而当前语言环境为法语,但没有res/values-fr目录,所有系统会到默认的资源目录中寻找资源目录(res/values)寻找相应的字符串资源。

所谓布局别名就是为不同的布局文件指定同一个资源ID,以便在不同的环境下系统可以使用同一个布局资源ID访问不同的布局资源。使用布局别名必须注意布局文件的引用只能放在本地化资源目录中,而不能放到默认的资源目录   (res/values)中。例如:

假如在res/layout目录中有两个布局文件:main_layout.xml和main_layout_en.xml,并且在主窗口中使用setContentView(R.layout.main_layout)将main_layout.xml与当前窗口关联。现在建立一个res/values-en目录,然后在该目录下建立一个refs.xml文件(资源文件名可以任意命名),最后在refs.xml文件中输入如下内容:

<resources>

  <!-- 为main_layout_en.xml文件指定一个名为main_layout的别名 -->

  <item name=”main_layout” type=”layout”>@layout/main_layout_en</item>

</resources>

  如果当前环境正好是英文,系统就会使用res/values目录中的资源,所以会为main_layout_en.xml文件指定一个别名。如果别名正好与某一个布局文件的资源ID相同,那么就相当于修改该资源ID的指针,也就是说如果在英文环境下,R.layout.main_layout引用的不再是main_layout.xml,而是main_layout_en.xml。

  一般如果目录中的文件太乱,需要整理一般有两种处理方式:

  ① 建立若干个子目录,然后分门别类地将目录的文件放到这些刚建立的目录中。

  ② 不移动元目录中的文件,而是为每一个文件建立一个索引(可以将这些索引数据存储在数据库或其他文件中),然后对这些索引进行分组管理。这么做的好处是并不需要移动文件,而且同一个文件还可以属于不同的类别。如果采用第一种方式,就需要将文件所属的每个类别对应的目录都复制一份,浪费空间。

3.动态装载布局

  例如,主布局文件(activity_load_layout.xml)只包含一个 <LinearLayout>标签,并未包含任何子标签(item.xml),因为所有视图都是动态加载的。

  如果需要动态装载、添加视图,桐城在主窗口类(LoadLayoutActivity)中调用LayoutInflatable.inflate方法创建一个新的视图,inflate方法的原型如下:

  public View inflate(int resource, ViewGroup root);

  resource:表示要装载的视图ID;root:表示要装载的视图的父视图。如果没有父视图,则为null。

4.动态设置布局属性

  动态添加视图时是不会采用静态方法设置布局,而要想重新设置布局属性,就需要使用LayoutParams类。但要注意,由于主窗口布局使用的是LinearLayout布局,所以要使用android.widget.LinearLayout.LayoutParams类。修改后的LoadLayoutActivity类的代码如下:

public class LoadLayoutActivity extends Activity {

  @Override  // 设置所有控件居中显示

  protected void i=onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    LinearLayout parent = (LinearLayout )  getLayoutInflater().inflate(R.layout.sctivity_load_layout, null);

    for(int i=0; i<10; i++) {

      View view = getLayoutInflater().inflate(R.layout.activity_load_layout,  null);

      TestView textView = (TestView) view.findViewById(R.id.textview);

      text.setText(“text”+i);

      // 创建LayoutParams对象

      android.widget.LinearLayout.LayoutParams layoutParams = new  LinearLayout.LayoutParams(LayoutPatams.WRAP_CONTENT,  LayoutParams.WRAP_CONTENT);

      // 设置gravity字段的值(水平居中)

      layoutParams.gravity = Gravity.CENTER_HORIZONTAL;

      // 动态添加视图是指定父视图(LinearLayout)的布局参数

      parent.addView(view, layoutParams);

    }

    setContentView(parent);

  }

}

5.从右向左布局(RTL Layout)

  从Android4.2开始,Android SDK支持从右向左UI布局的方式。

Android 布局详解的更多相关文章

  1. Android布局详解之一:FrameLayout

      原创文章,如有转载,请注明出处:http://blog.csdn.net/yihui823/article/details/6702273 FrameLayout是最简单的布局了.所有放在布局里的 ...

  2. android布局详解

      http://blog.163.com/zhangzheming_282/blog/static/117920962013072502787/   AbsoluteLayout——绝对布局   必 ...

  3. Android(java)学习笔记93:Android布局详解之一:FrameLayout

    FrameLayout是最简单的布局了.所有放在布局里的控件,都按照层次堆叠在屏幕的左上角.后加进来的控件覆盖前面的控件. 在FrameLayout布局里,定义任何空间的位置相关的属性都毫无意义.控件 ...

  4. Android 布局详解 -三表格布局(TableLayout)以及重要属性

              TableLayout跟TableRow 是一组搭配应用的布局,TableLayout置底,TableRow在TableLayout的上方,而Button.TextView等控件就 ...

  5. Android(java)学习笔记32:Android布局详解之一:FrameLayout

    1. FrameLayout是最简单的布局了.所有放在布局里的控件,都按照层次堆叠在屏幕的左上角.后加进来的控件覆盖前面的控件. 在FrameLayout布局里,定义任何空间的位置相关的属性都毫无意义 ...

  6. Android开发重点难点1:RelativeLayout(相对布局)详解

    前言 啦啦啦~博主又推出了一个新的系列啦~ 之前的Android开发系列主要以完成实验的过程为主,经常会综合许多知识来写,所以难免会有知识点的交杂,给人一种混乱的感觉. 所以博主推出“重点难点”系列, ...

  7. Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)

    [Android布局学习系列]   1.Android 布局学习之——Layout(布局)详解一   2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)   3.And ...

  8. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  9. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

随机推荐

  1. windows下使用pthread

    有的时候需要使用多线程来测试代码啥的,在Linux下有pthread,在windows也有. 我这儿是使用MingW作为编译工具,具体如何下载MingW自行在网上搜索. 而pthread是在这里下载的 ...

  2. 输入 URL 到页面完成加载过程中的所有发生的事情?

    转到浏览器中输入URL给你一个页面后,.有些事情,你每天都在使用,学的是计算机网络知道是怎么回事.DNS解析然后页面的回馈,只是要讲好还是有难度. 之前fex团队的nwind专门写过这个问题的博客: ...

  3. 远程控制编写之屏幕传输 MFC实现 屏幕截图 发送bmp数据 显示bmp图像

    远程控制编写之屏幕传输  MFC实现  屏幕截图 发送bmp数据 显示bmp图像: 一 : 首先要了解bmp图像的结构 详情请看我转载的一篇文章http://blog.csdn.net/hnust_x ...

  4. ubuntu下的apache的虚拟主机的配置

    ubuntu下的虚拟主机的配置相对window下的虚拟主机配置有些许不同. 对于要新建的虚拟主机,我们可以有如下几个步骤: 1.在/etc/apache2/sites-available/目录下新建一 ...

  5. Servlet配置load-on-startup

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:// ...

  6. 强大的jquery-制作选项卡

    最近在学习jquery,特地把今天写的一个选项卡源码贴出来.只是做只是梳理,大神们请不要吐槽,如果有更好的方法,欢迎指点.谢谢. css <style> #tab div{ width:2 ...

  7. 简单分析android textview xml 的属性设置

    android:ems 设置TextView的宽度为N个字符的宽度. 这样的好处就是,在定义编辑框空间输入多少字符的时候,可以根据固定的值设置编辑框宽度.保证边框和文字的宽度统一.android:ma ...

  8. 【转】Android 网络通信框架Volley简介(Google IO 2013)

    Volley主页 https://android.googlesource.com/platform/frameworks/volley http://www.youtube.com/watch?v= ...

  9. SpringMVC中Controller

    详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析] 目录 前言 现象 源码分析 HandlerMethodArgumentResolver与HandlerMethodR ...

  10. JS逗号、冒号与括号

    JavaScript面试时候的坑洼沟洄——逗号.冒号与括号   看完了javaScript数据类型和表达式与运算符相关知识后以为可以对JavaScript笔试题牛刀小试一把了,没想到有一次次的死在逗号 ...