《Android应用开发基础教程》PPT 第8章_第1页
《Android应用开发基础教程》PPT 第8章_第2页
《Android应用开发基础教程》PPT 第8章_第3页
《Android应用开发基础教程》PPT 第8章_第4页
《Android应用开发基础教程》PPT 第8章_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章

教师课程管理教师课程管理8.1功能分析和设计8.2课程列表视图Adapter实现8.3Intent活动启动8.4广播事件8.1功能分析和设计

教师课程管理功能分析:教师查看所上课程的课程列表,对课程进行添加、删除、编辑以及学生管理。设计:欢迎界面点击“课程管理”,跳转到教师课程管理界面。8.1功能分析和设计

课程添加功能分析:教师登录系统,选择“课程管理”,点击“添加”按钮,填写课程信息进行课程添加。设计:点击课程添加按钮,填写课程信息,点击“完成”按钮,保存结果,点击完成,可出现课程添加成功提醒。8.1功能分析和设计

课程编辑功能分析:教师单击课程列表中的某一课程,查看课程详情,并可对课程信息进行修改。设计:点击某一课程,查看该课程详细信息,点击右上角的“功能”按钮,展开功能菜单,点击“编辑”,在“课程信息修改”页面中,教师可以对课程编号、名称进行修改,对于已有的上课时间和地点,也可以进行删除、修改、添加操作。8.1功能分析和设计

课程删除功能分析:教师可对该课程信息以及级联的学生信息进行删除。设计:教师单击课程列表中“删除”按钮,可对该课程信息以及级联的学生信息进行删除。8.1功能分析和设计

课程学生管理功能分析:学生添加,学生删除,学生清空设计:点击“功能”按钮后选中学生管理功能,即可显示该课程下所有学生的信息。学生信息可以添加,采用数据库直接导入方式,因此教师不用对其进行编辑;点击相应的删除按钮,能够对学生进行逐个删除;查看课程详情时,点击右上角的“功能”按钮后,选择“学生清空”,即可删除所有学生信息。8.2课程列表视图Adapter实现Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adapter。DataSourceAdapterCursorArrayListListView

Adapter8.2课程列表视图Adapter实现建立ListView

在显示课程信息的界面CourseActivity上建立一个ListView,本例采用直接建立ListView方式创建。为了能够对显示课程列表监听,首先需要对其指定id值。修改activity_course.xml文件,对ListView增加id值,显示的课程列表的id值为courselist。

制定课程列表ArrayAdapter<ListViewandroid:id="@+id/courseList" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/table_shape"android:layout_margin="15dip"></ListView>8.2课程列表视图Adapter实现创建课程名列表

首先应创建一个ListView以及名为listItems的list集合,继而从服务器端中获取到所需要的课程名,放入到courseNames的list空间内。

制定课程列表ArrayAdapter//创建一个ListView以及名为listItems的list集合ListViewview=(ListView)super.findViewById(R.id.courseList);listItems=newArrayList<Map<String,Object>>();

//从服务器端中获取到所需要的课程名,放入到list空间内for(inti=0;i<courseNames.size();i++){

Map<String,Object>listItem=newHashMap<String,Object>(); listItem.put("coursename",courseNames.get(i)); listItems.add(listItem);}8.2课程列表视图Adapter实现制定Adapter

需要一个连接ListView视图对象和数组数据的适配器来完成两者的适配工作,因而使用如下方法进行制定:

制定课程列表ArrayAdapter//制定Adapter,显示课程名称privateLayoutInflatermInflater;

publicMyAdapter(Contextcontext){this.mInflater=LayoutInflater.from(context);}convertView=mInflater.inflate(R.layout.adapter_course,null);ArrayAdapter(Context

context,

int

textViewResourceId,

List<T>

objects)

采用LayoutInflater对象制定Adapter:8.2课程列表视图Adapter实现绑定Adapter

利用setAdapter()方法将设置好的ArrayAdapter与Listview进行绑定,将课程信息显示出来。

使用Adapter绑定课程数据//Adapter与ListView进行绑定MyAdapteradapter=newMyAdapter(this);view.setAdapter(adapter);在WelcomeActivity界面跳转到CourseActivity界面后,即可显示教师授课列表。8.2课程列表视图Adapter实现显示课程信息

