资源描述
计算机学院实验中心----Android手机客户端
学生姓名:宋同煜 张宗森
指引教师:裴斐
专业:计算机科学与技术 102
在移动互联网发展迅猛今天,在Android完全开源及拥有庞大顾客群环境下,迫切需要为计算机学院实验中心网站开发Andriod手机客户端,以便计算机学院师生随时随处查看实验信息、登记实验等。
。
一、系统分析
需求分析
查询实验:教师及学生可以查询当周及上一周、下一周实验安排
登记实验:教师登录后可以登记实验
引言
为以便计算机学院教师及学生查询、登记实验,因而开发实验中心Android手机端软件
编写目
本文档对计算机学院实验中心网站手机客户端功能、顾客界面、运营环境等作出详细阐明。
项目背景
软件开发名称:计算机学院实验中心
项目需求单位:计算机学院全体师生
项目开发单位:宋同煜 张宗森
二、系统设计
系统目的
1.实现需求分析阶段所有功能
2.主界面清晰、简朴、操作易行
系统功能预览
该软件重要涉及查询、登录、登记实验3个功能模块,重要操作如下:
(1) 运营软件后,一方面检查网络连接与否正常,如果正常,获取当周实验安排信息,显示给顾客,效果如图
(2) 通过“菜单->登记实验”进入级别实验页面,规定输入顾客名密码才可继续
点击“登录实验” 后,提示登录后才干继续
(3)点击登录进入登录页面,如图
对的输入顾客名密码后点提交
(4)顾客名密码输入对的,就可以登记实验了,次页面包括实验名、课程名、班级、机房、第几大节、实验日期等信息填写,如图
(5)对的填写实验信息后,确认登记后点提交,返回登记成果
(6)登记成功后,重新打开软件即可看到刚才登记实验,如下图
(7)顾客登录后可保存、清除登录信息,不用每次使用都需要登录,并在软件主界面右上角显示当前顾客名,效果如下图:
清除登录信息:
点击后弹出操作成果
(8)通过菜单->上周、下周进行上下周跳转查询,
(9)检查更新、反馈等功能
软件每日启动都会检查与否存在新版本并提示顾客下载
反馈暂只通过短信方式反馈
(10)软件后台运营
因移动网络下蜗牛般网速,故提供后台运营功能,通过手机上返回键并没有真正退出而是后台运营了,对于手机网络较慢顾客(非Wifi下及3G顾客)是完全有必要,需要通过菜单里退出才干真正退出。
三、软件页头header某些设计
1.涉及软件名称,顾客登录状态,及提示信息
2.XML布局文献
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=""
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ff009de4"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="38.0dp"
android:background="#ff009de4" >
<ImageView …省略某些代码… />
<TextView …省略某些代码…/>
<TextView …省略某些代码…/>
<Button …省略某些代码… />
<ImageView …省略某些代码… />
</RelativeLayout>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#ff009de4" >
<TextView
…省略某些代码…
android:text="获取网络数据中..."
/>
--></RelativeLayout>
</LinearLayout>
四、软件主显示某些设计
1. 采用Viewpager+Listview 实现滑动显示周一到周日实验信息
2. 某些XML布局文献
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout …省略某些代码… >
<!--标题-->
<LinearLayout …省略某些代码… >
<include …省略某些代码…
layout="@layout/header"
/>
</LinearLayout>
<!--滑动-->
<LinearLayout …省略某些代码… >
<android.support.v4.view.ViewPager
…省略某些代码… >
<android.support.v4.view.PagerTitleStrip
…省略某些代码… />
</android.support.v4.view.ViewPager>
</LinearLayout>
<!--滑动结束-->
</LinearLayout>
五、主Activity设计Cslab_listviewActivity.java
1. onCreate()窗口生成函数
Android 软件运营后一方面运营主Activity,一种Activity代表一种窗口(一种类)软件登录及级别实验分别用一种Activity来解决。
每一种Activity均有onCreat()函数,用来生成窗口,本软件主Activity 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 Date(System.currentTimeMillis());//获取当前时间
String str = formatter.format(curDate);
String weeknumberString=weeknumber.format(curDate);
zhouji=weeknumberString;
time=timef.format(curDate);
3、检查网络状况,判断系统版本
initStrictMode();//判断系统版本,防止浮现NetworkOnMainThreadException 异常解决,
if (!CheckNetwork()) {
NetError();
return;
}
4.从服务器获取当前第几周 GetWeekNumber();保存到成员变量中。
采用多线程,避免ANR
Thread 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 experiment=WebServiceResult(NAMESPACE,"Experiment",1,new String[]{"weeknumber"},new String[]{week});
JSONObject JsonExperiment = new JSONObject(experiment);
ArrayExperiment=JsonExperiment.getJSONArray("ex");
6.显示实验信息public boolean showexperiment()
……………………
experimentlist1 = buildexperimentListForSimpleAdapter("星期一");//填充ListView数据
notes1 = 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 Thread() {
@Override
public void run() {
}};
Thnextweek.start();
nehandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
break;
}
}};
}
8.用变量记录程序运营时顾客上下周跳转导致周数变化,并用private void LoadExperiment() 显示实验信息
读取顾客保存账号信息private void getusernamefromsetting()
service = new PreferencesService(this);
Map<String,String> params = service.getUsername();
usernameString=params.get("username");
9.其她……………………………
六、登录模块设计loginActivity.java
1. 顾客名密码输入
EditText usernameEdit;
EditText passwordEdit;
2. 解决登录祈求,提交给Webservice服务器,并返回登录成果成功或失败private void login()
3.返回主界面
public class loginActivity extends Activity {
private PreferencesService service;
private static final String NAMESPACE = ""; //Webservice命名空间
private static String URL = ""; // WebService地址
String usernameString="";
String passwordString="";
EditText usernameEdit;
EditText passwordEdit;
Handler handler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
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 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(){
@Override
public void onClick(View arg0) {
// TODO 自动生成办法存根
省略代码
}
});
clear.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
清除账号信息,省略代码
}});
login_button.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
验证输入与否对的,省略代码
else login();
}
});
}
private void login() {
// TODO 自动生成办法存根
Thread t = new Thread() {
@Override
public void run() {
新线程 解决登录
}
};
t.start();// 启动线程
// 接受子线程消息
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
switch (msg.what) {
case 1:
解决登录成果,并提示顾客,省略代码
break;
}
}
};
}
//web服务调用函数
public String WebServiceResult(String ns,String method,int arg_number,String[] arg_name,String[] arg_value){
String re =arg_name[0]+arg_value[0];
try {
SoapObject rpc = new SoapObject(ns,method);
if (arg_number != 0)
{
for (int i=0;i<arg_number;i++)
rpc.addProperty(arg_name[i].toString(),arg_value[i].toString());
}
AndroidHttpTransport ht = new AndroidHttpTransport(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.getProperty(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 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="";
String 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;
private List<String> list = new ArrayList<String>();
private List<String> numberlist = new ArrayList<String>();
private ArrayAdapter<String> roomadapter;
private ArrayAdapter<String> numberadapter;
@Override
public void onCreate(Bundle savedInstanceState) {
checklogin();
Calendar c=Calendar.getInstance();
mYear=c.get(Calendar.YEAR);
mMonth=c.get(Calendar.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() 设立初始值与onDateChangeListener() */
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()来变化显示日期*/
time=""+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=(EditText)findViewById(R.id.editText_class);
experimentname.addTextChangedListener(new TextWatcher() {
………省略某些代码……………
});
coursename.addTextChangedListener(new TextWatcher() {
………省略某些代码……………
});
experimentclass.addTextChangedListener(new TextWatcher() {
………省略某些代码……………
});
numberlist.add("第一大节");
numberlist.add("第二大节");
numberlist.add("第三大节");
numberlist.add("第四大节");
numberlist.add("第五大节");
getTestRoom();
roomSpinner = (Spinner)findViewById(R.id.roomSpinner);
roomadapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,list);
//第三步:为适配器设立下拉列表下拉时菜单样式。
roomadapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//第四步:将适配器添加到下拉列表上
roomSpinner.setAdapter(roomadapter);
//第五步:为下拉列表设立各种事件响应,这个事响应菜单被选中
roomSpinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){
@SuppressWarnings("unchecked")
public void onItemSelected(AdapterView arg0,View arg1,int arg2,long arg3) {
………省略某些代码……………
});
numberadapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,numberlist);
………省略某些代码……………
Button button_cancel=(Button)findViewById(R.id.button_cancel);
button_cancel.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
Button button_save=(Button)findViewById(R.id.button_save);
button_save.setOnClickListener(new Button.OnClickListener() {
@Override
public 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.drawable.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();
}
});
}
private void getTestRoom() {
// TODO 获取机房信息
Thread roomExperiment = new Thread() {
@Override
public void run() {
多线程解决,避免ANR,………省略某些代码……………
}};
roomExperiment.start();
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
解决登记实验返回成果 ………省略某些代码……………
}
}};
}
private void checklogin() {
getusernamefromsetting();
// 检查与否登录
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("返
展开阅读全文