初识android界面布局
1.活动
活动是android开发中最基本的概念,也是最容易吸引用户的地方,是一种可以包含用户界面的组件。
Activity类中定义了7个回调方法,覆盖了活动生命周期的每一个环节。具体如下:
(1)onCreat:活动第一次被创建时调用。
在onCreat方法中调用setContentView(R.layout.id)
方法可以给当前活动关联并且加载一个布局,也可以说是我们可以看得到一个界面。但是创建了一个活动必须在AndroidManifest.xml中进行注册才能够生效。 销毁一个活动可以使用activity类中的finish()方法。(ps:打开上述文件,在application标签内可以添加activity标签进行相关活动的注册。另外,主活动即点击软件图标进入的主页面,注册时需加上
, )
(2)onStart:活动由不可见变为可见时调用。
(3)onResume:处于运行状态的活动,即准备与用户进行交互的时候调用。
(4)onPause:在系统准备去启动或恢复另一个活动的时调用。
(5)onStop:活动完全不可见时调用。
(6)onDestroy:活动即将销毁前调用。
(7)onRestart:活动由停止状态变运行时调用。
2.android布局的一些组件
Toast: Toast是Android系统中的一种提醒方式,在程序中使用它可以将一些提示信息通知给用户,并且一定时间之后自动消失。(ps:具体可查看相关文档, Toast.makeText(当前活动,提示内容,显示时长))
TextView: 用于在界面上显示文本信息。
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="文本信息"
/>
Button: 按钮。
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="button"
/>
EditText: 文本框,允许用户输入和编辑内容。
<EditText
android:id="@+id/name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="输入用户名..."
/>
ImageView: 用于在界面上展现图片的一个控件。
<ImageView
android:id="@+id/imageview"
android:layout_width="wrap_conten"
android:layout_height="wrap_conten"
android:background="#F00"
android:src="@drawable/green"
/>
ProgressBar: 用于在界面上显示一个进度条。
关于进度条的进度值以及显示与隐藏可以在程序中根据具体的程序加载进度加以控制。<ProgressBar
android:id="@+id/progressbar"
android:layout_width="wrap_conten"
android:layout_height="wrap_conten"
/>
AlertDialog: 在当前界面弹出一个对话框,具体参数有
setTitle()设置对话框标题
setMessage()设置对话框内容
setCancelable()设置对话框是否为可关闭
setPositiveButton()设置确认按钮
setNegativeButton()设置取消按钮ProgressDialog: 在当前界面弹出一个带有进度条的弹框,具体用法与AlertDialog类似。
3.Intent实现页面的跳转
- 显式intent使用 在按钮的点击事件中设置,首先构建一个Intent对象 Intent intent = new Intent(当前活动,目标活动),其次调用方法startActivity(intent)方法即可启动目标活动。到此,则可以实现点击改按钮跳转到另外一个页面简单切换了。
- 隐式intent使用 通过在活动注册时候的标签内为活动配置相应的自定义category,通过在intent对象中调用addCategory(category)为intent配置响应页面的category可实现对应页面的跳转。(intent中还可以设置android中的内置动作,比如拨号,网页跳转等等,具体可以参考《第二行代码》)
4.四种基本布局
线性布局
LinearLayout:垂直排列 or 水平排列
android:orientation 属性可以指定控件的排列方向
android:orientation = "vertical" 垂直排列
android:orientation = "horizontal"水平排列
android:layout_gravity
可以指定控件在布局中的对齐方式,
具体值有top,center_vertical,bottom等等,
但有一点需要注意的是,当布局排列方向为水平的时候,
只有垂直方向上的对齐方式才会生效,反之亦然。
另外LinearLayout中还有一个重要属性
android:layout_weight这个属性代表该控件所占有的权值,
android:layout_weight的真实含义是:
一旦View设置了该属性(假设有效的情况下),
那么该 View的宽度等于原有宽度
(android:layout_width)加上剩余空间的占比!
相对布局
RelativeLayout:通过相对定位的方式让控件出现在布局的任何位置。
相对于父布局的定位:
android:layout_alignParentLeft = "true"
android:layout_alignParentRight = "true"
android:layout_alignParentTop = "true"
android:layout_alignParentBottom ="true"
android:layout_centerInParent = "true"
这几个属性从名字就可以看出来,分别实现与父布局左,右,上,下对齐
以及居中显示的作用,可以同时指定两个属性实现左上,右下等等的对齐方式。 相对于控件的定位:
android:layout_above = "@id/button"
android:layout_below = "@id/button"
android:layout_toRightOf = "@id/button"
android:layout_toLeftOf = "@id/button"
分别实现定位到指定控件的上下右左方向。
帧布局
FrameLayout:没有方便的定位方式,但是所有的控件都会默认摆放在布局的左上角。
可以通过layout_gravity属性指定定位方式。
相对于其他布局,FrameLayout的应用场景较少。
百分比布局
可以直接指定控件在布局中所占的百分比决定控件的大小,可以不使用wrap_content,matchparent来指定控件大小。
百分比只为帧布局和相对布局进行功能扩展,原有的特性还在。因为线性布局本身已经支持按比例指定控件大小了(layout_weght)。
使用百分比布局需在app/build.gradle的dependencies闭包中添加:
compile 'com.android.support:percent:24.2.1' PercentFrameLayout:百分比帧布局
PercentRelativeLayout:百分比相对布局
通过在控件中添加:
app:layout_widthPercent ="50%"
app:layout_heightPercent ="50%"
指定控件所占布局的百分比。
5.ListView
用来展示列表,可以向上向下的滑动,类似于刷微博,QQ聊天等。
ListView显示数据需要使用适配器(adapter)将数据映射到ListView上。
数据,包括具体将被映射的字符串,图片或者基本组件。
ListView与ListView布局以及数据关联:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(当前activity类.this,android.R.layout.listview子项布局xml,data)
<-String为data数据类型,也可以是自己定义的数据类,但是自定义数据类的同时需要自定义适配器类,可以继承自ArrayAdapter,也可以是其他适配器类型->
ListView listview = (ListView) findViewById(R.id.list_view)
listview.setAdapter(adapter)
<-将构建好的适配器对象传给listview->
自定义适配器类型
数据类
public class Fruit {
private String name;//水果名字
private int imageId;//水果图片id
public Fruit(String name,int inmageId){
this.name=name;
this.imageId=imageId;
}
public String getName(){
return name;
}
public int getImageId(){
return imageId;
}
} 适配器类
public class FruitAdapter extends ArrayAdapter<Fruit>{
private int resourceId;
public FruitAdapter(Context context,int textViewResourceId,List<Fruit> object){
super(context,textViewResourceId,object);
resourceId=textViewResourceId;
}
@Override
public View getView(int position,View convertView,ViewGroup parent){
Fruit fruit =getItem(position);//获取当前项的Fruit实例
View view =LayoutInflater.from(getContext()).inflate(resourceId,parent,false);//为获取的子项加载传入的布局
ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
TextView fruitName = (TextView)view.findViewById(R.id.fruit_name);
fruitName.setImageResource(fruit.getImageId());
fruitName.setText(fruit.getName());
return view;//返回布局 }
}
//需重写父类的构造函数,以及getView()方法,该方法在每个子项被滚动到屏幕内的时候被调用;
存在问题1:getView()方法每次都将布局重新加载一遍,当ListView快速滑动时将成为性能的瓶颈。
改进1:getView()方法中还有一个convertView参数,会自动为之前加载好的布局进行缓存。
利用该特性,在getView()加入以下代码
if(convertView == null){
view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
}else {
view = convertView;
}
//判断若之前从未加载过布局,则利用layoutinflater加载,否则直接从缓存convertView中读取即可。 存在问题2:getView()方法中每次都需要重复获取控件实例。
改进2:同样利用缓存的思想实现并且借助ViewHolder内部类对控件进行缓存。
如下先实现一个内部类ViewHolder:
class ViewHolder{
ImageView fruitImage;
TextView fruitName;
}
getView(){
……
ViewHolder viewHolder;
if(convertView == null){
view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
viewHolder = new ViewHolder();
viewHolder.fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
viewHolder.fruitName = (TextView)view.findViewById(R.id.fruit_name);
view.setTag(viewHolder);//将viewHolder存储在View中
}else {
view = convertView;
viewHolder = (ViewHolder)view.getTag;//重新获取ViewHolder
}
}
ListView的点击事件设置
在activity类中注册监听器实现点击事件
listView.setOnItemClickListener(new AdapterView.onClickListener()){
@Override
public void onItemClick(AdapterView<?> parent,View view,int position,long id){
Fruit fruit = fruitList.get(position);
Toast.makeText(MainACtivity.this,fruit.getName(),Toast.LENGTH_SHORT).show();
}
}
//当用户点击ListView中的任何一个子项时,都会调用onItemClick方法,通过position参数判断用户点击的是哪一个子项,从list中获取相应的数据,通过toast显示出来。
6.RecyclerView---更加强大的滚动控件
属于新增控件
需要添加如下依赖:
compile 'com.android.support:recyclerview-v7:24.2.1'
RecyclerView的适配器
新建适配器类继承自RecyclerView.Adapter,内部同样实现一个内部类ViewHolder继承自新建适配器类继承自RecyclerView.ViewHolder,用来实现对控件的缓存。并且实现适配器的构造方法,并重写onCreatViewHolder,onBindViewHolder,getItemCount等方法。
onCreatViewHolder(),用于加载布局并且创建ViewHolder实例,返回一个ViewHolder实例。
onBindViewHolder(),当每个子项被滚动到屏幕内的时候调用,对RecyclerView子项进行赋值
getItemCount(),返回RecyclerView的子项个数,返回list的长度即可。
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayout(layoutManager);
FruitAdapter adapter = new FruitAdapter(fruitlist);
recyclerView.setAdapter(adapter);
//layoutManager用于指定RecyclerView的布局方式,LinearLayoutManager是线性布局的 意思。
相比于ListView,RecyclerView还可以实现横向滚动,网格布局和瀑布流布局,具体可以参考
关于RecyclerView的点击事件,ListView实现对子项布局中某个控件的点击事件可能比较复杂,但是RecyclerView可以很轻松的实现整个子项布局的点击或者自相布局中某个控件的点击事件。具体可参考《第二行代码》。
初识android界面布局的更多相关文章
- Android界面布局基本知识简述
Android手机操作系统在模拟器中进行相关的编写,可以帮助我们实现各种功能需求.尤其是在界面的操作方面显得更为突出.在这里我们就可以对Android界面布局的相关操作来对这方面的知识进行一个深入的了 ...
- iOS中xib与storyboard原理,与Android界面布局的异同
用文本标记语言来进行布局,用的最多的应该是HTML语言.HTML能够理解为有一组特殊标记的XML语言. 一.iOS中xib与storyboard显示原理 在iOS中基本的布置界面的方式有3种:代码.x ...
- android界面布局
(一)LinearLayout界面编排模式 他的格式是按照线性顺序,由上往下或右左往右,逐一排列界面组件. layout_width:中的“match_parent”表示要填满他所在的外框,而“wra ...
- Android界面布局学习总结
参考文章: http://blog.csdn.net/shakespeare001/article/details/7843460 http://www.cnblogs.com/w-y-f/p/412 ...
- 解决Android界面布局添加EditText组件后界面无法预览
错误报告: Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V Exception details are ...
- Android界面布局基本属性
在 android 中我们常用的布局方式有这么几种:1.LinearLayout ( 线性布局 ) :(里面只可以有一个控件,并且不能设计这个控件的位置,控件会放到左上角) ...
- 【android学习3】解决Android界面布局添加EditView之后无法预览问题
在设计登陆界面时,拖入一个EditView之后发现界面无法预览 问题分析: 进入xml源文件里发现一个警告,提示添加inputType或者hint元素,添加后界面仍然无法预览... 仔细查看了当前使用 ...
- android 界面布局 很好的一篇总结[转]
1.LinearLayout ( 线性布局 ) :(里面只可以有一个控件,并且不能设计这个控件的位置,控件会放到左上角) 线性布局分为水平线性和垂直线性二者的属性分别为:android:orienta ...
- android 界面布局
一.LinearLayout LinearLayout 又称作线性布局,是一种非常常用的布局,它所包含的控件在线性方向上依次排列. android:orientation="horizont ...
随机推荐
- 三种数据库访问——Spring3.2 + Hibernate4.2
前三篇随笔中介绍了 用原生的JDBC访问数据库.一种高效的数据库连接池druid.用Spring的JDBC框架访问数据库. 本文继续介绍第三种数据库访问的解决方案:Spring3.2 + Hibern ...
- Ionic APP 热更新 之 产品发布状态下的热更新搭建,去local-dev-addon插件
上一篇,我们介绍了在本地开发环境下的ionic项目热更新测试, 本文,我们将详细说明如何在去掉cordova-hot-code-push-local-dev-addon插件的情况下,实现热更新. 使用 ...
- sql中同一个表一个字段的值赋值给另一个字段
UPDATE SG_User SET DefaultOrganizationID = OrganizationID
- ssh连接工具中文乱码问题
在终端运行: export LC_ALL=zh_CN.GB2312;export LANG=zh_CN.GB2312
- Jade——变体的HTML
什么是jade? jade是一个模板引擎,是变体的HTML. 模板引擎就是一个库,用来解释素具渲染视图的框架,也可以叫做HTML的预处理语言. jade是Node.js的一个模板引擎,他的语法借鉴了H ...
- Web前端开发工程师常用技术网站整理
1.常用工具相关 有道云笔记 http://note.youdao.com/signIn/index.html 36镇-最好用的共享收藏夹 http://www.36zhen.com/ 浏览器同步测试 ...
- drawRect:和layoutSubview的区别
关于这两个方法的区别 还是有点意思的. UIView的setNeedsDisplay和setNeedsLayout方法.首先两个方法都是异步执行的.setNeedsDisplay会调用自动调用draw ...
- MYSQL与MSSQL对比学习
最近在将公司的一个产品里面相关的MSSQL语句修改为可以在MYSQL上执行的语句 l 优点分析: MYSQL短小精悍,容易上手,操作简单,免费供用的.相对其它数据库有特色又实用的语法多一些.SQL怎 ...
- 数组原型方法调用及函数apply调用时 类数组参数在IE8下的问题
当函数以 apply 方式调用时, 传参方式是一个由各个参数组成的数组或类数组(一个有length属性的对象),传入参数个数取决于 length 的值,例如,某个对象 args.length=3; a ...
- css对ie的兼容性问题处理(一):
1.在制作sidebar时对li里面的元素进行浮动,li在ie6/7下会出现4px的间间隙: 解决方法:在li下加上vertical-align属性,值可为top.bottom.middle: 扩展: ...