1、计算机学院实验中心-Android手机客户端学生姓名:宋同煜 张宗森 指引教师:裴斐 专业:计算机科学与技术 102在移动互联网发展迅猛今天,在Android完全开源及拥有庞大顾客群环境下,迫切需要为计算机学院实验中心网站开发Andriod手机客户端,以便计算机学院师生随时随处查看实验信息、登记实验等。一、系统分析需求分析查询实验:教师及学生可以查询当周及上一周、下一周实验安排登记实验:教师登录后可以登记实验引言为以便计算机学院教师及学生查询、登记实验,因而开发实验中心Android手机端软件编写目 本文档对计算机学院实验中心网站手机客户端功能、顾客界面、运营环境等作出详细阐明。项目背景软件开
2、发名称:计算机学院实验中心项目需求单位:计算机学院全体师生项目开发单位:宋同煜 张宗森二、系统设计系统目的1.实现需求分析阶段所有功能2.主界面清晰、简朴、操作易行系统功能预览该软件重要涉及查询、登录、登记实验3个功能模块,重要操作如下:(1) 运营软件后,一方面检查网络连接与否正常,如果正常,获取当周实验安排信息,显示给顾客,效果如图(2) 通过“菜单-登记实验”进入级别实验页面,规定输入顾客名密码才可继续点击“登录实验” 后,提示登录后才干继续(3)点击登录进入登录页面,如图对的输入顾客名密码后点提交(4)顾客名密码输入对的,就可以登记实验了,次页面包括实验名、课程名、班级、机房、第几大节
3、、实验日期等信息填写,如图 (5)对的填写实验信息后,确认登记后点提交,返回登记成果(6)登记成功后,重新打开软件即可看到刚才登记实验,如下图(7)顾客登录后可保存、清除登录信息,不用每次使用都需要登录,并在软件主界面右上角显示当前顾客名,效果如下图:清除登录信息:点击后弹出操作成果(8)通过菜单-上周、下周进行上下周跳转查询,(9)检查更新、反馈等功能软件每日启动都会检查与否存在新版本并提示顾客下载反馈暂只通过短信方式反馈(10)软件后台运营因移动网络下蜗牛般网速,故提供后台运营功能,通过手机上返回键并没有真正退出而是后台运营了,对于手机网络较慢顾客(非Wifi下及3G顾客)是完全有必要,需
4、要通过菜单里退出才干真正退出。三、软件页头header某些设计1.涉及软件名称,顾客登录状态,及提示信息2.XML布局文献 -四、软件主显示某些设计1. 采用Viewpager+Listview 实现滑动显示周一到周日实验信息2. 某些XML布局文献 五、主Activity设计Cslab_listviewActivity.java1. onCreate()窗口生成函数Android 软件运营后一方面运营主Activity,一种Activity代表一种窗口(一种类)软件登录及级别实验分别用一种Activity来解决。每一种Activity均有onCreat()函数,用来生成窗口,本软件主Acti
5、vity Cslab_listviewActivity.javaoncreatr()函数设计1、设立布局文献 setContentView(R.layout.main);2、获取系统日期时间 SimpleDateFormat formatter = new SimpleDateFormat (yyyy-MM-dd); SimpleDateFormat timef = new SimpleDateFormat (yyyy年MM月dd日); SimpleDateFormat weeknumber = new SimpleDateFormat (EEE); Date curDate = new Da
6、te(System.currentTimeMillis();/获取当前时间 String str = formatter.format(curDate); String weeknumberString=weeknumber.format(curDate); zhouji=weeknumberString; time=timef.format(curDate); 3、检查网络状况,判断系统版本 initStrictMode();/判断系统版本,防止浮现NetworkOnMainThreadException 异常解决, if (!CheckNetwork() NetError(); retur
7、n; 4.从服务器获取当前第几周 GetWeekNumber();保存到成员变量中。采用多线程,避免ANRThread t = new Thread() Override public void run() 省略某些代码 ; t.start(); /接受子线程消息 handler = new Handler() Override public void handleMessage(Message msg) case 2:省略某些代码 break; ;5.依照周数获取实验信息private void getExperiment(final String week)并保存String experi
8、ment=WebServiceResult(NAMESPACE,Experiment,1,new Stringweeknumber,new Stringweek);JSONObject JsonExperiment = new JSONObject(experiment); ArrayExperiment=JsonExperiment.getJSONArray(ex);6.显示实验信息public boolean showexperiment()experimentlist1 = buildexperimentListForSimpleAdapter(星期一);/填充ListView数据 no
9、tes1 = new MyAdapter(this,experimentlist1,R.layout.experimentinfo, new String section,experiment,new int R.id.section, R.id.experimentinfo); mListView1.setAdapter(notes1); mViews.add(mListView1);7.显示本周实验信息private void LoadThisweekExperiment()private void LoadExperiment() Thread Thnextweek = new Thre
10、ad() Overridepublic void run() ;Thnextweek.start();nehandler = new Handler() Overridepublic void handleMessage(Message msg) switch (msg.what) case 1: break; ;8.用变量记录程序运营时顾客上下周跳转导致周数变化,并用private void LoadExperiment() 显示实验信息读取顾客保存账号信息private void getusernamefromsetting() service = new PreferencesServi
11、ce(this); Map params = service.getUsername(); usernameString=params.get(username);9.其她六、登录模块设计loginActivity.java1. 顾客名密码输入EditText usernameEdit;EditText passwordEdit;2. 解决登录祈求,提交给Webservice服务器,并返回登录成果成功或失败private void login()3.返回主界面public class loginActivity extends Activity private PreferencesServi
12、ce service; private static final String NAMESPACE = ; /Webservice命名空间private static String URL = ; / WebService地址String usernameString=;String passwordString=;EditText usernameEdit;EditText passwordEdit;Handler handler; Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInst
13、anceState); setContentView(R.layout.login); getusernamefromsetting(); usernameEdit=(EditText)findViewById(R.id.username_edit); passwordEdit=(EditText)findViewById(R.id.password_edit); usernameEdit.setText(usernameString); passwordEdit.setText(passwordString); usernameEdit.addTextChangedListener(new
14、TextWatcher() 省略代码); passwordEdit.addTextChangedListener(new TextWatcher() 省略代码); Button login_button=(Button)findViewById(R.id.signin_button); Button clear=(Button)findViewById(R.id.clear); Button Button01=(Button)findViewById(R.id.Button01); Button01.setOnClickListener(new Button.OnClickListener()
15、Overridepublic void onClick(View arg0) / TODO 自动生成办法存根省略代码 ); clear.setOnClickListener(new Button.OnClickListener() Overridepublic void onClick(View v) 清除账号信息,省略代码); login_button.setOnClickListener(new Button.OnClickListener() Overridepublic void onClick(View v) 验证输入与否对的,省略代码else login();); private
16、void login() / TODO 自动生成办法存根Thread t = new Thread() Overridepublic void run() 新线程 解决登录;t.start();/ 启动线程/ 接受子线程消息handler = new Handler() Overridepublic void handleMessage(Message msg) / TODO Auto-generated method stubswitch (msg.what) case 1: 解决登录成果,并提示顾客,省略代码break;/web服务调用函数public String WebServiceR
17、esult(String ns,String method,int arg_number,String arg_name,String arg_value)String re =arg_name0+arg_value0;try SoapObject rpc = new SoapObject(ns,method);if (arg_number != 0)for (int i=0;iarg_number;i+)rpc.addProperty(arg_namei.toString(),arg_valuei.toString();AndroidHttpTransport ht = new Androi
18、dHttpTransport(URL);ht.debug = true;SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);envelope.bodyOut = rpc;envelope.dotNet = true;envelope.setOutputSoapObject(rpc);ht.call(ns + method,envelope);SoapObject result = (SoapObject) envelope.bodyIn;re = result.getPro
19、perty(0).toString(); catch (Exception e) e.printStackTrace();return re;七、登记实验模块设计:1. 检查顾客与否登录,若登陆继续,否则返回private void checklogin() 2. 文本输入框(EditView)、列表选取框(spanner)、日期控件设立3. 从服务器获取机房信息private void getTestRoom() 4. 提交实验信息并返回解决成果给顾客 private void subExperiment()5. 返回主界面public class addexperiment extends
20、 Activity private static final String NAMESPACE = ; /Webservice命名空间private static String URL = ; / WebService地址Handler handler;private int mYear; private int mMonth;private int mDay; DatePicker dp;String username=;String password=;String room=;String time=;String name=客户端测试;String numberstring=;Stri
21、ng teacher=test;String classString=计科101;String coursenameString=客户端测试;EditText experimentname;EditText experimentteacher;EditText experimentclass;EditText coursename;Spinner number; private PreferencesService service; String usernameString=; String passwordString=; private Spinner roomSpinner; priv
22、ate List list = new ArrayList(); private List numberlist = new ArrayList(); private ArrayAdapter roomadapter; private ArrayAdapter numberadapter; Overridepublic void onCreate(Bundle savedInstanceState) checklogin(); Calendar c=Calendar.getInstance(); mYear=c.get(Calendar.YEAR); mMonth=c.get(Calendar
23、.MONTH); mDay=c.get(Calendar.DAY_OF_MONTH); time=+mYear+-+(mMonth+1)+-+mDay; super.onCreate(savedInstanceState); setContentView(R.layout.editcourse); /*获得TextView对象,并调用updateDisplay()来设立显示初始日期时间*/ /tv= (TextView) findViewById(R.id.showTime); /updateDisplay(); /*获得DatePicker对象,以init() 设立初始值与onDateCha
24、ngeListener() */ dp=(DatePicker)findViewById(R.id.dPicker); dp.init(mYear,mMonth,mDay,new DatePicker.OnDateChangedListener() Override public void onDateChanged(DatePicker view,int year,int monthOfYear,int dayOfMonth) mYear=year; mMonth= monthOfYear+1; mDay=dayOfMonth; /*调用updateDisplay()来变化显示日期*/ ti
25、me=+mYear+-+mMonth+-+mDay;/updateDisplay(); ); experimentname=(EditText)findViewById(R.id.experimentname); coursename=(EditText)findViewById(R.id.coursename); number = (Spinner)findViewById(R.id.Spinner_number); experimentteacher=(EditText)findViewById(R.id.editText_teacher); experimentclass=(EditTe
26、xt)findViewById(R.id.editText_class); experimentname.addTextChangedListener(new TextWatcher() 省略某些代码); coursename.addTextChangedListener(new TextWatcher() 省略某些代码); experimentclass.addTextChangedListener(new TextWatcher() 省略某些代码); numberlist.add(第一大节); numberlist.add(第二大节); numberlist.add(第三大节); numb
27、erlist.add(第四大节); numberlist.add(第五大节); getTestRoom(); roomSpinner = (Spinner)findViewById(R.id.roomSpinner); roomadapter = new ArrayAdapter(this,android.R.layout.simple_spinner_item,list); /第三步:为适配器设立下拉列表下拉时菜单样式。 roomadapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); /第
28、四步:将适配器添加到下拉列表上 roomSpinner.setAdapter(roomadapter); /第五步:为下拉列表设立各种事件响应,这个事响应菜单被选中 roomSpinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() SuppressWarnings(unchecked) public void onItemSelected(AdapterView arg0,View arg1,int arg2,long arg3) 省略某些代码 ); numberadapter = new ArrayAdapt
29、er(this,android.R.layout.simple_spinner_item,numberlist); 省略某些代码 Button button_cancel=(Button)findViewById(R.id.button_cancel); button_cancel.setOnClickListener(new Button.OnClickListener() Overridepublic void onClick(View v) finish();); Button button_save=(Button)findViewById(R.id.button_save); but
30、ton_save.setOnClickListener(new Button.OnClickListener() Overridepublic void onClick(View v) new AlertDialog.Builder(addexperiment.this) .setTitle(确认登记) .setMessage(时间:+time+n+节次:+numberstring+n+ 课程名:+name+n+ 实验名:+coursenameString+n+ 教师:+teacher+n+ 机房:+room+n+ 班级:+classString ) .setIcon(android.R.dr
31、awable.ic_dialog_info) .setPositiveButton(拟定,new DialogInterface.OnClickListener()public void onClick(DialogInterface dialog,int whichButton)/ 编写解决提交实验代码) .setNegativeButton(取消,new DialogInterface.OnClickListener()public void onClick(DialogInterface dialog,int whichButton)finish();/ 取消 ) .show(););
32、private void getTestRoom() / TODO 获取机房信息 Thread roomExperiment = new Thread() Overridepublic void run() 多线程解决,避免ANR,省略某些代码;roomExperiment.start();handler = new Handler() Overridepublic void handleMessage(Message msg) switch (msg.what) case 1: 解决登记实验返回成果省略某些代码 ; private void checklogin() getusernamef
33、romsetting(); / 检查与否登录 if(usernameString.isEmpty() new AlertDialog.Builder(addexperiment.this) .setTitle(提示) .setMessage(请登陆,再继续! ) .setIcon(android.R.drawable.ic_dialog_info) .setPositiveButton(登录,new DialogInterface.OnClickListener()public void onClick(DialogInterface dialog,int whichButton) finish(); Intent loginIntent=new Intent(); loginIntent.setClass(addexperiment.this,loginActivity.class); startActivity(loginIntent);/finish();/ 编写解决shi代码).setNegativeButton(返