目 录
1.概述............................................................................................. 1
2.项目设计与实现........................................................................ 1
2.1欢迎界面.................................................................................. 1
2.1.1界面布局..................................................................................................... 1
2.1.2功能实现..................................................................................................... 2
2.2登陆界面.................................................................................. 2
2.2.1 界面布局.................................................................................................... 2
2.2.2 功能实现.................................................................................................... 2
2.3微信显示界面.......................................................................... 4
2.3.1 界面布局.................................................................................................... 4
2.3.2功能实现..................................................................................................... 4
2.4主界面...................................................................................... 5
2.4.1 界面布局.................................................................................................... 5
2.4.2 功能实现.................................................................................................... 5
3.参考文献........................................................................................ 5
4.致谢................................................................................................ 6
1.概述
移动互联网时代的来临,直接促进了搭载智能操作系统、具有强大扩展性的智能手机、平板电脑等移动终端产业的蓬勃发展。搭载安卓操作系统的智能手机目前已经成为市场上最炙手可热的智能产品。开放的源代码和零成本已经让安卓在全世界范围内受到青睐并迅速获得了主要手机厂商和数百万软件开发者的支持,20##年安卓系统的市场份额已经超过 Symbian,成为全球第一大智能手机操作系统。
本项目基于QQ和微信等聊天工具,仿制其功能初步实现了登录界面和主界面的简单设置,剩余的功能我会在以后更加努力实现。
2.项目设计与实现
2.1欢迎界面
图1 欢迎界面
2.1.1界面布局
整体采用相对布局,下面为一个线性布局,其中包括一个ImageViewTextView,最下面仍是一个线性布局,包括两个Button和两个TextView。
2.1.2功能实现
欢迎界面由按钮和图片等构成,启动该客户端时,首先进入该界面。在欢迎界面点击登录按钮可通过QQ号或微信号登录,点击注册按钮,可在联网的情况下注册微信号。
2.2登陆界面
图2 登录界面
2.2.1 界面布局
整体采用RelativeLayout相对布局,下面仍为一相对布局,其中包括一个Buttton 和一个TextView.紧邻为两个EditText,最下面为相对布局,包括两个Button。
2.2.2 功能实现
使用UserEdit.getText().toString().trim() 和 PasswordEdit.getText().
toString().trim()方法得到用户输入的用户名和密码。点击登录按钮,开始登录。
图3 输入用户名和密码 图4 正在登陆
图5 输入有误 图6 登陆成功
2.3微信显示界面
图7 图片展示 图8 图片展示
图9 图片展示 图10 图片展示
2.3.1 界面布局
通过线性布局,其中分布着一个TextView和一个imageview。
2.3.2功能实现
通过图片浏览可以简略的了解微信的多种功能,如:视频聊天,语音聊天,认识附近的朋友等等。
2.4主界面
图11 朋友们 图12 设置
2.4.1 界面布局
页面整体采用相对布局,下面为两个大的线性布局,并由按钮、TextView和ImageView构成。
2.4.2 功能实现
页面是Android的主界面,可通过点击不同的选项,如点击“微信”按钮,则进入聊天窗口,也可以点击“朋友们”按钮来添加好友或通过“摇一摇”来查看附近的人而认识更多的朋友,等等。
3.参考文献
[1]李刚.疯狂Android讲义.北京:电子工业出版社,2013.
[2]杨丰盛.Android应用开发揭秘.北京:机械工业出版社,2010.1.
4.致谢
首先得由衷感谢高凯老师的悉心教导与指引,没有老师的教导与指引是不可能了解到Android的魅力,更无法完成此次课程设计。也感谢在这次课程设计中一直帮助我的同学们,由于我是中途选课,没有跟上很多内容,但是在他们的帮助下,我在学习android的路上减少了很多困难。我以后会更加的努力学习,做出更好的作品。
第二篇:Android课程设计报告模板
移动互联网开发
课程设计报告
学生姓名: 万思 学 号: k081241139
专 业: 计算机科学与技术班 级: k0312415
设计题目: 口袋微博
学年学期: 2014 年 秋 季学期
指导教师: 张华
目 录 (示例)
一、 设计题目................................................................................................................................... 1
二、 设计目的................................................................................................................................... 1
三、 设计原理及方案....................................................................................................................... 1
1 使用的软件工具和环境........................................................................................................... 1
2 需求分析与概要设计............................................................................................................... 1
3 数据库设计(若有)............................................................................................................... 1
4 详细设计和关键问题............................................................................................................... 1
四、 实现效果................................................................................................................................... 1
五、 设计体会................................................................................................................................... 1
参 考 文 献............................................................................................................................................ 3
一、 设计题目
Android社交分享平台——口袋微博 设计目的
二、 设计原理及方案
首先要实现以下这些功能:
Android端登录和注册模块的实现
Android端个人中心模块的实现
Android端快速发布模块的实现
Android端查看联系人模块的实现
Android端管理日志模块的实现
Android端管理相册模块的实现
1 使用的软件工具和环境
1)PC计算机
2)JDK安装包
3)Eclipse安装包
4)Android SDK安装包
5)ADT插件
2 需求分析与概要设计
(详细描述系统的功能需求)
Android端登录和注册模块的实现
Android端个人中心模块的实现
Android端快速发布模块的实现
Android端查看联系人模块的实现
Android端管理日志模块的实现
Android端管理相册模块的实现
(详细描述系统结构;例如总体架构设计、流程图、用例图等,并分别描述)
说明:这里的用例图和类图的对应关系可以在下面的E-R图上找到,这里我就略了一下。
Android端总体架
Web端的原理示意图
数据库设计(若有的必须给出,没有的给出其他重要设计过程)
(给出ER关系图及数据库表)
用powerdesigner设计对应关系,并生成表,E-R图
3 详细设计和关键问题
(分功能模块描述设计细节,例如详细功能图、类图和关键流程图等。遇到的关键Android问题是如何解决的)
相册列表:功能图
查看
修改权限
二、快速发布:
三、 实现效果
(包括系统描述和程序运行界面的截图) 1.口袋微博用户登录界面
2.口袋微博个人中心——快速发布功能界面
3.口袋微博个人中心——我的好友功能界面
4.口袋微博个人中心——最近访客功能界面
5.口袋微博个人中心——日志列表功能界面
6.口袋微博个人中心——相册列表功能界面
7.口袋微博——搜索好友界面
以下是部分重要代码由于代码太多无法容纳
(1)LoginActivity.java登录界面
package wyf.wpf;
import static wyf.wpf.ConstantUtil.SERVER_ADDRESS;
import static wyf.wpf.ConstantUtil.SERVER_PORT;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Looper;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;
public class LoginActivity extends Activity {
MyConnector mc = null;
ProgressDialog pd;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
checkIfRemember();
Button btnLogin = (Button)findViewById(R.id.btnLogin);
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pd = ProgressDialog.show(LoginActivity.this, "请稍候", "正在连接服务器...", true, true);
login();
}
});
Button btnReg = (Button)findViewById(R.id.btnReg);
btnReg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(LoginActivity.this, wyf.wpf.RegActivity.class);
startActivity(intent);
finish();
}
});
ImageButton ibExit = (ImageButton)findViewById(R.id.ibExit);
ibExit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
android.os.Process.killProcess(android.os.Process.myPid()); //结束进程,退出程序
}
});
}
//方法:连接服务器进行登录
public void login(){
new Thread(){
public void run(){
Looper.prepare();
try{
if(mc == null){
mc = new MyConnector(SERVER_ADDRESS, SERVER_PORT);
}
EditText etUid = (EditText)findViewById(R.id.etUid); //获得帐号EditText
EditText etPwd = (EditText)findViewById(R.id.etPwd); //获得密码EditText
String uid = etUid.getEditableText().toString().trim(); //获得输入的帐号
String pwd = etPwd.getEditableText().toString().trim(); //获得输入的密码
if(uid.equals("") || pwd.equals("")){ //判断输入是否为空
Toast.makeText(LoginActivity.this, "请输入帐号或密码!", Toast.LENGTH_SHORT).show();//输出提示消息
return;
}
String msg = "<#LOGIN#>"+uid+"|"+pwd; //组织要返回的字符串
mc.dout.writeUTF(msg); //发出消息
String receivedMsg = mc.din.readUTF(); //读取服务器发来的消息
pd.dismiss();
if(receivedMsg.startsWith("<#LOGIN_SUCCESS#>")){ //收到的消息为登录成功消息
receivedMsg = receivedMsg.substring(17);
String [] sa = receivedMsg.split("\\|");
CheckBox cb = (CheckBox)findViewById(R.id.cbRemember); //获得CheckBox对象
if(cb.isChecked()){
rememberMe(uid,pwd);
}
//转到功能面板
Intent intent = new Intent(LoginActivity.this,FunctionTabActivity.class);
intent.putExtra("uno", sa[0]);
startActivity(intent); //启动功能Activity
finish();
}
else if(msg.startsWith("<#LOGIN_FAIL#>")){ //收到的消息为登录失败
Toast.makeText(LoginActivity.this, msg.substring(14), Toast.LENGTH_LONG).show();
Looper.loop();
Looper.myLooper().quit();
}
}catch(Exception e){
e.printStackTrace();
}
}
}.start();
}
//方法:将用户的id和密码存入Preferences
public void rememberMe(String uid,String pwd){
SharedPreferences sp = getPreferences(MODE_PRIVATE); //获得Preferences
SharedPreferences.Editor editor = sp.edit(); //获得Editor
editor.putString("uid", uid); //将用户名存入Preferences
editor.putString("pwd", pwd); //将密码存入Preferences
editor.commit();
}
//方法:从Preferences中读取用户名和密码
public void checkIfRemember(){
SharedPreferences sp = getPreferences(MODE_PRIVATE); //获得Preferences
String uid = sp.getString("uid", null);
String pwd = sp.getString("pwd", null);
if(uid != null && pwd!= null){
EditText etUid = (EditText)findViewById(R.id.etUid);
EditText etPwd = (EditText)findViewById(R.id.etPwd);
CheckBox cbRemember = (CheckBox)findViewById(R.id.cbRemember);
etUid.setText(uid);
etPwd.setText(pwd);
cbRemember.setChecked(true);
}
}
@Override
protected void onDestroy() {
if(mc != null){
mc.sayBye();
}
super.onDestroy();
}
}
(2)DirayActivity.java
package wyf.wpf;
import static wyf.wpf.ConstantUtil.SERVER_ADDRESS;
import static wyf.wpf.ConstantUtil.SERVER_PORT;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
public class DiaryActivity extends Activity{
ArrayList<String []> diaryList = new ArrayList<String []>();
MyConnector mc = null;
String uno = null;
String visitor = null;
BaseAdapter ba = new BaseAdapter() {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LinearLayout ll = new LinearLayout(DiaryActivity.this);
TextView tvTitle = new TextView(DiaryActivity.this);
ll.setOrientation(LinearLayout.VERTICAL);
tvTitle.setTextAppearance(DiaryActivity.this, R.style.title);
tvTitle.setGravity(Gravity.LEFT); //设置TextView的对齐方式
tvTitle.setText(diaryList.get(position)[1]);
TextView tvContent = new TextView(DiaryActivity.this);
tvContent.setTextAppearance(DiaryActivity.this, R.style.content); //设置字体大小
tvContent.setGravity(Gravity.LEFT); //设置TextView的对齐方式
tvContent.setText(diaryList.get(position)[2]); //设置显示的内容
ll.addView(tvTitle);
ll.addView(tvContent);
return ll;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public Object getItem(int arg0) {
return null;
}
@Override
public int getCount() {
return diaryList.size();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
uno = intent.getStringExtra("uno"); //获得主人ID
visitor = intent.getStringExtra("visitor"); //获得访客ID
getDiaryList();
setContentView(R.layout.diary);
ListView lvDiary = (ListView)findViewById(R.id.lvDiary); //获得ListView对象
lvDiary.setAdapter(ba);
lvDiary.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position,
long id) {
Intent intent = new Intent(DiaryActivity.this,CommentActivity.class);
intent.putExtra("rid", diaryList.get(position)[0]);
intent.putExtra("uno", uno);
intent.putExtra("visitor", visitor);
startActivity(intent);
}
});
}
//方法:获取日志列表
public void getDiaryList(){
new Thread(){
public void run(){
try{
mc = new MyConnector(SERVER_ADDRESS, SERVER_PORT);
mc.dout.writeUTF("<#GET_DIARY#>"+uno+"|"+"1");
int size = mc.din.readInt(); //读取日志的长度
for(int i=0;i<size;i++){ //循环接受日志信息
String diaryInfo = mc.din.readUTF(); //读取日志信息
String [] sa = diaryInfo.split("\\|");
diaryList.add(sa); //将日志信息添加到列表中
}
}catch(Exception e){
e.printStackTrace();
}
}
}.start();
}
@Override
protected void onDestroy() {
if(mc != null){
mc.sayBye();
mc = null;
}
super.onDestroy();
}
}
(3)口袋微博_____个人中心PublishActivity.java
package wyf.wpf;
import static wyf.wpf.ConstantUtil.*;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Looper;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
public class PublishActivity extends Activity{
String [] items = { //存放ListView中的选项内容
"更新心情","发布日志","拍照上传"
};
int [] imgIds = {
R.drawable.p_status,
R.drawable.p_diary,
R.drawable.p_shoot
};
String uno = null; //存放
MyConnector mc = null; //MyConnector对象引用
ProgressDialog pd = null; //ProgressDialog对象引用
View dialog_view = null; //心情
BaseAdapter ba = new BaseAdapter() {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LinearLayout ll = new LinearLayout(PublishActivity.this);
ll.setOrientation(LinearLayout.HORIZONTAL);
ll.setGravity(Gravity.CENTER);
ImageView iv = new ImageView(PublishActivity.this); //创建ImageView对象
iv.setAdjustViewBounds(true);
iv.setImageResource(imgIds[position]); //设置ImageView的
ll.addView(iv); //将ImageView添加到线性布局中
TextView tv = new TextView(PublishActivity.this);
tv.setPadding(10, 0, 0, 0);
tv.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
tv.setTextAppearance(PublishActivity.this, R.style.title);
tv.setText(items[position]); //设置TextView显示的内容
ll.addView(tv);
return ll;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public int getCount() {
return items.length;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent(); //获得启动该Activity的Intent
uno = intent.getStringExtra("uno");
setContentView(R.layout.publish); //设置当前屏幕
ListView lvPublish = (ListView)findViewById(R.id.lvPublish); //获得ListView对象引用
lvPublish.setAdapter(ba);
lvPublish.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position,
long id) {
switch(position){ //判断点击的是哪一个选项
case 0: //更新心情
LayoutInflater li = LayoutInflater.from(PublishActivity.this);
dialog_view = li.inflate(R.layout.publish_status, null);
new AlertDialog.Builder(PublishActivity.this)
.setTitle("更新心情")
.setIcon(R.drawable.p_status)
.setView(dialog_view)
.setPositiveButton(
"发表",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
pd = ProgressDialog.show(PublishActivity.this, "请稍候", "正在更新心情...",true,true);
updateStatus();
}
})
.setNegativeButton(
"取消",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {}
})
.show();
break;
case 1: //发表日志
Intent intent1 = new Intent(PublishActivity.this,PublishDiaryActivity.class);//创建Intent
intent1.putExtra("uno", uno); //设置Intent的Extra字段
startActivity(intent1);
break;
case 2: //拍照上传
Intent intent2 = new Intent(PublishActivity.this,ShootActivity.class);//创建Intent
intent2.putExtra("uno", uno); //设置Intent的Extra字段
startActivity(intent2);
break;
}
}
});
}
//方法:连接服务器,更新心情
public void updateStatus(){
new Thread(){
public void run(){
Looper.prepare();
EditText etStatus = (EditText)dialog_view.findViewById(R.id.etInputStatus);
String status = etStatus.getEditableText().toString().trim(); //获得心情内容
if(status.equals("")){ //如果输入的心情为空
pd.dismiss();
Toast.makeText(PublishActivity.this, "请输入更新的心情", Toast.LENGTH_LONG).show();//输出提示
Looper.loop();
return;
}
String message = "<#NEW_STATUS#>"+status+"|"+uno;
if(mc == null){
mc = new MyConnector(SERVER_ADDRESS, SERVER_PORT);
}
try{
mc.dout.writeUTF(message); //向服务器发送更新的心情
pd = ProgressDialog.show(PublishActivity.this, "正在连接网络", "请稍候",true);
String reply = mc.din.readUTF(); //从服务器返回的回复
pd.dismiss();
if(reply.equals("<#STATUS_SUCCESS#>")){ //心情更新成功
Toast.makeText(PublishActivity.this, "心情更新成功!", Toast.LENGTH_LONG).show();
Looper.loop();
}
else { //心情更新失败
Toast.makeText(PublishActivity.this, "心情更新失败!", Toast.LENGTH_LONG).show();
Looper.loop();
}
}catch(Exception e){
e.printStackTrace();
}
Looper.myLooper().quit();
}
}.start();
}
@Override
protected void onDestroy() {
if(mc != null){
mc.sayBye();
}
super.onDestroy();
}
}
(4)注册处理____RegActivity.java
package wyf.wpf;
import static wyf.wpf.ConstantUtil.SERVER_ADDRESS;
import static wyf.wpf.ConstantUtil.SERVER_PORT;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;
public class RegActivity extends Activity{
MyConnector mc = null; //声明MyConnector对象
String uno = ""; //记录用户的ID
ProgressDialog pd= null; //声明进度对话框
Handler myHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch(msg.what){
case 0:
View linearLayout = (LinearLayout)findViewById(R.id.regResult); //获得线性布局
linearLayout.setVisibility(View.VISIBLE); //设置可见性
EditText etUno = (EditText)findViewById(R.id.etUno);
etUno.setText(uno);
break;
}
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.reg); //设置当前屏幕
Button btnReg = (Button)findViewById(R.id.btnReg); //获得注册Button按钮对象
btnReg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pd = ProgressDialog.show(RegActivity.this, "请稍候...", "正在连接服务器...", false);
register();
}
});
Button btnBack = (Button)findViewById(R.id.btnBack); //获得返回按钮对象
btnBack.setOnClickListener(new View.OnClickListener() { //为返回按钮添加监听器
@Override
public void onClick(View v) {
Intent intent = new Intent(RegActivity.this,LoginActivity.class); //创建Intent对象
startActivity(intent); //启动Activity
finish();
}
});
Button btnEnter = (Button)findViewById(R.id.btnEnter); //获得进入功能面板按钮对象
btnEnter.setOnClickListener(new View.OnClickListener() { //为进入功能面板的按钮添加监听器
@Override
public void onClick(View v) {
Intent intent = new Intent(RegActivity.this,FunctionTabActivity.class); //创建Intent
intent.putExtra("uno", uno); //设置Extra字段
startActivity(intent); //启动FunctionTab
finish(); //关闭该Activity
}
});
}
//方法:连接服务器,进行注册
public void register(){
new Thread(){
public void run(){
Looper.prepare();
//获得用户输入的数据并进行验证
EditText etName = (EditText)findViewById(R.id.etName); //获得昵称EditText对象
EditText etPwd1 = (EditText)findViewById(R.id.etPwd1); //获得密码EditText对象
EditText etPwd2 = (EditText)findViewById(R.id.etPwd2); //获得确认密码EditText对象
EditText etEmail = (EditText)findViewById(R.id.etEmail); //获得邮箱EditText对象
EditText etStatus = (EditText)findViewById(R.id.etStatus); //获得心情EditText对象
String name = etName.getEditableText().toString().trim(); //获得昵称
String pwd1 = etPwd1.getEditableText().toString().trim(); //获得密码
String pwd2 = etPwd2.getEditableText().toString().trim(); //获得确认密码
String email = etEmail.getEditableText().toString().trim(); //获得邮箱
String status = etStatus.getEditableText().toString().trim(); //获得状态
if(name.equals("") || pwd1.equals("") || pwd2.equals("") || email.equals("") || status.equals("")){
Toast.makeText(RegActivity.this, "请将注册信息填写完整", Toast.LENGTH_LONG).show();
return;
}
if(!pwd1.equals(pwd2)){ //判断两次输入的密码是否一致
Toast.makeText(RegActivity.this, "两次输入的密码不一致!", Toast.LENGTH_LONG).show();
return;
}
try{
mc = new MyConnector(SERVER_ADDRESS, SERVER_PORT);
String regInfo = "<#REGISTER#>"+name+"|"+pwd1+"|"+email+"|"+status;
mc.dout.writeUTF(regInfo);
String result = mc.din.readUTF();
pd.dismiss();
if(result.startsWith("<#REG_SUCCESS#>")){ //返回信息为注册成功
result= result.substring(15); //去掉信息头
uno = result; //记录用户的ID
myHandler.sendEmptyMessage(0); //发出Handler消息
Toast.makeText(RegActivity.this, "注册成功!", Toast.LENGTH_LONG).show();
}
else{ //注册失败
Toast.makeText(RegActivity.this, "注册失败!请重试!", Toast.LENGTH_LONG).show();
}
}
catch(Exception e){
e.printStackTrace();
}
}
}.start();
}
@Override
protected void onDestroy() {
if(mc != null){
mc.sayBye();
}
super.onDestroy();
}
}
(5)AlbumActivity.java
package wyf.wpf;
import static wyf.wpf.ConstantUtil.IMAGESWITCHER_HEIGHT;
import static wyf.wpf.ConstantUtil.PHOTO_HEIGHT;
import static wyf.wpf.ConstantUtil.PHOTO_WIDTH;
import static wyf.wpf.ConstantUtil.SERVER_ADDRESS;
import static wyf.wpf.ConstantUtil.SERVER_PORT;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.opengl.Visibility;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.Gallery;
import android.widget.ImageSwitcher;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ViewSwitcher;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
public class AlbumActivity extends Activity implements ViewSwitcher.ViewFactory{
List<String []> photoInfoList = new ArrayList<String []>();
Bitmap [] photoList; //存放图片的数组
Gallery gl = null; //Gallery对象的引用
ImageSwitcher is = null; //ImageSwitcher对象的引用
Spinner sp = null; //Spinner对象的引用
MyConnector mc = null; //MyConnector对象的引用
String xid = ""; //存放相册的ID
String uno = ""; //存放用户ID
String visitor = ""; //存放访问者的ID
String pid = ""; //存放当前显示的照片ID
int from = -1; //启动该Activity的来源,0为MyAlbumListActivity,1为AlbumListActivity
List<String []> albumInfoList = new ArrayList<String []>(); //存放相册信息,id和相册名称
//Spinner的Adapter
BaseAdapter baSpinner = new BaseAdapter() {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView tv = new TextView(AlbumActivity.this);
tv.setTextSize(18.5f);
tv.setTextColor(Color.DKGRAY);
String [] sa = albumInfoList.get(position);
tv.setText(sa[1]);
return tv;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public int getCount() {
return albumInfoList.size();
}
};
//Gallery的Adapter
BaseAdapter baGallery= new BaseAdapter() {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView iv = new ImageView(AlbumActivity.this);
iv.setAdjustViewBounds(true);
iv.setLayoutParams(new Gallery.LayoutParams(PHOTO_WIDTH, PHOTO_HEIGHT));
iv.setMaxHeight(PHOTO_HEIGHT); //设置ImageView显示的高度
iv.setMaxWidth(PHOTO_WIDTH); //设置ImageView显示的宽度
iv.setImageBitmap(photoList[position]); //设置ImageView显示的内容
return iv;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public int getCount() {
if(photoList != null){
return photoList.length;
}
else{
return 0;
}
}
};
//点下Gallery中的图片后触发的事件监听器
OnItemClickListener myListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position,
long id) {
if(is != null){ //如果ImageSwitcher不为空
Drawable d = new BitmapDrawable(photoList[position]);
is.setImageDrawable(d);
}
}
};
Handler myHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch(msg.what){
case 0:
gl.setAdapter(baGallery);
is.setImageDrawable(new BitmapDrawable(photoList[0]));
break;
}
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.album); //设置当前屏幕
Intent intent = getIntent(); //获取启动该Activity的Intent
uno = intent.getStringExtra("uno"); //获得Extra字段的uno
visitor = intent.getStringExtra("visitor");
from = intent.getIntExtra("from", -1); //获得Extra字段的from
int position = intent.getIntExtra("position", 0); //获得被选中的相册
String [] albumInfoArray = intent.getStringArrayExtra("albumlist"); //获得相册信息数组
xid = intent.getStringExtra("xid"); //获得被选中的相册编号
albumInfoList = new ArrayList<String []>();
for(String s:albumInfoArray){ //遍历信息数组
String [] sa = s.split("\\|");
albumInfoList.add(sa); //构建相册信息列表
}
sp = (Spinner)findViewById(R.id.spAlbum); //获得Spinner对象
sp.setAdapter(baSpinner); //设置Spinner对象的Adapter
sp.setSelection(position); //选中在前一个Activity中被选中的相册
sp.setOnItemSelectedListener(new OnItemSelectedListener() { //为Spinner添加监听器
@Override
public void onItemSelected(AdapterView<?> parent, View v,
int position, long id) {
xid = albumInfoList.get(position)[0]; //修改存储相册ID的成员变量
getPhotoList(); //获得相册中的相片列表
}
@Override
public void onNothingSelected(AdapterView<?> parent) {}
});
gl = (Gallery)findViewById(R.id.galleryPhoto); //获得Gallery对象
gl.setOnItemClickListener(myListener); //设置Gallery的OnItemClickListener监听器
is = (ImageSwitcher)findViewById(R.id.isPhoto); //获得ImageSwitcher对象
is.setFactory(this); //设置ImageSwitcher的Factory
is.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in)); //设置ImageSwitcher的In动画
is.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));//设置ImageSwitcher的Out动画
Button btnBack = (Button)findViewById(R.id.btnAlbumBack); //获得返回按钮btnBack
btnBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switch(from){ //判断启动该Activity的来源
case 0: //有MyAlbumListActivity启动
Intent intent1 = new Intent(AlbumActivity.this,FunctionTabActivity.class);
intent1.putExtra("uno", uno);
intent1.putExtra("tab", "tab5");
startActivity(intent1);
finish();
break;
case 1: //由AlbumListActivity启动
Intent intent2 = new Intent(AlbumActivity.this,HomePageActivity.class);
intent2.putExtra("uno", uno);
intent2.putExtra("visitor", visitor);
intent2.putExtra("tab", "tab2");
startActivity(intent2);
finish();
break;
}
}
});
Button btnDeletePhoto = (Button)findViewById(R.id.btnDeletePhoto);
if(visitor != null){ //不是查看自己的相册
btnDeletePhoto.setVisibility(View.GONE); //如果不是自己的相册,隐藏删除按钮
}
btnDeletePhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new AlertDialog.Builder(AlbumActivity.this)
.setTitle("提示")
.setIcon(R.drawable.alert_icon)
.setMessage("确认删除该照片?")
.setPositiveButton(
"确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
int pos = gl.getSelectedItemPosition();
pid = photoInfoList.get(pos)[0];
deletePhoto();
}
})
.setNegativeButton(
"取消",
null)
.show();
}
});
}
public void getPhotoList(){
new Thread(){
public void run(){
Looper.prepare();
try{
mc = null;
mc = new MyConnector(SERVER_ADDRESS, SERVER_PORT);
mc.dout.writeUTF("<#GET_ALBUM#>"+xid);
int size = 0; //获得相册长度
size = mc.din.readInt(); //读取相册的长度
if(size == 0){
Toast.makeText(AlbumActivity.this, "该相册还未上传照片", Toast.LENGTH_LONG).show();
Looper.loop();
return;
}
photoInfoList = new ArrayList<String []>(size);
photoList = new Bitmap[size];
for(int i=0;i<size;i++){ //循环获取图片数据
String photoInfo = mc.din.readUTF(); //读取相片信息
String [] sa = photoInfo.split("\\|"); //切割字符串
photoInfoList.add(sa); //将相片信息添加到列表中
int photoLength = mc.din.readInt(); //读取相片长度
byte [] buf = new byte[photoLength]; //创建相应长度的数组
mc.din.read(buf); //读入图片数据
photoList[i] = BitmapFactory.decodeByteArray(buf, 0, photoLength); //创建Bitmap
}
myHandler.sendEmptyMessage(0);
}catch(Exception e){
e.printStackTrace();
}
}
}.start();
}
//方法:删除指定照片
public void deletePhoto(){
new Thread(){
public void run(){
Looper.prepare();
try{
if(mc ==null){
mc = new MyConnector(SERVER_ADDRESS, SERVER_PORT);
}
String msg = "<#DELETE_PHOTO#>"+pid;
mc.dout.writeUTF(msg);
String reply = mc.din.readUTF();
if(reply.equals("<#DELETE_PHOTO_SUCCESS#>")){
Toast.makeText(AlbumActivity.this, "照片删除成功!", Toast.LENGTH_LONG).show();
}
else {
Toast.makeText(AlbumActivity.this, "删除失败,请重试!", Toast.LENGTH_LONG).show();
}
getPhotoList();
Looper.loop();
}catch(Exception e){
e.printStackTrace();
}
}
}.start();
}
@Override
public View makeView() {
ImageView iv = new ImageView(this);
iv.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
iv.setLayoutParams(new ImageSwitcher.LayoutParams(IMAGESWITCHER_HEIGHT,IMAGESWITCHER_HEIGHT));
return iv;
}
@Override
protected void onDestroy() {
if(mc != null){
mc.sayBye();
mc = null;
}
super.onDestroy();
}
}
(6)AlbumListActivity.java
package wyf.wpf;
import static wyf.wpf.ConstantUtil.SERVER_ADDRESS;
import static wyf.wpf.ConstantUtil.SERVER_PORT;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
/*
* 该Activity的主要功能是显示好友的相册列表
* 和MyAlbumActivity有所区别。
*/
public class AlbumListActivity extends Activity{
MyConnector mc = null;
ListView lvAlbumList = null;
ArrayList<String []> albumList; //存放好友相册信息的列表
String [] albumArray; //存放好友相册信息的数组
String uno = null; //存放被访问者的ID
String visitor = null; //存放访问者的ID
BaseAdapter ba = new BaseAdapter() {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView tv = new TextView(AlbumListActivity.this);
tv.setTextSize(20.5f); //设置字体大小
tv.setGravity(Gravity.CENTER);
tv.setText(albumList.get(position)[1]); //设置TextView显示的内容
tv.setTextAppearance(AlbumListActivity.this, R.style.title);
return tv;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public int getCount() {
return albumList.size();
}
};
Handler myHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch(msg.what){
case 0:
lvAlbumList.setAdapter(ba);
break;
}
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
uno = intent.getStringExtra("uno");
visitor = intent.getStringExtra("visitor");
setContentView(R.layout.album_list); //设置当前屏幕
lvAlbumList = (ListView)findViewById(R.id.lvAlbumList); //获得ListView对象
lvAlbumList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position,
long id) {
Intent intent = new Intent(AlbumListActivity.this,AlbumActivity.class); //创建Intent对象
intent.putExtra("uno", uno);
intent.putExtra("visitor", visitor);
intent.putExtra("albumlist", albumArray);
intent.putExtra("xid", albumList.get(position)[0]);
intent.putExtra("position", position);
intent.putExtra("from", 1);
startActivity(intent);
finish();
}
});
getAlbumListByAccess();
}
public void getAlbumListByAccess(){
new Thread(){
public void run(){
Looper.prepare();
try{
if(mc == null){
mc = new MyConnector(SERVER_ADDRESS, SERVER_PORT);
}
mc.dout.writeUTF("<#GET_ALBUM_LIST_BY_ACCESS#>"+uno+"|"+visitor);
String reply = mc.din.readUTF();
System.out.println("-------getAlbumByAccess reply is:"+reply);
if(reply.equals("<#NO_ALBUM#>")){ //该用户无相册
Toast.makeText(AlbumListActivity.this, "该用户还没有上传过照片", Toast.LENGTH_LONG).show();
Looper.loop();
}
albumArray = reply.split("\\$");
albumList = new ArrayList<String []>();
for(String s:albumArray){ //解析每个相册的信息
String [] sa = s.split("\\|"); //切割字符串
albumList.add(sa);
}
myHandler.sendEmptyMessage(0);
}catch(Exception e){
e.printStackTrace();
}
Looper.myLooper().quit();
}
}.start();
}
@Override
protected void onDestroy() {
if(mc != null){
mc.sayBye();
mc = null;
}
super.onDestroy();
}
}
(7)CommentActivity .java
package wyf.wpf;
import static wyf.wpf.ConstantUtil.SERVER_ADDRESS;
import static wyf.wpf.ConstantUtil.SERVER_PORT;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class CommentActivity extends Activity{
MyConnector mc = null;
String visitor = null; //访问者ID
String uno = null; //被访者ID
String rid = null; //日记的ID
List<String []> cmtList; //存放评论的列表
BaseAdapter baListView = new BaseAdapter(){
@Override
public int getCount() {
return cmtList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LinearLayout ll = new LinearLayout(CommentActivity.this);
ll.setOrientation(LinearLayout.VERTICAL);
TextView tvName = new TextView(CommentActivity.this);
tvName.setGravity(Gravity.LEFT);
tvName.setTextAppearance(CommentActivity.this, R.style.title);
String [] cmt = cmtList.get(position); //获得指定的评论信息
tvName.setText(cmt[1]+"-于"+cmt[3]+"说:");
TextView tvContent = new TextView(CommentActivity.this);
tvContent.setTextAppearance(CommentActivity.this, R.style.content);
tvContent.setText(cmt[2]); //设置评论内容
ll.addView(tvName);
ll.addView(tvContent);
return ll;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
visitor = intent.getStringExtra("visitor");
uno = intent.getStringExtra("uno");
rid = intent.getStringExtra("rid");
initComments();
setContentView(R.layout.comment);
ListView lvComment = (ListView)findViewById(R.id.lvComent);
lvComment.setAdapter(baListView);
Button btnComment = (Button)findViewById(R.id.btnComment);
btnComment.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText etComment = (EditText)findViewById(R.id.etComentContent);
String content = etComment.getEditableText().toString().trim(); //获得品论内容
if(content.equals("")){ //未输入评论内容
Toast.makeText(CommentActivity.this, "请输入评论内容", Toast.LENGTH_LONG).show();
return;
}
if(visitor == null){
makeNewComment(content,rid,uno);
}
else if(visitor != null){
makeNewComment(content,rid,visitor);
}
initComments();
baListView.notifyDataSetChanged();
}
});
Button btnCommentBack = (Button)findViewById(R.id.btnCommentBack); //获得返回按钮对象
btnCommentBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
//方法:获取评论列表
public void initComments(){
cmtList = new ArrayList<String []>();
if(mc == null){
mc = new MyConnector(SERVER_ADDRESS, SERVER_PORT);
}
try{
mc.dout.writeUTF("<#GET_COMMENT#>"+rid); //发出获取评论请求
int size = mc.din.readInt(); //获取评论的个数
System.out.println("the number of comment is :"+size);
mc.dout.writeUTF("<#READY_TO_READ_COMMENT#>");
for(int i=0;i<size;i++){
String msg = mc.din.readUTF(); //读取每条评论信息
String [] sa = msg.split("\\|"); //切割字符串
cmtList.add(sa);
}
}
catch(Exception e){
e.printStackTrace();
}
}
//方法:发表新评论
public void makeNewComment(String content,String rid,String uno){
try{
if(mc == null){
mc = new MyConnector(SERVER_ADDRESS, SERVER_PORT);
}
mc.dout.writeUTF("<#NEW_COMMENT#>"+content+"|"+rid+"|"+uno);
String reply = mc.din.readUTF(); //读取回复
if(reply.equals("<#NEW_COMMENT_SUCESS#>")){ //解析回复
Toast.makeText(CommentActivity.this, "评论添加成功!", Toast.LENGTH_LONG).show();
}
else{
Toast.makeText(CommentActivity.this, "评论添加失败!", Toast.LENGTH_LONG).show();
}
}
catch(Exception e){
e.printStackTrace();
}
}
@Override
protected void onDestroy() {
if(mc != null){
mc.sayBye();
mc = null;
}
super.onDestroy();
}
}
(8) ContactsActivity .java
package wyf.wpf;
import static wyf.wpf.ConstantUtil.*;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
public class ContactsActivity extends Activity{
String uno = null; //记录当前用户的id
int type = -1; //为0表示显示好友列表,为1表示显示访客列表
Bitmap [] headList = null; //存放头像的数组
ArrayList<String []> infoList = null; //存放联系人信息的列表如果是好友则为id、姓名、email、状态、头像。若为访客则为id、姓名、日期、头像
MyConnector mc = null; //网络连接器对象
ListView lv = null;
String [] messageHead = {"<#FRIEND_LIST#>","<#VISITOR_LIST#>"};
BaseAdapter baContacts=null;
Handler myHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch(msg.what){
case 0:
lv.setAdapter(baContacts);
break;
}
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent(); //获得启动该Activity的Intent对象
uno = intent.getStringExtra("uno"); //获得当前用户的id
type = intent.getIntExtra("type", -1);
if(type == 0){ //好友列表
baContacts = new BaseAdapter() {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LinearLayout ll = new LinearLayout(ContactsActivity.this); //创建线性布局
ll.setOrientation(LinearLayout.HORIZONTAL);
ImageView iv = new ImageView(ContactsActivity.this); //创建ImageView对象
iv.setScaleType(ImageView.ScaleType.FIT_CENTER);
iv.setImageBitmap(headList[position]); //设置头像
iv.setLayoutParams(new LinearLayout.LayoutParams(HEAD_WIDTH, HEAD_HEIGHT));
LinearLayout ll2 = new LinearLayout(ContactsActivity.this); //创建子线性布局
ll2.setOrientation(LinearLayout.VERTICAL);
TextView tvName = new TextView(ContactsActivity.this); //创建用于显示姓名的TextView
tvName.setText(infoList.get(position)[1]); //设置TextView的内容
tvName.setTextSize(20.5f); //设置字体大小
tvName.setTextColor(Color.BLUE); //设置字体颜色
tvName.setPadding(5, 0, 0, 0); //设置边界空白
TextView tvStatus = new TextView(ContactsActivity.this); //创建用于显示心情的TextView
tvStatus.setTextSize(18.0f); //设置这字体大小
tvStatus.setTextAppearance(ContactsActivity.this, R.style.content);
tvStatus.setPadding(5, 0, 0, 0);
tvStatus.setText("心情:"+infoList.get(position)[3]); //设置TextView内容
ll2.addView(tvName); //将显示姓名的TextView添加到线性布局
ll2.addView(tvStatus); //将显示心情的TextView添加到线性布局
ll.addView(iv); //将显示头像的ImageView添加到现象布局
ll.addView(ll2);
return ll;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public int getCount() {
return headList.length;
}
};
}
else if(type == 1){ //访客列表
baContacts = new BaseAdapter() {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LinearLayout ll = new LinearLayout(ContactsActivity.this); //创建线性布局
ll.setOrientation(LinearLayout.HORIZONTAL);
ImageView iv = new ImageView(ContactsActivity.this); //创建ImageView对象
iv.setScaleType(ImageView.ScaleType.FIT_CENTER);
iv.setImageBitmap(headList[position]); //设置头像
iv.setLayoutParams(new LinearLayout.LayoutParams(HEAD_WIDTH, HEAD_HEIGHT));
LinearLayout ll2 = new LinearLayout(ContactsActivity.this); //创建子线性布局
ll2.setOrientation(LinearLayout.VERTICAL);
TextView tvName = new TextView(ContactsActivity.this); //创建用于显示姓名的TextView
tvName.setText(infoList.get(position)[1]); //设置TextView的内容
tvName.setTextSize(20.5f); //设置字体大小
tvName.setTextColor(Color.BLUE); //设置字体颜色
tvName.setPadding(5, 0, 0, 0); //设置边界空白
TextView tvDate = new TextView(ContactsActivity.this); //创建用于显示心情的TextView
tvDate.setTextSize(18.0f); //设置这字体大小
tvDate.setTextAppearance(ContactsActivity.this, R.style.content);
tvDate.setPadding(5, 0, 0, 0);
tvDate.setText(infoList.get(position)[2]); //设置TextView内容
ll2.addView(tvName); //将显示姓名的TextView添加到线性布局
ll2.addView(tvDate); //将显示心情的TextView添加到线性布局
ll.addView(iv); //将显示头像的ImageView添加到现象布局
ll.addView(ll2);
return ll;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public int getCount() {
return headList.length;
}
};
}
setContentView(R.layout.contacts);
lv = (ListView)findViewById(R.id.listFriend); //获得ListView对象的引用
getContact();
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position,
long id) {
Intent intent = new Intent(ContactsActivity.this,HomePageActivity.class);
intent.putExtra("uno", infoList.get(position)[0]);
intent.putExtra("visitor", uno);
startActivity(intent);
}
});
}
//方法:获取联系人列表
public void getContact(){
new Thread(){
public void run(){
try{
mc = new MyConnector(SERVER_ADDRESS, SERVER_PORT); //创建MyConnector对象
mc.dout.writeUTF(messageHead[type]+uno); //向服务器发出请求
int size = mc.din.readInt(); //读取列表的长度
headList = null;
infoList = null;
headList = new Bitmap[size]; //初始化好友头像列表
infoList = new ArrayList<String []>(size); //初始化好友信息列表
for(int i=0;i<size;i++){ //循环,获取每个好友的信息和头像
String fInfo = mc.din.readUTF(); //读取好友信息
String [] sa = fInfo.split("\\|"); //分割字符串
infoList.add(sa); //将好友信息添加到相应的列表中
int headSize = mc.din.readInt(); //读取头像大小
byte[] buf = new byte[headSize]; //创建缓冲区
mc.din.read(buf); //读取头像信息
headList[i] = BitmapFactory.decodeByteArray(buf, 0, headSize);
}
}catch(Exception e){
e.printStackTrace();
}
myHandler.sendEmptyMessage(0);
}
}.start();
}
@Override
protected void onDestroy() {
if(mc != null){
mc.sayBye();
}
super.onDestroy();
}
}
(9)FunctionTabActivity
package wyf.wpf;
import android.app.AlertDialog;
import android.app.TabActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TabHost;
public class FunctionTabActivity extends TabActivity{
static final int MENU_SEARCH = 0;
static final int MENU_EXIT = 1;
String uno = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent(); //获得启动该Activity的Intent
uno = intent.getStringExtra("uno");
final TabHost tabHost = getTabHost();
Intent intentPublish = new Intent(this,wyf.wpf.PublishActivity.class);
intentPublish.putExtra("uno", uno);
Intent intent1 = new Intent(this,wyf.wpf.ContactsActivity.class);
intent1.putExtra("type", 0); //type为1表示好友列表
intent1.putExtra("uno", uno);
Intent intent2 = new Intent(this,wyf.wpf.ContactsActivity.class);
intent2.putExtra("type", 1); //type为2表示最近访客
intent2.putExtra("uno", uno);
Intent iDiary = new Intent(this,wyf.wpf.MyDiaryActivity.class);
iDiary.putExtra("uno", uno); //为将用户id设置为Intent的Extra
Intent iAlbum = new Intent(this,wyf.wpf.MyAlbumListActivity.class);
iAlbum.putExtra("uno", uno);
tabHost.addTab(tabHost.newTabSpec("tab1")
.setIndicator("快速发布", getResources().getDrawable(R.drawable.publish))
.setContent(intentPublish)
);
tabHost.addTab(tabHost.newTabSpec("tab2")
.setIndicator("我的好友", getResources().getDrawable(R.drawable.friend))
.setContent(intent1)
);
tabHost.addTab(tabHost.newTabSpec("tab3")
.setIndicator("最近访客", getResources().getDrawable(R.drawable.visitor))
.setContent(intent2)
);
tabHost.addTab(tabHost.newTabSpec("tab4")
.setIndicator("日志列表",getResources().getDrawable(R.drawable.diary))
.setContent(iDiary)
);
tabHost.addTab(tabHost.newTabSpec("tab5")
.setIndicator("相册列表", getResources().getDrawable(R.drawable.album))
.setContent(iAlbum)
);
String tab = intent.getStringExtra("tab");
if(tab != null){
tabHost.setCurrentTabByTag(tab);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, MENU_SEARCH, 0, "搜索")
.setIcon(R.drawable.search);
menu.add(0, MENU_EXIT, 0, "退出")
.setIcon(R.drawable.exit);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case MENU_SEARCH: //按下搜索菜单选项
Intent intent = new Intent(this,SearchActivity.class); //创建Intent
intent.putExtra("visitor", uno);
startActivity(intent);
break;
case MENU_EXIT: //按下退出菜单选项
new AlertDialog.Builder(this)
.setTitle("提示")
.setMessage("确认退出吗?")
.setIcon(R.drawable.alert_icon)
.setPositiveButton(
"确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
android.os.Process.killProcess(android.os.Process.myPid()); //结束进程
}
})
.setNegativeButton(
"取消",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {}
})
.show();
break;
}
return super.onOptionsItemSelected(item);
}
}
(10)ModifyDiaryActivity
package wyf.wpf;
import static wyf.wpf.ConstantUtil.*;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Looper;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class ModifyDiaryActivity extends Activity{
MyConnector mc = null;
String [] diaryInfo = null; //记录日志信息
EditText etModifyTitle = null;
EditText etModifyContent = null;
String uno = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
diaryInfo = intent.getStringArrayExtra("diary_info");
uno = intent.getStringExtra("uno");
setContentView(R.layout.modify_diary);
etModifyTitle = (EditText)findViewById(R.id.etModifyTitle); //获得标题EditText
etModifyTitle.setText(diaryInfo[1]);
etModifyContent = (EditText)findViewById(R.id.etModifyDiary); //获得内容EditText
etModifyContent.setText(diaryInfo[2]);
Button btnModifyDiary = (Button)findViewById(R.id.btnModifyDiary); //获得修改按钮
btnModifyDiary.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String modifyTitle = etModifyTitle.getEditableText().toString().trim();
String modifyContent = etModifyContent.getEditableText().toString().trim();
if(modifyContent.equals("") || modifyTitle.equals("")){ //如果内容或标题为空
Toast.makeText(ModifyDiaryActivity.this, "请将标题或内容填写完整!", Toast.LENGTH_LONG).show();
return;
}
modifyDiary();
}
});
Button btnModifyBack = (Button)findViewById(R.id.btnModifyDiaryBack);
btnModifyBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(ModifyDiaryActivity.this,FunctionTabActivity.class);
intent.putExtra("uno", uno);
intent.putExtra("tab", "tab4");
startActivity(intent);
}
});
}
public void modifyDiary(){
new Thread(){
public void run(){
Looper.prepare();
try{
if(mc == null){
mc = new MyConnector(SERVER_ADDRESS, SERVER_PORT);
}
String modifyTitle = etModifyTitle.getEditableText().toString().trim();
String modifyContent = etModifyContent.getEditableText().toString().trim();
String msg = "<#MODIFY_DIARY#>"+diaryInfo[0]+"|"+modifyTitle+"|"+modifyContent;
mc.dout.writeUTF(msg);
String reply = mc.din.readUTF();
if(reply.equals("<#MODIFY_DIARY_SUCCESS#>")){
Toast.makeText(ModifyDiaryActivity.this, "日志修改成功!", Toast.LENGTH_LONG).show();
Looper.loop();
}
else{
Toast.makeText(ModifyDiaryActivity.this, "修改失败,请重试!", Toast.LENGTH_LONG).show();
Looper.loop();
}
}catch(Exception e){
e.printStackTrace();
}
Looper.myLooper().quit();
}
}.start();
}
@Override
protected void onDestroy() {
if(mc == null){
mc.sayBye();
}
super.onDestroy();
}
}
(11)MyAlbumListActivity
package wyf.wpf;
import static wyf.wpf.ConstantUtil.*;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.LinearLayout.LayoutParams;
public class MyAlbumListActivity extends Activity{
MyConnector mc = null; //声明MyConnector对象
ListView lvAlbumList = null; //ListView对象的引用
List<String []> albumInfoList = null; //存放相册信息的List
String albumInfoArray [] = null; //存放相册信息的Array
String uno = null; //存放用户的ID
int newAccess = -1; //记录新设置的权限
String [] accessOptions={
"公开","好友可见","仅个人可见"
};
int albumIndexToChange = -1; //记录要更改权限的相册在信息列表中的索引
String albumToChange = null; //记录要更改权限的相册ID
String accessToChange = null; //记录要更改的权限
BaseAdapter ba = new BaseAdapter() {
@Override
public View getView(int position, View arg1, ViewGroup arg2) {
LinearLayout ll = new LinearLayout(MyAlbumListActivity.this);
ll.setOrientation(LinearLayout.HORIZONTAL);
ll.setGravity(Gravity.CENTER_VERTICAL); //设置线性布局的分布方式
TextView tvName = new TextView(MyAlbumListActivity.this);
tvName.setTextAppearance(MyAlbumListActivity.this, R.style.title);
tvName.setPadding(5, 0, 0, 0);
tvName.setText(albumInfoList.get(position)[1]); //设置TextView显示的内容
tvName.setLayoutParams(new LinearLayout.LayoutParams(170, LayoutParams.WRAP_CONTENT));
ll.addView(tvName);
LinearLayout ll2 = new LinearLayout(MyAlbumListActivity.this);
ll2.setOrientation(LinearLayout.HORIZONTAL); //设置线性布局的分布方式
ll2.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
ll2.setGravity(Gravity.RIGHT);
Button btnSee = new Button(MyAlbumListActivity.this); //创建查看相册照片的Button对象
btnSee.setId(position); //设置Button的ID
btnSee.setText("查看");
btnSee.setTextAppearance(MyAlbumListActivity.this, R.style.button);
btnSee.setOnClickListener(listenerToDetail); //设置Button的监听器
btnSee.setLayoutParams(new LinearLayout.LayoutParams(60, LayoutParams.WRAP_CONTENT));
ll2.addView(btnSee);
Button btnChangeAccess = new Button(MyAlbumListActivity.this); //创建修改相册权限的Button对象
btnChangeAccess.setId(position); //设置Button的ID
btnChangeAccess.setText("修改权限");
btnChangeAccess.setTextAppearance(MyAlbumListActivity.this, R.style.button); //设置按钮样式
btnChangeAccess.setOnClickListener(listenerToAcess); //添加监听器
btnChangeAccess.setLayoutParams(new LinearLayout.LayoutParams(80, LayoutParams.WRAP_CONTENT));//设置布局参数
ll2.addView(btnChangeAccess);
ll.addView(ll2);
return ll;
}
@Override
public long getItemId(int arg0) {
return 0;
}
@Override
public Object getItem(int arg0) {
return null;
}
@Override
public int getCount() {
return albumInfoList.size();
}
};
View.OnClickListener listenerToDetail = new View.OnClickListener() { //点下查看按钮后触发的监听器
@Override
public void onClick(View v) { //重写onClick方法
Intent intent = new Intent(MyAlbumListActivity.this,AlbumActivity.class); //创建Intent对象
intent.putExtra("uno", uno);
intent.putExtra("albumlist", albumInfoArray);
intent.putExtra("xid", albumInfoList.get(v.getId())[0]);
intent.putExtra("position", v.getId());
intent.putExtra("from", 0);
startActivity(intent);
finish();
}
};
View.OnClickListener listenerToAcess = new View.OnClickListener() {
@Override
public void onClick(View v) {
albumIndexToChange = v.getId();
albumToChange = albumInfoList.get(v.getId())[0];
newAccess = Integer.valueOf(albumInfoList.get(v.getId())[2]);
showMyDialog();
}
};
Handler myHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch(msg.what){
case 0:
lvAlbumList.setAdapter(ba);
break;
}
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.album_list); //设置当前屏幕
Intent intent = getIntent(); //获得启动该Activity的Intent
uno = intent.getStringExtra("uno"); //获得Intent中的uno的值
lvAlbumList = (ListView)findViewById(R.id.lvAlbumList); //获得ListView对象
getAlbumList(); //获得指定用户的相册列表
}
public void getAlbumList(){
new Thread(){
public void run(){
Looper.prepare();
try{
if(mc == null){ //检查MyConnector对象是否为空
mc = new MyConnector(SERVER_ADDRESS, SERVER_PORT); //创建MyConnector对象
}
mc.dout.writeUTF("<#GET_ALBUM_LIST#>"+uno); //发出获取相册列表请求
String reply = mc.din.readUTF(); //读取相册列表
if(reply.equals("<#NO_ALBUM#>")){ //判断相册列表是否为空
Toast.makeText(MyAlbumListActivity.this, "您还没有上传过照片", Toast.LENGTH_LONG).show();
Looper.loop();
return;
}
albumInfoArray = reply.split("\\$"); //切割字符串
albumInfoList = new ArrayList<String []>();
for(String s:albumInfoArray){
String [] sa = s.split("\\|"); //切割字符串
albumInfoList.add(sa);
}
myHandler.sendEmptyMessage(0);
}catch(Exception e){
e.printStackTrace();
}
}
}.start();
}
//方法:显示修改权限对话框
public void showMyDialog(){
new AlertDialog.Builder(this)
.setSingleChoiceItems(accessOptions, newAccess, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
newAccess = which;
}
})
.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
accessToChange=newAccess+"";
changeAlbumAccess();
}
}).show();
}
//方法:修改相册权限
public int changeAlbumAccess(){
int result = 0;
new Thread(){
public void run(){
Looper.prepare();
try{
if(mc == null){
mc = new MyConnector(SERVER_ADDRESS, SERVER_PORT); //创建MyConnector
}
String msg = "<#CHANGE_ALBUM_ACCESS#>"+albumToChange+"|"+accessToChange;
mc.dout.writeUTF(msg);
String reply = mc.din.readUTF(); //接收服务器反馈
if(reply.equals("<#ALBUM_ACCESS_SUCCESS#>")){ //更新权限成功
Toast.makeText(MyAlbumListActivity.this, "相册权限更新成功!", Toast.LENGTH_LONG).show();
Looper.loop(); //执行消息队列中的消息
}
else{ //更新权限失败
Toast.makeText(MyAlbumListActivity.this, "相册权限更新失败!", Toast.LENGTH_LONG).show();
Looper.loop(); //执行消息队列中的消息
}
}catch(Exception e){
e.printStackTrace();
}
}
}.start();
return result;
}
protected void onDestroy() {
if(mc != null){
mc.sayBye();
mc = null;
}
super.onDestroy();
}
}
(12)PublishDiaryActivity.java
package wyf.wpf;
import static wyf.wpf.ConstantUtil.SERVER_ADDRESS;
import static wyf.wpf.ConstantUtil.SERVER_PORT;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.os.Looper;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class PublishDiaryActivity extends Activity{
MyConnector mc = null;
ProgressDialog pd = null;
String uno = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
uno = intent.getStringExtra("uno");
setContentView(R.layout.publish_diary);
Button btnDiary = (Button)findViewById(R.id.btnDiary); //获得发布日志按钮
btnDiary.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pd = ProgressDialog.show(PublishDiaryActivity.this, "请稍候", "正在发布日志...",true,true);
publishDiary(); //发表日志
}
});
Button btnDiaryBack = (Button)findViewById(R.id.btnDiaryBack);
btnDiaryBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
//方法:连接服务器,发表日志
public void publishDiary(){
new Thread(){
public void run(){
Looper.prepare();
EditText etTitle = (EditText)findViewById(R.id.etTitle); //获得日记标题EditText对象
EditText etDiary = (EditText)findViewById(R.id.etDiary); //获得日记内容EditText对象
String title = etTitle.getEditableText().toString().trim(); //获得日记标题
String diary = etDiary.getEditableText().toString().trim(); //获得日记内容
if(title.equals("") || diary.equals("")){ //如果标题或内容为空
Toast.makeText(PublishDiaryActivity.this, "请将日记的标题或内容填写完整", Toast.LENGTH_LONG).show();
return;
}
try{
if(mc == null){
mc = new MyConnector(SERVER_ADDRESS, SERVER_PORT); //创建一个Socket连接
}
String message = "<#NEW_DIARY#>" + title+"|"+diary+"|"+uno;
mc.dout.writeUTF(message); //发出消息
String reply = mc.din.readUTF(); //接收消息
pd.dismiss();
if(reply.equals("<#DIARY_SUCCESS#>")){ //如果日志发布成功
pd.dismiss(); //关闭进度对话框
Toast.makeText(PublishDiaryActivity.this, "日志发布成功,请在个人日志中查看", Toast.LENGTH_LONG).show();
Looper.loop();
}
else if(reply.equals("<#DIARY_FAIL#>")){ //如果日志发布失败
pd.dismiss(); //关闭进度对话框
Toast.makeText(PublishDiaryActivity.this, "日志发布失败,请稍候重试!", Toast.LENGTH_LONG).show();
Looper.loop();
}
}catch(Exception e){
e.printStackTrace();
}
Looper.myLooper().quit();
}
}.start();
}
@Override
protected void onDestroy() {
if(mc != null){
mc.sayBye(); //调用MyConnector的sayBye方法
}
super.onDestroy();
}
}
四、 设计体会
应该客观地进行总结,大致包括以下内容,不要按照问答式回答以下问题(也不要按以下内容列标题),而是用自己的语言进行论述。
l 设计是否达到预定的目标?
l 有哪些收获?
l 尚存在哪些不足?
l 对今后学习和工作的影响等。
课程设计体会:
这次课程设计本来是纯粹的Android端的开发,但是进入这样的开发一段时间之后,我就感觉到这个课程的魅力所在。虽然课上并没有提到移动互联网开发里面这个互联网开发,但是通过这次的课程设计亲切的感受到Android开发的魅力。课程设计当中提到了web端和Android端的互通,真正的实现互联网这个词,我现在对这门课真的很感兴趣,如果这样的开发多了我相信以后的经验的积累会更快。但是这次课程设计里也是有很多不懂的问题,这样其实也就是按部就班的进行开发,对于一些技术还掌握不到位,包括里面的实现web端和Android端的数据同步就是这样的例子,说明自己的功底以及相应知识还是不熟,欠练。这次课程设计是我自己选的素材,也是我想要追寻的方向,虽然不能达到像工程师那样熟练,但是起码给了我自己这样一个学习方向。互联网其实是现代接触最为接近的核心网络技术之一,掌握这样的技术无论是以后找工作,还是以想开发自己想要的服务都是一个莫大的帮助。我现在正在往这方面进行发展,等到学好这门技术我希望能开发出一个完全属于自己的项目。
__________________________________________________________________________________
格式说
正文宋体,小四号字,1.3倍行距
图示例
在正文中描述“xxx如图1所示”
图1 系统登录模块界面
表示例
在正文中描述“xxx如表1所示”
表1 操作员信息表结构
参考文献示例
参 考 文 献
1 埃克尔,陈号鹏.Java编程思想中文.第4版.北京:机械工业出版社机械,2007
2 蔡翠平.Java程序设计.北京:北方交通大学出版社,清华大学出版社,2004
3 候国峰.面向对象程序设计导论. 北京:电子工业出版社,2002
4 叶核亚,陈立.Java2程序设计实用教程.北京:电子工业出版社, 2005
5 陈天河.Java数据库高级编程宝典.北京:电子工业出版社,2005
6 程峰,黄若波,章恒翀.Java 2核心技术.第6版.北京:机械工业出版社,2003
7 Vikram Vaswani,许小青译.MySQL完全手册.北京:电子工业出版社,2004
8 杜波依斯,杨涛.MySQL权威指南.第2版.北京:机械工业出版社,2004
9 王珊,萨师煊.数据库系统概论.第4版.北京:机械工业出版社,2006
10 郑人杰,殷人昆,陶永雷.实用软件工程.北京:清华大学出版社,1997