使用Adapter绑定课程数据//ListView监听函数,点击列表中的某项可进行一定操作privateclassMyListener2implementsOnClickListener{intmPosition;publicMyListener2(intinPosition){

mPosition=inPosition;

}

@Override

publicvoidonClick(Viewv){

//TODOAuto-generatedmethodstub//创建意图

Intentintent=newIntent(CourseActivity.this,CourseInfoActivity.class);

Bundlebundle=newBundle();

bundle.putInt("courseid",courseid_temp.get(mPosition));

//将课程ID作为额外参数传过去

intent.putExtras(bundle);

//页面跳转

startActivity(intent);

}}跳转到CourseInfoActivity界面,进行监听,并显示相应的课程信息。8.2课程列表视图Adapter实现

对课程列表Adapter的测试,制定好Adapter,并与ListView绑定好,之后输出一串字符,表示绑定成功,并可显示相关数据。

测试课程列表视图AdapterMyAdapteradapter=newMyAdapter(this);view.setAdapter(adapter);

System.out.println("Adapter已绑定课程数据,并显示相关内容");

课程列表视图Adapter执行成功,输出“Adapter已绑定课程数据,并显示相关内容”的字符串效果图如下所示:8.3Intent活动启动

Intent在Android里可以说是至关重要的,它承担着程序跳转和数据传递的重要使命。

那么为什么要使用Intent,好像利用startActivity(ClassactivityClass)更方便简洁呢。我们知道,在Android中除了活动(Activity)这一组件之外,还有广播(Boardcast),服务(Service)组件等,不管我们需要启动哪种组件,利用统一的Intent来封装启动的意图,不仅降低了组件耦合,也体现了Android的编程理念。同时,不同的Activity间也可以通过Intent来携带Bundle对象,实现数据的相互传递。简而言之,屏幕是通过Activity来实现,各个屏幕又相互独立,屏幕间通过Intent实现切换和信息传递。

本节主要介绍Intent启动活动(Activity)。让我们先来看Intent是如何启动Activity的。

Intent简介8.3Intent活动启动显式启动:必须在Intent中指明启动的Activity所在的类。在前面的例子中也不止一次地利用显式启动的方式启动特定的Activity。隐式启动:在程序中,有时我们并不指明特定的Activity去启动,而是让Android系统根据Intent的动作和数据来决定到底启动哪个Activity。比如最终用户的Activity,只需描述自己何时被执行,当我们启动的Activity信息与最终用户的Activity信息匹配,则最终用户的Activity启动,因此,是由Android系统和最终用户来选择。

Intent启动方式8.3Intent活动启动

Intent显式启动课程添加Activity添加显式启动按钮

本例需要先添加一个添加课程的按钮,利用该按钮实现Activity的显式启动。<Buttonandroid:id="@+id/add_btn"android:layout_width="40dp"android:layout_height="30dp"android:background="@drawable/top_btn_add"android:textColor="#fff"android:textSize="18sp"/>在WelcomeActivity界面跳转到CourseActivity界面后,即出现课程添加的按钮。8.3Intent活动启动

Intent显式启动课程添加ActivityIntent显式启动

如下即为显式启动的相关代码,Intent构造函数的第一个参数是应用程序的上下文,即CourseActivity的上下文,第二个参数是接收Intent的目标组件,CourseAddActivity。此后,启动Activity即可跳转到指定的Activity。button_add.setOnClickListener(newOnClickListener(){@Override

publicvoidonClick(Viewv){

//TODOAuto-generatedmethodstub//创建意图

Intenti=newIntent(CourseActivity.this,CourseAddActivity.class);//显式启动CourseAddActivity

CourseActivity.this.startActivity(i);

}

})8.3Intent活动启动

Intent显式启动课程添加Activity注册组件

CourseActivity和CourseAddActivity,必须到AndroidManifest.xml文件中注册。<!--利用<activity>标签定义两个Activity--><activity

android:name="com.coursemis.CourseActivity"android:label="@string/title_activity_course"></activity><activityandroid:name="com.coursemis.CourseAddActivity"

android:label="@string/title_activity_course_info"></activity>点击课程添加按钮,显式启动CourseAddActivity进行课程添加8.3Intent活动启动

Intent隐式启动ActivityIntent隐式启动

