android控件实验.docx
- 文档编号:4442998
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:10
- 大小:297.24KB
android控件实验.docx
《android控件实验.docx》由会员分享,可在线阅读,更多相关《android控件实验.docx(10页珍藏版)》请在冰豆网上搜索。
android控件实验
实验二android基本控件实验.
【目的】
熟悉Android常用控件的基本操作,掌握它们的基本使用方法。
了解控件之间的构成关系,熟悉适配器的使用原理。
【要求】
1、了解控件的继承关系;
2、掌握适配器的使用;
3、掌握信息提示的实现机制;
4、实现基本界面。
【原理】
1.控件类之间的关系
android.view.View类(视图类)呈现了最基本的UI构造块。
View类是Android中的一个超类,几乎包含了所有的屏幕类型,主要负责绘制和事件处理。
Android中控件类的扩展结构如图所示。
View有众多的扩展者,它们大部分是在android.widget包中,这些继承者实际上就是Android系统中的“控件”。
View实际上就是各个控件的基类,创建交互式的图形用户界面的基础。
View的直接继承者包括文本视图(TextView)、图像视图(ImageView)、进度条(ProgressBar)等。
它们各自又有众多的继承者。
每个控件除了继承父类功能之外,一般还具有自己的公有方法、保护方法、XML属性等。
在Android中使用各种控件的一般情况是在布局文件中可以实现UI的外观,然后在Java文件中实现对各种控件的控制动作。
控件类的名称也是它们在布局文件XML中使用的标签名称。
2.控件通用行为和属性
View是Android中所有控件类的基类,因此View中一些内容是所有控件类都具有的通用行为和属性。
提示:
由于Java语言不支持多重继承,因此Android控件不可能以基本功能的“排列组合”的方式实现。
在这种情况下,为了实现功能的复用,基类的功能往往做得较强,作为控件的祖先类,View所实现的功能也是最多的。
控件类经常在布局文件中使用,因此其可以使用XML属性(XMLAttributes),和Java代码经常具有对应关系。
View作为各种控件的基类,其XML属性所有控件通用,XML属性及其对应的方法如表1所示。
表1View中的XML属性及其对应的方法
XML属性名称
Java中的方法
描述
android:
background
setBackgroundResource(int)
设置背景
android:
clickable
setClickable(boolean)
设置View是否响应单击事件
android:
visibility
setVisibility(int)
控制View的可见性
android:
focusable
setFocusable(boolean)
控制View是否可以获取焦点
android:
id
setId(int)
为View设置标识符,可通过findViewById方法获取
android:
longClickable
setLongClickable(boolean)
设置View是否响应长单击事件
android:
soundEffectsEnabled
setSoundEffectsEnabled(boolean)
设置当View触发单击等事件时是否播放音效
android:
saveEnabled
setSaveEnabled(boolean)
如果未作设置,当View被冻结时将不会保存其状态
android:
nextFocusDown
setNextFocusDownId(int)
定义当向下搜索时应该获取焦点的View,如果该View不存在或不可见,则会抛出RuntimeException异常
android:
nextFocusLeft
setNextFocusLeftId(int)
定义当向左搜索时应该获取焦点的View
android:
nextFocusRight
setNextFocusRightId(int)
定义当向右搜索时应该获取焦点的View
android:
nextFocusUp
setNextFocusUpId(int)
定义当向上搜索时应该获取焦点的View
其中,android:
id表示控件的标识,通常需要在布局文件中指定这个属性。
View中与控件标识相关的几个方法如下所示:
publicintgetId()//获得控件的id(int类型)
publicvoidsetId(intid)//设置控件的id(int类型)
publicObjectgetTag()//获得控件的tag(Object类型)
publicvoidsetTag(Objecttag)//设置控件的tag(Object类型)
对于一个控件,也就是View的继承者,整数类型id是其主要的标识。
其中,getId()可以获得控件的id,而setId()可以将一个整数设置为控件的id,但是这个方法并不常用。
View的id通常可以在布局文件中获得。
Object类型的标识tag是控件的一个扩展标识,由于使用了Object类型,它可以接受大部分的Java类型。
在一个View中根据id或者tag查找其孩子的方法如下所示:
publicfinalViewfindViewById(intid)
publicfinalViewfindViewWithTag(Objecttag)
findViewById()和findViewWithTag()的目的是返回这个View树中id和tag为某个数值的View的句柄。
View树的含义是View及其所有的孩子。
值得注意的是,id不是控件的唯一标识,例如布局文件中id是可以重复的,在这种重复的情况下,findViewById()的结果不能确保找到唯一的控件。
提示:
作为控件的标识的id和tag可以配合使用:
当id有重复的时候,可以通过给控件设置不同的tag,对其进行区分。
可见性的问题,android:
visibility在布局文件中有三个数值:
visible(可见,默认),invisible(不可见),gone(去除)。
在Java代码中,setVisibility()能使用的枚举值与其对应,它们是:
View.VISIBLE(0x0),View.INVISIBLE(0x4),View.GONE(0x8)。
3.数据适配器工作原理
Adapter是视图与数据之间的桥梁,Adapter用来帮助填充视图中的数据,提供视图对数据的访问方式,通过它将数据填充到控件中,为在数据集里的每个数据项生成一个View。
常用Adapter包括ArrayAdapter,BaseAdapter,CursorAdapter,HeaderViewListAdapter,ListAdapter,ResourceCursorAdapter,SimpleAdapter,SimpleCursorAdapter,SpinnerAdapter,WrapperListAdapter。
各个AdapterView之间的继承关系如图:
基类BaseAdapter有一个重要的方法:
publicabstractViewgetView(intposition,ViewconvertView,ViewGroupparent)
参数
Intposition:
该视图在适配器数据集中的位置
ViewconvertView:
旧视图,也就已经滚出可视区的视图
ViewGroupparent:
当前视图最终会被附加到的父级视图
这个方法被setAdapter(adapter)间接地调用。
getView方法的作用是得到一个View,这个view显示数据项里指定位置的数据,可以手动创建一个view或者从一个XMLlayout中解析获取。
当这个view被inflated,它的父view(如GridView,ListView等)将要使用默认的layout参数,除非你用inflate(int,android.view.ViewGroup,boolean)方法来指定一个根view并防止附着在根上。
在Adapter中,所有数据项的视图是可以重用的,只是对可见视图将产生视图,对已经滚动出可见界面的视图,将重复使用,以减少资源损耗。
【过程】
1.新建一个Android工程ControlTest;
2.编写布局文件,实现布局效果,如图:
3.初始化控件
publicvoidinitView(){
mButtonAdd=(Button)findViewById(R.id.but_sure);
mTextClass=(TextView)findViewById(R.id.editxt_class);
mTextGrade=(TextView)findViewById(R.id.editxt_grade);
mTextId=(TextView)findViewById(R.id.editxt_id);
mTextName=(TextView)findViewById(R.id.editxt_name);
mListView=(ListView)findViewById(R.id.course_list);
mSpinnerCourse=(Spinner)findViewById(R.id.course_spinner);
//initSpinnerdata
//初始化Spinner的数据
List
.getStringArray(R.array.course_list));
ArrayAdapter
android.R.layout.simple_list_item_1,mCourseList);
mSpinnerCourse.setAdapter(mAdapter);
//inittheListView
//初始化ListView
mDataList=newArrayList
mListAdapter=newItemAdapter(this,mDataList);
mListView.setAdapter(mListAdapter);
}
4.编写ItemAdapter
classItemAdapterextendsBaseAdapter{
ArrayList
LayoutInflatermInflater;
ContextmContext;
View.OnClickListenerdeletelistener;
publicItemAdapter(ContextmContext_,ArrayList
mArrayitem=item;
mContext=mContext_;
mInflater=(LayoutInflater)mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
//
//ViewHolder在ListView中用的非常多.用ViewHolder和
//在ListView每次生成一个Item和你拖动这个ListView的时候.都会调用这个函数
//而Java中比较消耗的时间的操作就是findIVewItem和new一个新的Class
//采用ViewHolder后.用setTag和getTag.实现ViewHolder和View的绑定.不需要再去生成和查找了.
//
classViewHolder{
publicTextViewmTextClass;
publicTextViewmTextName;
publicTextViewmTextId;
publicTextViewmTextCourse;
publicButtonmDelButton;
}
//BaseAdapter必须重载的四个函数
//getCount()返回ListView的Item数目
//getId()返回ListView的id数目
//getItem()返回ListView的Item数目
//getView()返回ListView的View重构最关键的地方.
@Override
publicintgetCount(){
returnmArrayitem.size()+1;
}
@Override
publicObjectgetItem(intposition){
returnposition+1;
}
@Override
publiclonggetItemId(intposition){
returnposition+1;
}
@Override
publicViewgetView(intposition,Viewconvertview,ViewGroupgroup){
ViewHoldermViewHolder;
finalintid=position;
if(convertview==null){
convertview=mInflater.inflate(R.layout.item,null);
mViewHolder=newViewHolder();
mViewHolder.mDelButton=(Button)convertview
.findViewById(R.id.item_del);
mViewHolder.mTextId=(TextView)convertview
.findViewById(R.id.item_num);
mViewHolder.mTextCourse=(TextView)convertview
.findViewById(R.id.item_course);
mViewHolder.mTextName=(TextView)convertview
.findViewById(R.id.item_name);
mViewHolder.mTextClass=(TextView)convertview
.findViewById(R.id.item_class);
convertview.setTag(mViewHolder);
}else{
mViewHolder=(ViewHolder)convertview.getTag();
}
if(id==0){
setFirst(mViewHolder);
}else{
Itemitem=mArrayitem.get(id-1);
mViewHolder.mTextCourse.setText(item.course);
mViewHolder.mTextId.setText(item.id);
mViewHolder.mTextClass.setText(item.grade);
mViewHolder.mTextName.setText(item.name);
mViewHolder.mDelButton
.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
mArrayitem.remove(id-1);
ItemAdapter.this.notifyDataSetChanged();
}
});
mViewHolder.mDelButton.setTextSize(mViewHolder.mTextId
.getTextSize()/2);
}
returnconvertview;
}
publicvoidsetData(ArrayList
mArrayitem=item;
}
publicvoidsetFirst(ViewHoldermHolder){
mHolder.mDelButton.setBackgroundColor(Color.TRANSPARENT);
mHolder.mDelButton.setTextSize(mHolder.mTextId.getTextSize()/2);
mHolder.mDelButton.setText("功能");
mHolder.mTextCourse.setText("课程");
mHolder.mTextId.setText("学号");
mHolder.mTextClass.setText("班级");
mHolder.mTextName.setText("姓名");
}
}
5.实现程序
【完成实验报告】
根据实验过程和实验结果,完成实验报告,叙述实验心得。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- android 控件 实验