Android常见布局简述
16lz
2021-01-23
原文出处是:http://blog.chinaunix.net/uid-29006784-id-3880944.html
感谢原创作者!在一个Android应用程序中,用户界面通过View和viewGroup对象构建,Android中有很多种View和ViewGroup,他们都继承自View类,View对象是Android平台上表示用户界面的几本单元
下面分别介绍几种常用的布局方式:
①LinearLayout:线性布局,可以使用垂直线性布局(vertical),也可以使用水平线性布局,在LinearLayout里面可以放多个控件,但是一行(列)只能放一个控件;
◎ 小列子:布局文件
点击(此处)折叠或打开
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="第一行"
- android:textSize="20px"/>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="第二行"
- android:textSize="20px"/>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="第三行"
- android:textSize="20px"/>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="第四行"
- android:textSize="20px"/>
- </LinearLayout>
如果垂直布局方式:
点击(此处)折叠或打开
- android:orientation="vertical"
则会显示:
②RelativeLayout:相对布局,里面可以放置多个控件,但控件的位置都是相对的,并且提供了各种确定相对位置的参数,类型丰富;一般通过指定id来确定相对位置
◎小案列:布局文件
点击(此处)折叠或打开
- <?xmlversion="1.0"encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TextView
- android:id="@+id/label"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="请输入:"/>
- <EditText
- android:id="@+id/entry"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:background="@android:drawable/editbox_background"
- android:layout_below="@id/label"/>
- <Button
- android:id="@+id/ok"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/entry"<!--通过指定id确定相对位置-->
- android:layout_alignParentRight="true"
- android:layout_marginLeft="10dip"
- android:text="确定"/>
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toLeftOf="@id/ok"
- android:layout_alignTop="@id/ok"
- android:text="取消"/>
- </RelativeLayout>
运行可看到:
③TableLayout:表格布局,用行和列标识一个视图,和HTML中的表格布局非常类似,TableRow就像HTML表格的<tr>标记,但是TableRow中的单元格不能跨列,这又与HTML有所区别
几个重要属性:●android:shrinkColumns作用设置表格的列是否收缩(列编号从0开始,列之间用逗号隔开),如android:shrinkColumns="1,2,3",即表格的第1,2,3列可以收缩适应屏幕
●android:collapseColumns作用设置表格的列是否隐藏
●android:stretchColumns作用设置表格的列是否拉伸
◎小案列:布局文件
点击(此处)折叠或打开
- <?xmlversion="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:stretchColumns="1">
- <TableRow>
- <TextView
- android:layout_column="1"
- android:text="name"
- android:padding="3dip"/>
- <TextView
- android:text="Scoield"
- android:gravity="right"
- android:padding="3dip"/>
- </TableRow>
- <TableRow>
- <TextView
- android:layout_column="1"
- android:text="age"
- android:padding="3dip"/>
- <TextView
- android:text="22"
- android:gravity="right"
- android:padding="3dip"/>
- </TableRow>
- <TableRow>
- <TextView
- android:layout_column="1"
- android:text="salary"
- android:padding="3dip"/>
- <TextView
- android:text="-1000"
- android:gravity="right"
- android:padding="3dip"/>
- </TableRow>
- <View
- android:layout_height="2dip"
- android:background="#FF909090"/>
- <TableRow>
- <TextView
- android:text="*"
- android:padding="3dip"/>
- <TextView
- android:text="cellphone"
- android:padding="3dip"/>
- </TableRow>
- <TableRow>
- <TextView
- android:text="*"
- android:padding="3dip"/>
- <TextView
- android:text="telephone"
- android:padding="3dip"/>
- <TextView
- android:text="I Don't Know"
- android:gravity="right"
- android:padding="3dip"/>
- </TableRow>
- <View
- android:layout_height="2dip"
- android:background="#FF909090"/>
- <TableRow>
- <TextView
- android:layout_column="2"
- android:text="退出"
- android:padding="3dip"/>
- </TableRow>
- </TableLayout>
运行可看到左边的结果;右边的是增加了android:collapseColumns隐藏了第一列的结果
④FrameLayout:帧布局,该布局可以用来占有屏幕的某块区域来显示单一的对象,可以包含多个widgets或者布局,但是所包含必须被固定到屏幕的左上角,并且一层覆盖一层,类似堆栈结构,最后加进来的widgets或者布局显示在最上面,所以最后的一个会覆盖前面一个(除非最后一个是透明的,这必须得到FrameLayout Container的允许)
◎小案例:定义三个简单的控件
点击(此处)折叠或打开
- <?xmlversion="1.0"encoding="utf-8"?>
- <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:stretchColumns="1"
- android:collapseColumns="1">
- <ImageView
- android:id="@+id/iv_image"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/icon"/>
- <TextView
- android:id="@+id/tv_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="我是TextView"/>
- <Button
- android:id="@+id/bt_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="我是按钮"/>
- </FrameLayout>
运行显示结果……
可看到他们都显示在左上角,而且最后的会覆盖前面的显示在最上方;
⑤TabLayout:标签布局,犹如安卓手机里面的通话记录界面布局,而要创建一个TabLayout,需要使用到TabHost和TabWidget,TabHost必须是布局的根节点,它包含显示标签的TabWidget和显示标签内容的FrameLayout,
实现标签内容有两种方法:1.使用标签在同一个活动中交换视图;2.使用标签在完全隔离的活动之间改变
◎小案例
1.布局文件
点击(此处)折叠或打开
- <?xmlversion="1.0"encoding="utf-8"?>
- <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@android:id/tabhost"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <LinearLayout
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TabWidget
- android:id="@android:id/tabs"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"/>
- <FrameLayout
- android:id="@android:id/tabcontent"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TextView
- android:id="@+id/textview1"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:text="我是第一个标签"/>
- <TextView
- android:id="@+id/textview2"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:text="我是第二个标签"/>
- <TextView
- android:id="@+id/textview3"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:text="我是第三个标签"/>
- </FrameLayout>
- </LinearLayout>
- </TabHost>
2. 创建主activity,注意是继承自TabActivity而不是Activity;
点击(此处)折叠或打开
- publicclassLayoutActivityextendsTabActivity{
- //定义一个TabHost
- TabHost tabHost;
- @Override
- publicvoidonCreate(Bundle savedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //取得TabHost对象
- tabHost=getTabHost();
- /* 为TabHost添加标签 */
- //新建一个newTabSpec(newTabSpec)
- //设置其标签和图标(setIndicator)
- //设置内容(setContent)
- tabHost.addTab(tabHost.newTabSpec("tab_1").setIndicator("tab1",getResources()
- .getDrawable(R.drawable.img1)).setContent(R.id.textview1));
- tabHost.addTab(tabHost.newTabSpec("tab_2").setIndicator("tab2",getResources()
- .getDrawable(R.drawable.img2)).setContent(R.id.textview2));
- tabHost.addTab(tabHost.newTabSpec("tab_3").setIndicator("tab3",getResources()
- .getDrawable(R.drawable.img3)).setContent(R.id.textview3));
- //设置TabHost的背景颜色
- tabHost.setBackgroundColor(Color.argb(150,22,70,150));
- //设置TabHost的背景图片资源
- //mTabHost.setBackgroundResource(R.drawable.bg0);
-
- //设置当前显示哪一个标签
- tabHost.setCurrentTab(0);
-
- //标签切换事件处理,setOnTabChangedListener
- tabHost.setOnTabChangedListener(newOnTabChangeListener(){
-
- @Override
- publicvoidonTabChanged(StringtabId){
- // TODO Auto-generated method stub
- Dialogdialog=newAlertDialog.Builder(LayoutActivity.this)
- .setTitle("提示")
- .setMessage("当前选中了:"+tabId+"标签")
- .setPositiveButton("确定",newDialogInterface.OnClickListener(){
-
- @Override
- publicvoidonClick(DialogInterfacedialog,intwhich){
- // TODO Auto-generated method stub
- dialog.cancel();
- }
- }).create();//创建按钮
- dialog.show();
- }
- });
- }
- }
运行结果……
上面的确是实现了TabLayout的功能,但从用户的角度来看不太直观…而且现在的应用软件大部分都是把TabWidget放到底部,人性化较好……
更改代码:利用android:layout_alignParentBottom="true"实现底部显示,并且把上面的LinearLayout改为RelativeLayout
点击(此处)折叠或打开
- <?xmlversion="1.0"encoding="utf-8"?>
- <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@android:id/tabhost"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <RelativeLayout
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TabWidget
- android:id="@android:id/tabs"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"/>
- <FrameLayout
- android:id="@android:id/tabcontent"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TextView
- android:id="@+id/textview1"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:text="我是第一个标签"
- android:textSize="40px"/>
- <TextView
- android:id="@+id/textview2"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:textSize="40px"
- android:text="我是第二个标签"/>
- <TextView
- android:id="@+id/textview3"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:textSize="40px"
- android:text="我是第三个标签"/>
- </FrameLayout>
- </RelativeLayout>
- </TabHost>
运行可看到
⑥GridView:网格布局,效果就像安卓手机就如主菜单查看软件一样,一个二维的,滚动的网格;
◎小案例:这是我以前写的一个新闻客户端,其中用到了GridView
1.GridView的布局文件:newsactivity.xml
点击(此处)折叠或打开
- <?xmlversion="1.0"encoding="utf-8"?>
- <GridView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/gridview"
- android:numColumns="auto_fit"
- android:horizontalSpacing="10dp"
- android:verticalSpacing="10dp"
- android:columnWidth="90dp"
- android:stretchMode="columnWidth"
- android:gravity="center"
- android:background="#ffffffcc"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- </GridView>
点击(此处)折叠或打开
- <?xmlversion="1.0"encoding="utf-8"?>
- <RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="wrap_content"
- android:paddingBottom="4dip"android:layout_width="fill_parent">
- <ImageView
- android:layout_height="wrap_content"
- android:id="@+id/ItemImage"
- android:layout_width="wrap_content"
- android:layout_centerHorizontal="true">
- </ImageView>
- <TextView
- android:layout_width="wrap_content"
- android:layout_below="@+id/ItemImage"
- android:layout_height="wrap_content"
- android:text="TextView01"
- android:layout_centerHorizontal="true"
- android:id="@+id/ItemText">
- </TextView>
- </RelativeLayout>
3.主Activity文件:
点击(此处)折叠或打开
- publicclassgridViewextendsActivity{
- //定义相关控件
- GridView gridView;
- TextView textView;
- //定义TextView对应资源
- String[]arr={"国内新闻","国际新闻","军事新闻","社会新闻","深度新闻",
- "评论新闻","图片新闻",
- "探索新闻","校园焦点","产业新闻","IT业界","电影世界"};
- //定义ImageView对应资源
- int[]picarr={R.drawable.innernews,R.drawable.outernews,R.drawable.junshinews,
- R.drawable.innernews,R.drawable.innernews,R.drawable.innernews,
- R.drawable.innernews,R.drawable.innernews,R.drawable.innernews,
- R.drawable.innernews,R.drawable.innernews,R.drawable.innernews};
- @Override
- publicvoidonCreate(Bundle savedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.newsactivity);
- //初始化相关控件
- gridView=(GridView)this.findViewById(R.id.gridview);
- textView=(TextView)this.findViewById(R.id.ItemText);
- //为下面的SimpleAdapter准备参数
- ArrayList<HashMap<String,Object>>ImageItemList=newArrayList<HashMap<String,Object>>();
- for(inti=0;i<arr.length;i++){
- HashMap<String,Object>map=newHashMap<String,Object>();
- map.put("ItemImage",picarr[i]);
- map.put("ItemText",arr[i]);
- ImageItemList.add(map);
- }
- //创建一个SimpleAdapter
- SimpleAdapter adapter=newSimpleAdapter(this,ImageItemList,R.layout.adapter,
- newString[]{"ItemImage","ItemText"},newint[]{R.id.ItemImage,R.id.ItemText});
- //在GridView上显示adapter
- gridView.setAdapter(adapter);
- //实现点击打开另一个Activity
- gridView.setOnItemClickListener(newOnItemClickListener(){
- @Override
- publicvoidonItemClick(AdapterView<?>parent,Viewview,
- intposition,longid){
- // TODO Auto-generated method stub
- HashMap<String,Object>item=(HashMap<String,Object>)parent.getItemAtPosition(position);
- setTitle((String)item.get("ItemText"));
-
- switch(position){
- case0:
- //Intent intent = new Intent(NewsActivity.this, InNewsActivity.class);
- //startActivity(intent);
- break;
-
- default:
- break;
- }
- }
- });
- }
- }
运行可看到结果^0^!
⑦ListView:列表视图,列表的元素通过ListAdapter自动插入到列表
◎小案例
1.布局文件:main.xml
点击(此处)折叠或打开
- <?xmlversion="1.0"encoding="utf-8"?>
- <TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- </TextView>
2.Activity文件
点击(此处)折叠或打开
- publicclassgridViewextendsListActivity{//这里继承的是ListActivity
- @Override
- protectedvoidonCreate(Bundle savedInstanceState){
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- //为ArrayAdapter创造参数
- String[]array=newString[20];
- for(inti=0;i<20;i++){
- array[i]=i+"";
- }
- //设置ListAdapter而不是setContentView
- setListAdapter(newArrayAdapter<String>(this,R.layout.main,array));
- //得到一个ListView
- ListViewlistView=getListView();
- //触发点击事件
- listView.setOnItemClickListener(newOnItemClickListener(){
-
- @Override
- publicvoidonItemClick(AdapterView<?>parent,Viewview,
- intposition,longid){
- //点击时打印该Item所在的position
- Toast.makeText(getApplicationContext(),position+"",0).show();
- }
- });
- }
- }
运行可看到*o*
最后还有个AbsoluteLayout绝对布局;由于安卓手机泛滥,这个个人觉得很少用到……所以就不说了
更多相关文章
- Android:控件布局(线性布局)LinearLayout
- 布局(2、相对布局)
- android 设置布局为无标题样式
- 【Android】配置文件属性说明
- Android中attr自定义标签详解
- 在sd卡存储文件
- Android 解决布局问题