隐式启动不需要指定特定的Activity,而是设置Action、Data、Category,让系统来筛选出合适的Activity,使程序具有更大的灵活性,尤其是有利于第三方组件的使用。button_add.setOnClickListener(newOnClickListener(){

@Override

publicvoidonClick(Viewv){

//TODOAuto-generatedmethodstub//创建意图,设置Intent的Action属性StringactionName="com.coursemis.CourseAddActivity";

Intenti=newIntent(actionName);

//隐式启动CourseAddActivity

CourseActivity.this.startActivity(i);

}});8.3Intent活动启动

Intent隐式启动Activity注册声明

隐式调用不只是在AndroidManifest.xml文件中声明,还要加上intent-filter。首先被调用的Activity要有一个带有<intent-filter>并且包含<action>的Activity,设定它可以处理的Intent,并且category设为“ent.category.DEFAULT”。action的name是一个字符串,可以自定义,在这里设成“

com.coursemis.CourseAddActivity”,然后,在CourseActivity,才可以通过这个actionname找到所需的Activity。<!--利用<activity>和<intent-filter>标签定义隐式启动Activity--><activityandroid:name="com.coursemis.CourseAddActivity"android:label="@string/title_activity_course_add">

<intent-filter><actionandroid:name="com.coursemis.CourseAddActivity"/><categoryandroid:name="ent.category.DEFAULT"/></intent-filter></activity>8.3Intent活动启动

Android系统支持的常见动作字符串常量动作说明ACTION_ANSWER打开接听电话的Activity,默认为Android内置的拨号盘界面ACTION_CALL打开拨号盘界面并拨打电话,使用Uri中的数字部分作为电话号码ACTION_DELETE打开一个Activity,对所提供的数据进行删除操作ACTION_DIAL打开内置拨号盘界面,显示Uri中提供的电话号码ACTION_EDIT打开一个Activity,对所提供的数据进行编辑操作ACTION_INSERT打开一个Activity,在提供数据的当前位置插入新项ACTION_PICK启动一个子Activity,从提供的数据列表中选取一项ACTION_SEARCH启动一个Activity,执行搜索动作ACTION_SENDTO启动一个Activity,向数据提供的联系人发送信息ACTION_SEND启动一个可以发送数据的ActivityACTION_VIEW最常用的动作,对以Uri方式传送的数据,根据Uri协议部分以最佳方式启动相应的Activity进行处理。对于http:address将打开浏览器查看;对于tel:address将打开拨号呼叫指定的电话号码ACTION_WEB_SEARCH打开一个Activity,对提供的数据进行Web搜索我们也可以在自己的程序中调用其他程序的Action。8.3Intent活动启动

活动间数据传递Bundle在Activity间交换数据Intent提供了很多方法来传递数据,使用时,根据实际情况挑选适当的函数调用,就可以达到数据传递的目的了。传递数据携带包putExtras

(Bundledata):向Intent中放入所需要“携带”的数据包。putExtras(Bundledata)

:从Intent中取出所需要“携带”的数据包。存入数据到Bundle对象putXxx(Stringkey,Xxxdata):向Bundle放入例如int等数据类型的数据。putSerializable(Stringkey,Serializabledata):向Bundle放入一个可序列化的对象。从Bundle对象取出数据getXxx(Stringkey):从Bundle中取出例如int等数据类型的数据。getSerializable(Stringkey,Serializabledata):从Bundle取出一个可序列化的对象。8.3Intent活动启动

活动间数据传递Bundle中存入数据

创建一个Bundle对象,把增加的信息添加到指定的教师名下,利用putInt()方法向Bundle放入int类型的teacherid,继而使用putExtras()方法向Intent中放入所需要“携带”的数据包bundle。button_add.setOnClickListener(newOnClickListener(){

@Override

publicvoidonClick(Viewv){

//TODOAuto-generatedmethodstub

Intenti=newIntent(CourseActivity.this,CourseAddActivity.class);//创建Bundle对象

Bundlebundle=newBundle();//向Bundle对象放入需要传递的数据

bundle.putInt("teacherid",teacherid);

//将Bundle对象放入Intent

i.putExtras(bundle);

CourseActivity.this.startActivity(i);

}});8.3Intent活动启动

活动间数据传递取出数据

利用getIntent()方法检索项目中包含的原始Intent,利用getExtras()方法向Intent中取出所需要“携带”的数据包bundle,getInt()方法向Bundle取出int类型的tectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_course_add);

