总结
一、CommonLayout
1、LinearLayout 线性布局
对于布局或者控件来说,设置高度、宽带时,值有4种:
属性:android:orientation="vertical"设置子控件的排序顺序
值有两种:vertical垂直 horizontal水平
2、RelativeLayout相对布局(使用最多的一种布局)
常用属性:
第一类:其属性值为true或false
android:layout_alignParentLeft="true" //贴紧父元素的左边缘
android:layout_centerHorizontal="true" //水平居中
第一类:其属性值必须为id的引用名"@id/id_name"
android:layout_below="@id/btn01" //在某元素的下方
android:layout_alignBaseline="@id/btn02"//本元素和某元素的基线对齐
android:layout_toStartOf="@id/btn03" //从在某元素的开始
android:gravity="":放在里面的子控件的位置(多个值用“|”隔开)
android:layout_gravity="":本身的位置
3、FrameLayout帧布局|框架布局
使用FrameLayout布局时,默认情况下后面放的控件会把前面控件覆盖
二、CommonLayout布局优化
1)、优化层次的结构(越浅越好,例如:借助merge标签合并相同元素)
2)、优化对象个数(越少越好)
3)、优化布局的可重用性(借助include标签)
4)、优化对象的加载时机(延迟加载,借助ViewStub)
5)
三、CommonLayout扩展
1、ScrollView垂直滚动
继承自FramLayout 垂直滚动:
里面不允许直接放TextView等,可以放布局里面放TextView...
2、HorizontalScrollView水平滚动
android:scrollbars="none"设置没有滚动条;
3、TextSwitcher(文本切换器)
4、ImageSwitcher(图片切换器)
构建或者获得ImageSwitcher对象、
设置View工厂(setFactory)、
设置动画Animation、
显示图片(setImageResourse() ),如果是SD卡(Image)
四、Adapter Layout
应用场合:由具体的Adapte Layout对象决定,常用的AdapterLayout对象有:
1、ListView (以列表形式显示数据)
2、GridView(以网格形式显示数据)
3、Spinner(以下拉列表形式显示数据)
4、ViewPager(以分页形式显示数据)
5、 ........
Adapter Layout的构成及原理分析:
1、AdapterLayout对象(负责显示)
2、Adapter对象(构建Item)
3、Context 对象(资源访问对象)
4、View对象(呈现item数据)
5、Data对象(代表数据)
Adapter Layout(ListView)
ListView应用的基本实现
1、ListView对象的构建(item)
2、ArrayAdapter对象的构建(数组适配器)
3、ListView关联adapter
代码:
//系统的布局文件
ListView lsv=(ListView) findViewById(R.id.lsId);
ArrayAdapter<String> adapter =new ArrayAdapter<String>(
this,
R.layout.eg,//样式(可从系统获取)
R.id.text01 //样式的ID
,list);
//ListView关联Adapter
lsv.setAdapter(adapter);
静态方法构建Adapter
部分代码:
//静态方法构建Adapter
ArrayAdapter<CharSequence> adapter=ArrayAdapter.createFromResource(
this,
R.array.itemarray,//在textArrayResId(res/values/strings.xml)
android.R.layout.simple_list_item_1);
ListView中的Adapter:Simple
SimpleAdapter:(List<?Extends Map<String,?>)?号代表任意类型;
第一个?必须是Map类型的子类;
adapter扩展及优化
1、自定义适配器:当官方给定的adapter不能满足我们需求时,我们可以自己定义adapter;我们自己定义的adapter需要直接或间接的继承BaeAdapter(代码量比较大),或者继承BaseAdapter的子类(稍微简单一些);然后根据实际的需要重写相关方法;其他的方法类似,只是注意:getView()方法不同;
定义一个类继承BaseAdapter抽象类,重写抽象类中的抽象方法;根据需要确定该适配器的构造方法的参数,然后ListView关联该适配器;
重用convertView的目的是减少ItemView的构建
减少findViewByid方法执行次数;(思路是对查找到的对象进行记录,如何记录?)应用场合是:数据量比较大的时候,数据量少的时候并没有此必要;
部分代码:
* 此方法用于构建item(包饺子)listview中每显示一个item就 会调用一次此方法
*/
@Override
public View getView(intposition, ViewconvertView, ViewGroupparent) {
Log.i("TAG", "getView.convertView=" + convertView);
// 1.item view (饺子皮对象)
View v = null;
ViewHolder vh = null;
if (convertView ==null) {
// 构建Item view对象(饺子皮)
v = View.inflate(getContext(),R.layout.list_item_02,null);
// 构建viewholder,借助此对象记录item view中子元素的位置
vh = new ViewHolder();
vh.imageView = (ImageView)v.findViewById(R.id.imageView1);
vh.textView = (TextView)v.findViewById(R.id.textView1);
// item view关联view holder
v.setTag(vh);//每个view都有此方法
} else {
v = convertView;// 实现ConvertView对象的重用
vh = (ViewHolder) v.getTag();
}
// 2.item data (饺子馅)
City c = getItem(position);
// 3.set item data to item view(包饺子,对号入座)
// 将city中的数据放到对应位置
vh.imageView.setImageURI(Uri.fromFile(new File(c.getLogo())));
vh.textView.setText(c.getName());
return v;// 包好的饺子
}
/** 要借助此类型的对象记录itemview中子元素的位置 */
class ViewHolder {
ImageView imageView;
TextView textView;
}
ListView的点击事件:
点击(短按)事件:(OnItemClickListener)点击ListView的item时会执行该事件;
onItemClick(AdapterView<?> parent, Viewview,intposition,longid)
Parent:点击的ListView(父类引用指向子类对象)
View:被点击的item;
Position:当前应用中的item的位置;
Id:当前应用中的id的值;
parent.getItemAtPosition(position);根据此方法获得该item位置的信息;
让选中位置高亮显示(设置选中的是文本,选中时变蓝色,否则是白色):
//设置模式(单选)
lsvNav.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
parent.getSelectedItemPosition();选中的位置;
刷新:parent.getAdapter().notifyDataSetChanged();
重写getView()方法;
public View getView(intposition, ViewconvertView, ViewGroupparent) { //包饺子(父类以实现的)
TextView tv=(TextView) super.getView(position,convertView,parent);
//获得选中的位置
int checked=lsvNav.getCheckedItemPosition();
if(position==checked){
tv.setTextColor(Color.BLUE);
}else{
tv.setTextColor(Color.WHITE);
}
return tv;
ListView中元素的排序:
实现:对数据集中的数据进行排序;其次刷新排序以后的结果(刷新ListView列表页面);
ListView中元素的分块显示:
要求:数据量比较小,且是一次性加载完成;数据已经有序;
实现方式:①对元素进行排序;②每个Item都添加一个TextView显示;③隐藏部分Item对象的首字母的显示;
部分代码(排序及分块显示):
// 4.实现分块显示
// 4.1获得当前位置的section(块)的ASCII
int section = getSectionForPosition(position);
// 4.2获得section(块)在listview中最小位置
int minPos = getPositionForSection(section);
// 4.3隐藏非最小位置section对应的nameKey
if (position ==minPos) {
vh.nameKey_tv.setVisibility(View.VISIBLE);
} else {
vh.nameKey_tv.setVisibility(View.GONE);
}
// 获得当前位置的section(块)的ASCII
private int getSectionForPosition(intposition) {
// 获得当前位置中的item,获得nameKey,获得nameKey的第一个首字母的大写字母
return getItem(position).getNameKey().toUpperCase().charAt(0);
}
// 获得section(块)在listview中的最小位置
public int getPositionForSection(intsection) {
// 遍历所有位置
for (inti = 0,count = getCount();i <count;i++) {
int sec = getSectionForPosition(i);
if (sec ==section) {
return i;// minPos找到最小的位置
}
}
return -1;//没有找到
}
ListView中元素的右侧导航;
①应用场合:数据有分块显示的场合;
②实现方式:在页面中添加一个listView;实现右侧ListView中数据的显示;
③点击右侧ListView列表定位具体分块;
去掉分割线:android:divider="@null"
ListView中:setSelectionFromTop(position,y);方法;y:偏移量;
部分代码(点击右侧导航栏中的大写字母跳到相应的城市位置)
public voidonItemClick(AdapterView<?> parent, Viewview,intposition,longid) {
// 4.1获得点击的item内容(section)
String item = (String) parent.getItemAtPosition(position);
// 4.2获得item对应的section
int section = item.charAt(0);
// 4.3根据此section获得在citys列表中的section的最小位置
int minPos = cityAdapter.getPositionForSection(section);
// 4.4设置此citys列表的顶端显示为section的最小位置
if (minPos == -1) return;
lsv.setSelectionFromTop(minPos, 0);// 0表示没有偏移
// 通知更新(高亮显示)
adapter.notifyDataSetChanged();
}
});
ExpandableListView扩展的ListView
一个特殊的ListView,是ListView的一个扩展;实现了一种抽屉功能;可以拉开也可以合上;可以对ListView中的内容进行分组,并可以实现分组的展开或者收起操作。
设置默认位置展开 :elsv.expandGroup(0);
设置默认位置收起 :elsv.collapseGroup(0);
Spinner(下拉列表):会以下拉列表的形式显示
两级联动:在spinner1中设置setOnItemSelectedListener事件,重写事件中onItemSelected方法
部分代码:(点击spinner1时,spinner2中数据会和spinner1中数据对应)
public voidonItemSelected(AdapterView<?> parent, Viewview,intposition,longid) {
childCity.clear();
//获得数据
childCity.addAll(Arrays.asList(qu[position]));
//更新列表
childAdapter.notifyDataSetChanged();
}
GridView
网格的形式显示数据,首先也需要借助adapter将对应的数据构建成item,然后显示
拉伸图片:iv.setScaleType(ScaleType.FIT_XY);
设置网格中的列数:gd.setNumColumns(2);//设置列数
GridView中选择器Selector设置
一般与view对象的状态结合使用,大多数是应用于view背景或字体;
注:背景和字体分开写selector
选择器的创建:
目录:res/drawable/selector.xml
访问:android:background="@drawable/grid_item_selector_01"
格式:
<selectorxmlns:android="http://schemas.android.com/apk/res/android">
<itemandroid:drawable="@color/gray" android:state_pressed="true"></item>
<itemandroid:drawable="@color/white"
android:state_pressed="false"></item>
</selector>
字体颜色的设置(选择文本是,文本的颜色改变):
创建:
目录:values/color.xml
访问: android:background="@drawable/grid_item_color_01"
格式:
<resources>
<color name="white">#ffffffff</color>
<color name="gray">#ffeeeeee</color>
</resources>
<selectorxmlns:android="http://schemas.android.com/apk/res/android">
<itemandroid:color="#ffffffff" android:state_pressed="true"></item>
</selector>
ViewPager分页
ViewPager以分页形式显示数据,它在显示这些数据是,首先会借助adapter将数据构建成item,然后显示。
实现:获得viewpager对象(Android.support.v4.viewpager)
构建adapter(BannerAdapter extends PagerAdapter)
关联adapter
添加监听事件
部分代码(广告条(滑动是跳转)):
//构建PagerAdapter
public int getCount() {
return 2;//两个页面跳转
}
@Override
public boolean isViewFromObject(View arg0, Objectarg1) {
return arg0==arg1;//两个参数相等时实现跳转
}
@Override
public Object instantiateItem(ViewGroup container,intposition) { //item view
ImageView iv=new ImageView(SecondActivity.this);
iv.setScaleType(ScaleType.FIT_XY);//拉伸图片
//item data
int pager_iv=pagerImage[position];
iv.setImageResource(pager_iv);
container.addView(iv);
returniv;
}
}
页面指示器的设置(广告条下的小圆点)
1)定义一个线性布局
2)在线性布局中动态添加imageview(几个小圆点)
3)在页面滑动时动态修改页面指示器imageview的状态(enable状态)
4)点击页面指示器小圆点跳转到不同的页面
(viewpager.setCurrentItem(position))
延时加载(自动跳转):
部分代码(广告条,不用滑动,自动跳转)
//延迟加载器
handler.postDelayed(new Runnable() {
@Override
public void run() {
index++;
vPager.setCurrentItem(index%2);//index%2表示加载2个页面时,%只能是0或者1,在两个页面之间跳转
handler.postDelayed(this, 1000);//回调自身方法,实现循环跳转
}
}, 1000);//1000表示1000毫秒(1秒)之后自动跳转
扩展:Button按钮选择器的设置
Selector(引入两个shape)
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 借助此元素定义view的颜色 -->
<solid android:color="#ff996600" />
<!-- 借助此元素定义view的进行角度设置 -->
<cornersandroid:radius="8dp"/>
<!-- <stroke />描边 -->
</shape>
目录:res/drawable/shap_01.xml
res/drawable/shap_01.xml
跳转页面并将下个页面的信息回传给本页面
部分代码(点击button按钮跳转到CityActivity页面,然后在CityActivity中选择完信息之后跳回到button页面,在button上显示选择的信息):
public void onClick(View v){
//启动Activity跳转返回结果
startActivityForResult(new Intent(this, CityActivity.class),100);
}
/**通过此方法获得返回的数据*/
@Override
protected void onActivityResult(intrequestCode,intresultCode, Intentdata) {//判断请求码和响应码是否
if(requestCode==100&&resultCode==200){
//获得回传回来的数据
String cityName=data.getStringExtra("cityname");
click_btn.setText(cityName);
}
}
// 设置跳转回传数据给启动此activity的那个activity
// 将要回传的数据封装到intent
Intent intent = new Intent();
// 获得要回传的数据
intent.putExtra("cityname",citys.getName());
// 设置响应码及回传数据
setResult(200, intent);
// 关闭当前页面
finish();