`

Android学习06-----布局管理器

阅读更多

为了更好的管理Android应用的用户界面里的个组件,Android提供了布局管理器,通过布局管理器,Android应用的图形用户界面具有良好的平台无关性。这里什么叫平台的无关性呢?就是说不同手机。我们知道不同手机它们的屏幕的分辨率、尺寸并不完全相同,而Android的布局管理器可以根据运行平台来调整组件的大小,而我们所需要做的就是选择合适的布局管理器。

与Swing编程不同的是,Android的布局管理器本身就是一个UI组件,所有的布局管理器都是ViewGroup的子类:

 

 

 

我们从上图也可以发现,所有布局都可作为容器类使用,因此可以调用多个重载的addView() 向布局管理器中添加组件,当然我们也可以用一个布局管理器嵌套其他布局管理器。

 

一、线性布局

       线性布局是由LinearLayout 类来代表的,线性布局有点像AWT 编程里的FlowLayout ,它们都会将容器里的组件一个挨着一个排列起来,LinearLayout 不仅可以控制各组件横向排列,也可以控制纵向排列(android:orientation="vertical" 控制);

       线性布局与AWTFlowLayout 的组大区别在于:Android 的线性布局不会换行,当组件一个挨着一个排到头了,剩下的组件将不会被显示出来。在AwtFlowLayout 则会另起一行排列多出来的组件。

LinearLayout 的常用XML 属性及相关方法

XML 属性

相关方法

说明

Android:gravity

setGravity(int)

设置布局管理器内组件对齐方式,该属性支持topbuttomleftcenter_vertical 、等等,可以同时指定多种对齐方式,多个属性值用竖线隔开,竖线前后不能有空格

android:orientation

setOrientation(int)

设置布局管理器内组件的排列方式,vertical: 垂直,默认horizontal: 水平

 

通过Activity代码的形式完成布局,此时就不需要xml配置文件了

package com.iflytek.activity;

import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

public class LayoutProjectActivity extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// setContentView(R.layout.main);
		// setContentView(R.layout.linearlayout);

		LinearLayout linearLayout = new LinearLayout(this);
		LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
				ViewGroup.LayoutParams.FILL_PARENT,
				ViewGroup.LayoutParams.FILL_PARENT);
		linearLayout.setOrientation(LinearLayout.VERTICAL);
		LinearLayout.LayoutParams txtParams = new LinearLayout.LayoutParams(
				ViewGroup.LayoutParams.FILL_PARENT,
				ViewGroup.LayoutParams.WRAP_CONTENT);
		TextView textView = new TextView(this);
		textView.setLayoutParams(txtParams);
		textView.setText("xdwang");
		textView.setTextSize(20);
		linearLayout.addView(textView);
		super.setContentView(linearLayout, layoutParams);

	}
}
 

 

二、表格布局

       表格布局由TableLayout 所代表,表格布局采用行列的形式管理UI 组件,TableLayout 并不需要明确的声明包含多少行、多少列,而是通过添加TableRow 、其他组件来控制表格的行数和列数。

       每次向TableLayout 中添加一个TableRow ,该TableRow 就是一个表格行,TableRow 也是容器,因此它也可以不断地添加其他组件,每添加一个子组件该表格就增加一列。

如果直接向TableLayout 中添加组件,那么这个组件将直接占用一行。

在表格布局中,列的宽度由该列中最宽的那个单元格决定,整个表格布局的宽度则取决与父容器的宽度(默认总是占满父容器本身)

       在表格布局管理器中,可以为单元格设置如下三种行为方式:

              Shrinkable :如果某个列被设为Shrinkable ,那么该列的所有单元格的宽度可以被收缩,以保证表格能适应父容器的宽度。

              Stretchable :如果某个列被设为Stretchable ,那么该列的所有单元格的宽度可以被拉伸,以保证组件能完全填满表格空余空间。

              Collapsed :如果某个列被设为Collapsed ,那么该列的所有单元格会被隐藏;

    TableLayout 继承了LinearLaout ,因此它完全可以支持LinearLayout 所支持的全部XML 属性,除此之外,TableLayout 还支持如下表所示的XML 属性。

Tab1eLayout 的常用XML 属性及相关方法:

XML 属性

相关方法

说明

android:collapseColumns

setColumnCollapsed(int,boolean)

设置需要被隐藏的列的列序号,多个列序号之间用逗号隔开

android:shrinkColumns

setShrinkAllColumns(boolean)

设置允许被收缩的列的列序号,多个列序号之间用逗号隔开

android:stretchColumns

setStretchAllColumns(boolean)

设置允许被拉伸的列的列序号,多个列序号之间用逗号隔开

 

tablelayout.xml(布局排列):

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TableRow >
	    <EditText
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:text="请输入内容" />
	    
	    <Button
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:text="查询" />
    
    </TableRow>
   
    <View 
        android:layout_height="2px"
        android:background="#ccc"/>
    <!-- 分割线 -->
    
    <TableRow >
	    <TextView
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:textSize="20px"
	        android:text="请选择语言" />
	    
	    <RadioGroup
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:checkedButton="@+id/rb1"
	        android:orientation="vertical">
	        <RadioButton 
	            android:id="@+id/rb1"
	            android:text="java"/>
	        <RadioButton 
	            android:id="@+id/rb2"
	            android:text="C#"/>
	    </RadioGroup>
    
    </TableRow>
    
</TableLayout>
 

Tablelayout2.xml(数据显示):

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:shrinkColumns="2" 
    android:collapseColumns="0,1"
    android:background="@drawable/james">
	<!--android:shrinkColumns="2",表示第3列为伸缩列 (因为下面的邮箱太长了,会将地址撑开,看不见的)-->
    <!--android:collapseColumns="0,1"设置不显示列,如果有更多的列,则使用,分割 -->
    
    <TableRow >
	    <TextView
	        android:layout_column="0"
	        android:gravity="center_horizontal"
			android:padding="8px"	        
	        android:text="ID" />
	    <!-- android:layout_column,这个没有提示,规定出了表格的列的编号 -->
	    <!-- android:gravity="center_horizontal"表示居中显示 -->
	    
	    <TextView
	        android:layout_column="1"
	        android:gravity="center_horizontal"
			android:padding="8px"	        
	        android:text="姓名" />
	    
	    <TextView
	        android:layout_column="2"
	        android:gravity="center_horizontal"
			android:padding="8px"	        
	        android:text="邮箱" />  
	        
	    <TextView
	        android:layout_column="3"
	        android:gravity="center_horizontal"
			android:padding="8px"	        
	        android:text="地址" />
    
    </TableRow>
   
    <View 
        android:layout_height="2px"
        android:background="#ccc"/>
    <!-- 分割线 -->
    
    <TableRow >
	    <TextView
	        android:layout_column="0"
	        android:gravity="center_horizontal"
			android:padding="8px"	        
	        android:text="xdwang" />
	    
	    <TextView
	        android:layout_column="1"
	        android:gravity="center_horizontal"
			android:padding="8px"	        
	        android:text="王旭东" />
	    
	    <TextView
	        android:layout_column="2"
	        android:gravity="center_horizontal"
			android:padding="8px"	        
	        android:text="xdwangiflytek@gmail.com" />  
	        
	    <TextView
	        android:layout_column="3"
	        android:gravity="center_horizontal"
			android:padding="8px"	        
	        android:text="安徽合肥" />
    
    </TableRow>
    
</TableLayout>
 

Activity动态生成

package com.iflytek.activity;

import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

public class LayoutProjectActivity extends Activity {

	private String titleData[][] = new String[][] { { "ID", "姓名", "邮箱", "地址" },
			{ "xdwang", "王旭东", "xdwangiflytek@gmail.com", "安徽合肥" },
			{ "xdwang2", "王旭东2", "xdwangiflytek2@gmail.com", "安徽合肥" } };

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
				
		TableLayout tableLayout = new TableLayout(this);
		TableLayout.LayoutParams tableParams= new TableLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
		
		tableLayout.setBackgroundResource(R.drawable.james);
		
		//设置表格行
		for (int i = 0; i < this.titleData.length; i++) {
			TableRow tableRow = new TableRow(this);
			for (int j = 0; j <this.titleData[i].length; j++) {
				 TextView textView = new TextView(this);
				 textView.setText(this.titleData[i][j]);
				 tableRow.addView(textView, j);//加入一个编号
			}
			tableLayout.addView(tableRow);//向表格中增加若干表格行
		}
        super.setContentView(tableLayout, tableParams); 		

	}
}

 

 通过程序代码实现的表格布局本身比较麻烦的,一般更多的情况下是使用配置文件的形式完成。

 

 

 

三、帧布局 (框架布局)

帧布局由FrameLayout 所代表,FrameLayout 直接继承了ViewCroup 组件。

帧布局容器为每个加入其中的组件创建一个空白的区域〔称为一帧) ,所有每个子组件占据一帧,这些帧都会根据gravity 属性执行自动对齐。也就是说,帧布局的效果有点类似于AWT 编程的CardLayout ,都是把组件一个一个地叠加在一起。与CardLayout 的区别在于,CardLayout 可以将下面的Card 移上来,但FrameLayout 则没有提供相应的方法.

FrameLayout 的常用XML 属性及相关方法

XML 属性

相关方法

说明

android:foreground

setForeground(Drawable)

设置该帧布局容器的前景图像

android:foregroundGravity

setForegroundGravity(int)

定义绘制前景图像的gravity 属性

android:measureAllChildren

setMeasureAllChildren(boolean)

Determines whether to measure all children or just those in the VISIBLE or INVISIBLE state when measuring.

 

Activity动态添加帧框架布局

package com.iflytek.activity;

import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageView;

public class LayoutProjectActivity extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		FrameLayout frameLayout = new FrameLayout(this);
		FrameLayout.LayoutParams frameParams = new FrameLayout.LayoutParams(
				ViewGroup.LayoutParams.FILL_PARENT,
				ViewGroup.LayoutParams.FILL_PARENT);
		FrameLayout.LayoutParams viewParams = new FrameLayout.LayoutParams(
				ViewGroup.LayoutParams.WRAP_CONTENT,
				ViewGroup.LayoutParams.WRAP_CONTENT);

		ImageView imageView = new ImageView(this);
		imageView.setImageResource(R.drawable.james);
		EditText editText = new EditText(this);
		editText.setText("这里是内容");
		Button button = new Button(this);
		button.setText("按钮");
		frameLayout.addView(imageView, viewParams);
		frameLayout.addView(editText, viewParams);
		frameLayout.addView(button, viewParams);
		super.setContentView(frameLayout, frameParams);

	}
}
 

 

四、相对布局

相对布局由 RelativeLayout 代表,相对布局容器内子组件的位置总是相对兄弟组件、父容器来决定的,因此这种布局方式被称为相对布局。

    如果A 组件的位置是由B 组件的位置来决定的,Android 要求先定义B 组件,再定义A 组件。

RelativeLayout 的常用XML 属性及相关方法

XML 属性

相关方法

说明

android:gravity

setGravity(int)

设置该布局弃器内部各子组件的对齐方式

android:ignoreGravity

setIgnoreGravity(int)

设置哪个组件不受gravity 组件的影响

为了控制该布局容器中各子组件的布局分布,RelativeLayout 提供了一个内部类:

RelativeLayout.LayoutParams, 该类提供了大量的XML 属性来控制RelativeLayout 布局容器中子组件的布局分布。

 

relativelayout.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/rlId"   
   android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/iv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/james"/>
    <!-- 以组件id确定参考位置 -->
    
     <ImageView
        android:id="@+id/iv2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher"
        android:layout_toRightOf="@id/iv1"/>
     <!-- 放在第一张图片的右边 -->
     
     <TextView
        android:id="@+id/tv1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/iv2"
        android:layout_toRightOf="@id/iv1"
        android:text="@string/hello" />
     

</RelativeLayout>
 

Activity动态生成:

package com.iflytek.activity;

import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.RelativeLayout;

public class LayoutProjectActivity extends Activity {

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.relativelayout);// 要读取已经存在的布局管理器

		RelativeLayout relativeLayout = (RelativeLayout) super
				.findViewById(R.id.rlId);
		RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams(
				ViewGroup.LayoutParams.FILL_PARENT,
				ViewGroup.LayoutParams.FILL_PARENT);
		relativeParams.addRule(RelativeLayout.LEFT_OF, R.id.tv1);
		relativeParams.addRule(RelativeLayout.BELOW, R.id.iv1);
		EditText editText = new EditText(this);
		relativeLayout.addView(editText, relativeParams);

	}
}
 

 

 

五、绝对布局

       绝对布局由AbsoluteLayout 代表。是Android2.3.3版本之前的布局管理器,已废弃了。绝对布局就像Java AWT 编程中的空布局,就是Android 不提供任何布局控制,而是由开发人员自己通过X 坐标、Y 坐标来控制组件的位置。当使用AbsoluteLayout 作为布局容器时,布局容器不再管理子组件的位置、大小—这些都需要开发人员自己控制。

使用绝对布局时,每个子组件都可指定如下两个XML 属性。

              layout_x :指定该子组件的X 坐标。

              layout_y :指定该子组件的Y 坐标  

 

 

布局管理器的嵌套

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <!-- 首先外面定义一个总的布局管理器,一般来说用的最多的还是线性和表格两种布局 -->

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="查询" />
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
    	android:orientation="horizontal" >
    	<!-- 注意这里的高度不能再全部铺满了,否则下面的布局都没空间了 -->
        <ImageView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/james"/>
        
         <ImageView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_launcher"/>
        
    </LinearLayout>
    
    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
    	android:orientation="horizontal">
        
        <TableRow>
        
	        <EditText
		        android:layout_width="wrap_content"
		        android:layout_height="wrap_content"
		        android:text="这是什么呢" />
	        
	        <Button
		        android:layout_width="wrap_content"
		        android:layout_height="wrap_content"
		        android:text="这是什么呢" />
        
        </TableRow>
    </TableLayout>

</LinearLayout>

 

 

 

 

 

 

 

  • 大小: 9.2 KB
0
0
分享到:
评论

相关推荐

    android-studio-ide-193.6626763-windows.exe

    此外,新的布局检查器可以实时预览和调试布局,减少了错误的可能性。 此外,Android Studio 4.0对Kotlin的支持进一步加强。Kotlin已成为Android开发的首选语言,4.0版本提供了更完善的Kotlin编码助手,包括智能提示...

    android-studio-2021.3.1.17-windows.exe

    5. **布局编辑器改进**:可能增强了设计视图和预览功能,使开发者能更直观地看到界面效果。 6. **性能优化**:对内存管理和启动速度进行优化,提高开发效率。 7. **新功能引入**:可能引入了新的开发或调试工具,...

    android-studio-ide-202.7486908-linux.tar.gz

    3. **布局编辑器增强**:此版本的布局编辑器提供了更直观的设计视图,支持拖放组件,实时预览,以及对 ConstraintLayout 和其他布局的深度优化。 4. **性能提升**:通过优化内存管理和编译速度,Android Studio ...

    android-studio-ide-181.5014246-windows

    4. **设计视图与布局编辑器**:Android Studio提供了可视化的布局编辑器,使得UI设计直观易行,同时支持拖放组件和预览功能,方便开发者在多个屏幕尺寸上进行界面设计。 5. **Android虚拟设备(AVD)管理器**:AVD...

    android-support-v7-appcompat.jar android-support-v4.jar

    Fragment是Android开发中的重要模块,它允许在单个活动中管理多个独立的UI片段。Loader则帮助处理数据加载,尤其是在配置更改时保持数据状态。ViewModel则是Android Architecture Components的一部分,用于保存数据...

    android-studio-ide-202.7486908-windows.exe

    2. **新功能集成**:引入了新的布局编辑器,使得界面设计更为直观,支持实时预览和拖放功能,帮助开发者更快速地构建用户界面。此外,还加入了对Kotlin编程语言的深度支持,包括智能代码提示和优化的代码重构工具。 ...

    Android-nRF-Toolbox-master 源码

    总结,Android-nRF-Toolbox-master是基于Android平台的nRF设备管理工具,其源码揭示了如何利用BLE进行通信以及如何进行安全的固件更新。对于希望开发类似应用或研究nRF设备的开发者来说,这个开源项目是一个宝贵的...

    android-studio-ide-181.5014246-windows.exe

    其次,Android Studio的用户界面设计工具(布局编辑器)让开发者能够直观地设计和预览应用界面。对于新手而言,拖放式组件设计大大降低了学习曲线。此外,此版本增强了对Material Design组件的支持,使开发者能够...

    android-collapse-calendar-view-Android.zip

    实现这样的视图需要对日期计算和布局管理有深入理解,例如使用`GridView`或自定义`LinearLayout`。同时,为了确保性能,可能需要运用数据绑定和视图复用来优化显示大量的视图元素。 周视图则更注重展示一周内的每一...

    android-percent-support-extend源码

    `android.support.percent` 提供了百分比布局管理器,如`PercentRelativeLayout`和`PercentFrameLayout`,它们允许子视图的大小以父视图的百分比来定义。而`android.support.design`库则包含了Material Design的相关...

    Android课程设计--便捷备忘录

    总的来说,"Android课程设计--便捷备忘录"是一个实践性强、涵盖Android基础功能的项目,对于学习Android开发的新手来说,这是一个很好的起点。通过这个项目,你可以深入理解Android组件的使用、SQLite数据库的操作、...

    Android-Universal-Image-Loader Demo

    **Android-Universal-Image-Loader (UIL) 是一个强大的图片加载、缓存和显示库,专为Android平台设计。这个库被广泛使用,因为它能够高效地处理图片资源,避免内存溢出,同时支持多种加载策略和显示选项。** 在...

    安卓Android源码——android-styled-dialogs 可自定义样式的dialog.rar

    7. **DialogFragment**:在 Android 中,Dialog 通常通过 DialogFragment 来管理,以确保在配置更改(如屏幕旋转)时正确处理 Dialog。`android-styled-dialogs` 库可能也包含了关于如何使用 DialogFragment 的示例...

    Android课程实验-线性布局实验-限制布局实验-表格布局实验-自制的浏览器.zip

    7. **LayoutTest**:与layoutTest2和layoutTest3类似,这可能是另一个布局实验,但可能更深入,可能会涵盖相对布局(RelativeLayout)、帧布局(FrameLayout)或约束布局(ConstraintLayout)等更复杂的布局管理器。...

    Android学习01-----走进Android世界

    【Android学习01-----走进Android世界】 Android是一个开源的操作系统,主要应用于移动设备,如智能手机和平板电脑。它是Google公司主导开发的,并由开放手机联盟(Open Handset Alliance)支持。Android以其开放性...

    android-crop-master.zip

    5. **权限管理**:由于涉及到读取和写入文件以及使用相机,项目可能涉及Android的权限管理机制,如运行时权限。 6. **UI设计**:裁剪界面的布局设计,包括选择裁剪比例、拖动选择区域等功能。 7. **图片处理算法**:...

    Android拨号器---熟练控件与布局的应用

    这涉及到对Android的布局管理(如LinearLayout、RelativeLayout、GridLayout等)和UI控件(如EditText、Button、ImageView等)的深入理解,以及如何将它们有效地组合起来,实现拨号键盘的交互逻辑。 【标签】"源码...

    Android自定义控件---联系人列表A-Z排序

    - RecyclerView:相比ListView,RecyclerView更现代,性能更优,支持更多的动画效果和更灵活的布局管理器。 二、联系人数据模型 为了显示联系人列表,我们首先需要设计一个数据模型来存储联系人信息,包括姓名、...

    android-support-v4-preferencefragment-master

    在Android开发中,`android-support-v4-preferencefragment`是一个重要的库,主要目的是为了支持...通过研究这个库的源代码,开发者可以学习到如何有效地管理偏好设置,以及如何在不支持新特性的设备上实现类似的功能。

    Android Studio Linux(android-studio-ide-141.1890965-linux.zip )

    这个压缩包包含了Android Studio的所有核心组件,包括代码编辑器、构建工具、模拟器以及一系列调试和分析工具。 1. **安装步骤**: - 解压下载的zip文件到您希望的目录,例如`/opt/android-studio`。 - 添加可...

Global site tag (gtag.js) - Google Analytics