this.context=this; client=newAsyncHttpClient();

Intentintent=getIntent();

//取出放置在Bundle对象里的数据 teacherid=intent.getExtras().getInt("teacherid");……}8.3Intent活动启动

活动间数据传递获取Activity返回值

通常,当一个Activity启动另一个Activity,让用户对特定信息进行选择,在关闭这个Activity后,用户的选择信息需要返回给未关闭的那个Activity。我们将先启动的Activity称为父Activity,后启动的Activity称为子Activity。

针对这样的情况,一般按照如下步骤获取返回值:利用startActivityForResult()方法启动子Activity。设置子Activity的返回值在父Activity获取返回值。创建父Activity,启动子Activity

创建一个按钮time_course_button和一个文本框time_course_editText,点击按钮启动子Activity—CourseTimeActivity,文本框用来显示从子Activity中返回的数值。8.3Intent活动启动

活动间数据传递创建父Activity,启动子ActivitypublicclassCourseEditActivityextendsActivity{

privateButtontime_course_button;

privateEditTexttime_course_editText;

privateintCOURSETIME=0;

privateintweekday;

……

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_course_edit);

……

time_course_button=(Button)findViewById(R.id.time_course_button);

time_course_editText=(EditText)findViewById(R.id.time_course_editText);

(转下页)8.3Intent活动启动

活动间数据传递创建父Activity,启动子Activity(j接上页)

time_course_button.setOnClickListener(newOnClickListener(){

@Override

publicvoidonClick(Viewv){

//创建对应于目标Activity的Intent

Intentintent=getIntent();

intent.setClass(CourseEditActivity.this,CourseTimeActivity.class);

//启动Activity,并可返回结果,COURSETIME为请求码 CourseEditActivity.this.startActivityForResult(intent,COURSETIME); }

});……}8.3Intent活动启动

活动间数据传递等待Activity数据传输

当CourseTimeActivity启动后,作为父Activity的CourseEditActivity需要等待其传回结果,由于何时传回结果具有不确定性,我们重写了onActivityResult()方法,处理子Activity的返回值。当子Activity关闭时,父Activity的onActivityResult()方法就被开始调用。@OverridepublicvoidonActivityResult(intrequestCode,intresultCode,Intentintent){//当请求码为COURSETIME,结果码为Activity.RESULT_OK,进行一定处理

if(requestCode==COURSETIME&&resultCode==Activity.RESULT_OK){

//取出放置在Bundle对象里的数据Bundlebundle=intent.getExtras();

StringresultTime=bundle.getString("time_1");

weekday=bundle.getInt("weekday_1");

//修改文本框里面的数据

time_course_editText.setText(resultTime);

}}8.3Intent活动启动

活动间数据传递Activity间数据传输

程序为列表设置了监听器,用户单击选项后,将值返回给父Activity,并结束当前Activity。publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intarg2,longarg3){

//TODOAuto-generatedmethodstub

//创建对应于目标Activity的Intent

Intentintent=newIntent(CourseTimeActivity.this,CourseEditActivity.class);

//向Bundle对象放入需要传递的数据

Bundlebundle=newBundle();

bundle.putString("time_1",arg0.getItemAtPosition(arg2).toString());

bundle.putInt("weekday_1",arg2+1);

intent.putExtras(bundle);

//设置结果码,并设置结束后退回的Activity

CourseTimeActivity.this.setResult(RESULT_OK,intent);

//结束当前Activity

CourseTimeActivity.this.finish();}8.3Intent活动启动

测试Intent活动启动测试Intent显式启动

我们在Intent显式启动的函数中,加入输出字符串的代码。在执行该方法时,Activity显式启动后,页面发生跳转,并且可以输出该字符串,说明执行该方法成功。button_add.setOnClickListener(newOnClickListener(){

@Override

publicvoidonClick(Viewv){

//TODOAuto-generatedmethodstub

Intenti=newIntent(CourseActivity.this,CourseAddActivity.class);

……

System.out.println("已显式启动CourseAddActivity");}});

显式启动方法执行成功,输出“已显式启动CourseAddActivity”的字符串效果图8.3Intent活动启动

测试Intent活动启动测试Intent隐式启动

在Intent隐式启动的函数中,加入输出字符串的代码。在执行该方法时,Activity隐式启动后,页面发生跳转,并且可以输出该字符串,说明执行该方法成功。button_add.setOnClickListener(newOnClickListener(){

@Override

publicvoidonClick(Viewv){

//TODOAuto-generatedmethodstub

StringactionName="com.coursemis.CourseAddActivity";

……

System.out.println("已隐式启动CourseAddActivity");

}});

隐式启动方法执行成功,输出“已隐式启动CourseAddActivity”的字符串效果图8.3Intent活动启动

测试Intent活动启动测试Bundle在Activity间的数据交换

从CourseActivity通过点击add按钮跳转到CourseAddActivity界面,为了将课程添加到该教师名下,需要传递教师id。我们可以通过比较传入前与接收后的数据是否相同来判断数据是够传输成功。

button_add.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){

……//测试发送到下层Activity的数据

System.out.println("发送:teacherid="+teacherid); System.out.println("已显式启动CourseAddActivity"); }});teacherid=preferences.getInt("teacherid",0);//测试下层Activity接收到的数据System.out.println("接收:teacherid="+teacherid);8.3Intent活动启动

测试Intent活动启动测试Activity的返回值

listView_coursetimeList.setOnItemClickListener(newOnItemClickListener(){@OverridepublicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intarg2,longarg3){//TODOAuto-generatedmethodstub

Intentintent=newIntent(CourseTimeActivity.this,CourseEditActivity.class);

Bundlebundle=newBundle();

//测试发送到上层Activity的数据

System.out.println(arg0.getItemAtPosition(arg2).toString());

……

}});publicvoidonActivityResult(intrequestCode,intresultCode,Intentintent){

if(requestCode==COURSETIME&&resultCode==Activity.RESULT_OK){

……

System.out.println(resultTime);

time_course_editText.setText(resultTime);}}8.4

广播事件

广播,第一时间就会想到电台的广播,可以播放各种消息。其实,Android的广播就是具备这样的功能。

广播BoardcastReceiver作为Android四大组件之一,其本质就是一个全局监听器,用来监听系统的全局广播。广播消息的内容多种多样,可以是与应用程序密切相关的数据信息,也可以是Android的系统信息,例如网络连接变化、电池电量变化、接收到短信和系统设置变化等等,系统根据自身需要,选择不同的广播。

广播简介8.4

广播事件

实现BoardcastReceiver实现广播的步骤与注意事项

启动BoardcastReceiver的方法和启动Activity的方法相同,如下是启动BoardcastReceiver的步骤:构造需要启动BoardcastReceiver的Intent调用sendBoardcast()方法来启动指定的BoardcastReceiver

实现BoardcastReceiver也非常简单,重写BoardcastReceiver的onReceive()方法即可。由于BoardcastReceiver的作用是监听系统的全局消息,因此,当广播的消息被接受后,系统就会认定该对象已经不再是一个活动的对象了,便结束了它的生命周期。因此,在BoardcastReceiver中尽量不要处理太多逻辑问题,建议复杂的逻辑交给Activity或者Service去处理。8.4

广播事件

实现BoardcastReceiver创建广播

创建一个Intent对象,接下来,设置Intent的Action属性,实现广播操作,最后调用sendBroadcast()函数,就可把Intent携带的消息广播出去。因为要在Intent传递额外数据,可以用Intent的putExtra()方法。voidbroadcast(){//创建Intent对象

Intentintent=newIntent(); //设置Intent的Action属性

intent.setAction("com.coursemis.action.BROAD_ACTION"); intent.putExtra("msg","您有一些课程还没有学生!!!"); //发送广播

sendBroadcast(intent);}8.4

广播事件

实现BoardcastReceiver广播调用

启动广播的代码完成了,那么便需要考虑调用广播的位置和条件。client.post(HttpUtil.server_course_teacher,params,

newJsonHttpResponseHandler(){

@Override

publicvoidonSuccess(intarg0,JSONObjectarg1){

//TODOAuto-generatedmethodstub

……

//判断是否从服务器端传来Flag_Empty_Student的标志,如果有,就把该可课程的id放入courseid_empty_student

if(object.optBoolean("Flag_Empty_Student")){ courseid_empty_student.add(object.optInt("CId"));

}

……//如果courseid_empty_student容量不为0,则发送广播

if(courseid_empty_student.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论