这个作品有五个界面:首页、登录、注册、好友、聊天。实现了一些简易的功能,连接服务器进行登录和注册功能,显示了好友列表,借鉴别人的聊天页面。
试运行用户:
用户名:123
密码:???? 123
在这个页面进行应用打开缓冲,根据登录状态信息判断进行页面跳转,未登录-》登录界面、登录-》好友界面。
在这个界面进行登录信息输入,连接服务器验证信息,正确跳转到好友界面,并存储登录信息和状态,下次打开应用不必登录,错误进行提醒。如果无账号,点击新用户,进入注册页面
该页面进行注册功能,连接服务器,进行注册,注册成功进入登录界面,也可以点击返回,返回登录界面
显示好友消息,好友消息,如果不退出登录,下次打开应用进入此界面。点击退出登录,会清除登录信息,点击好友进入聊天页面。
该页面进行聊天,可发送字符和表情,未连接服务器。点击返回键返回好友界面。
app应用
MainActivity
publicclass?MainActivity?extends?Activity {
????@Override
????protectedvoid?onCreate(Bundle savedInstanceState) {
????????super.onCreate(savedInstanceState);
????????setContentView(R.layout.activity_main);
???????
????????//登录信息检测
????????String flag=user();
???????/*flag="1";*/
???????
????????if(flag.equals("0")){
?????????
????????Intent intent=new?Intent(this,Login.class);
????????startActivity(intent);
???????
????????}else?{
???????
????????Intent intent=new?Intent(this,Index.class);
???????
????????Bundle bundle=new?Bundle();
????????//传递name参数为tinyphp
????????bundle.putString("username", flag);
????????intent.putExtras(bundle);
???????
????????startActivity(intent);
???????
??????}
????}
????//登录信息查看
????public?String user(){
????? ContextotherAppsContext;
????? Stringusername="";
????? Stringflag="0";
??????try?{
????????otherAppsContext = createPackageContext("com.example.qq", Context.CONTEXT_IGNORE_SECURITY);
????????SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences("user", Context.MODE_WORLD_READABLE);
?????? ? username = sharedPreferences.getString("username",?"0");
?????? ? flag = sharedPreferences.getString("flag",?"0");
??????}?catch?(NameNotFoundException e) {
????????//?TODO?Auto-generatedcatch block
????????e.printStackTrace();
??????}
??????if?(flag.equals("0")) {
????????return"0";
??????}?else?{
????????return?username;
??????}
?????
????}
????@Override
????publicboolean?onCreateOptionsMenu(Menu menu){
????????// Inflate the menu; this adds items to the action bar if it is present.
????????getMenuInflater().inflate(R.menu.main, menu);
????????returntrue;
????}
????@Override
????publicboolean?onOptionsItemSelected(MenuItemitem) {
????????// Handle action bar item clicks here. The action bar will
????????// automatically handle clicks on the Home/Up button, so long
????????// as you specify a parent activity in AndroidManifest.xml.
????????int?id = item.getItemId();
????????if?(id == R.id.action_settings) {
????????????returntrue;
????????}
????????returnsuper.onOptionsItemSelected(item);
????}
}
Login.java
publicclass?Login?extends?Activity{
??
???privatestaticintF?= 0;
???EditText?eText1,eText2;
???String?username="",password="",i="";
??
???@Override
???protectedvoid?onCreate(Bundle savedInstanceState) {
??????//?TODO?Auto-generatedmethod stub
??????super.onCreate(savedInstanceState);
??????setContentView(R.layout.activity_login);
?????
??????eText1=(EditText) findViewById(R.id.editText1);
??????eText2=(EditText) findViewById(R.id.editText2);
?????
?????
?????
???}
??
???//登录按钮点击方法
??
???publicvoid?Btn1OnClick(View view){
?????
?????
??????username=eText1.getText().toString();
??????password=eText2.getText().toString();
?????
??????if(username.length()==0||password.length()==0){
????????
???????? Toast.makeText(getApplicationContext(),"账号密码不能为空!",
?????????? ? Toast.LENGTH_SHORT).show();
????????
????? }else{
???????? Runnable t =?new?Runnable(){ ????????????????//线程
???????????@Override
???????????publicvoid?run() {
???????????//?TODO?Auto-generatedmethod stub
??????????????i=login(username,password);
??????????????System.out.println(i);
??????????????F=1;
???????????}
???????????};
???????
???????????new?Thread(t).start();
??????????
???????????//等待服务器传来的结果
??????????
???????????while?(F!=1) {
?????????????
?????????????
???????????}
???????????System.out.println(" i= "+i);
?????????????
???????????//结果判定
??????????
??????????????if(i.equals("1")){
?????????????????System.out.println("-1-");
?????????????????Toast.makeText(getApplicationContext(),?"登录成功!",
??????????????? ? Toast.LENGTH_SHORT).show();
????????????????
?????????????????userInfo(username,?password,?"1");
????????????????
?????????????????Intent intent=new?Intent(this,Index.class);
??????????????????Bundlebundle=new?Bundle();
??????????????????????//传递name参数为tinyphp
?????????????????????bundle.putString("username",?username);
?????????????????????intent.putExtras(bundle);
?????????????????????startActivity(intent);
????????????????
????????????????
??????????????}else{
?????????????????System.out.println("-0-");
?????????????????Toast.makeText(getApplicationContext(),?"账号或密码错误!",
??????????????? ? Toast.LENGTH_SHORT).show();
????????????????
??????????????}
?????????????
?????????????
??????????????System.out.println("---");
????????
????? }
???????
????}
??
???//登录信息保存
??
???publicvoid?userInfo(String username,String password,String flag){
??????SharedPreferences sharedPreferences = getSharedPreferences("user", Context.MODE_PRIVATE);
??????Editor editor = sharedPreferences.edit();//获取编辑器
??????editor.putString("username", username);
??????editor.putString("password", password);
??????editor.putString("flag", flag);
??????editor.commit();
???}
??
???//注册按钮
???publicvoid?Btn2OnClick(View view){???
?????????
??????Toast.makeText(getApplicationContext(),?"欢迎新用户!",
?????????? ? Toast.LENGTH_SHORT).show();
?????
??????Intent intent=new?Intent(this,Regist.class);
??????????startActivity(intent);
????}
??
???//链接服务器
??
???private?String login(String username,String password){
??????//1??声明一些变量
??????String flag="";
??????URL url =?null;
??????HttpURLConnection conn=null;
??????String requestBody="";//请求体
??????String?responseBody="";//响应体
?????
??????try?{
????????//url=newURL("http://10.0.2.2:8080/Chapter_13_Networking_server/servlet/LoginServlet");
????????url =?new?URL("http://10.0.2.2:8080/QQ_Server/servlet/LoginServlet");
??????????
??????}?catch?(MalformedURLException e) {
????????//?TODO?Auto-generatedcatch block
????????e.printStackTrace();
??????}
??????System.out.println("url=");
????????//2?发送用户名和密码到服务器??post
??????try{
??????conn=(HttpURLConnection)url.openConnection();
???????
??????conn.setRequestMethod("POST");??//POST
??????conn.setDoOutput(true);//设置请求体
???????
??????OutputStream os=conn.getOutputStream();
??????System.out.println("username=");
??????requestBody=new?String("username="+username+"&password="+password);
??????os.write(requestBody.getBytes("utf-8"));
??????os.flush();
??????os.close();
??????}
??????catch(Exception ex){
????????ex.printStackTrace();
??????}
??????System.out.println("1");
??????//5.接收数据
??try?{
????? InputStreamis=conn.getInputStream();
//??????byte []buffer=new byte[1024];
//??????while(in.available()!=0){
//?????????in.read(buffer);
//?????????responseBody=responseBody+buffer.toString();
//??????}
//????//6??
//??????String?msg=new String(responseBody.getBytes("utf-8"));
//???
??????byte??[]temp? ;
?????
?????
???????ByteArrayOutputStreamoutSteam =?new?ByteArrayOutputStream();
???????System.out.println("1");
???????????byte[] buffer =?newbyte[1024];?
???????????int?len = -1;?
???????????while?((len =is.read(buffer)) != -1) {?
??????????????outSteam.write(buffer, 0, len);?
?????????? }?
??????????outSteam.close();?
?????????? is.close();?
?????????? temp=outSteam.toByteArray();
?????
?????
?????
????????//获得响应头
????????//responseHeader = getResponseHeader(conn);
???????
???????
????????String msg =?new?String(temp,"UTF-8");
????????
??????? System.out.println("---msg="+msg);
???????
??????? flag=msg;
???????
??????}?catch?(IOException e) {
????????//?TODO?Auto-generatedcatch block
????????e.printStackTrace();
??????}
??System.out.println("flag="+flag);
???return?flag;
?????
?????
?????
?????
???}
??
??
??
???//返回键监听,返回桌面
???publicboolean?onKeyDown(int?keyCode, KeyEvent event) {
???????if?(keyCode ==KeyEvent.KEYCODE_BACK) {
?????????? Intent home =?new?Intent(Intent.ACTION_MAIN);
??????????home.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
??????????home.addCategory(Intent.CATEGORY_HOME);
????????? ?startActivity(home);
???????????returntrue;
?????? }
???????returnsuper.onKeyDown(keyCode,event);
???}
??
??
??
}
Regist
publicclass?Regist?extends?Activity{
???privatestaticintF?= 0;
???EditText?eText1,eText2;
???String?username="",password="",i="";
??
???protectedvoid?onCreate(Bundle savedInstanceState) {
??????//?TODO?Auto-generatedmethod stub
??????super.onCreate(savedInstanceState);
??????requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
??????setContentView(R.layout.activity_regist);
?????
??????//标题打开
??????getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.regist_title);
?????
??????eText1=(EditText) findViewById(R.id.editText1);
??????eText2=(EditText) findViewById(R.id.editText2);
?????
???}
???//返回
???publicvoid?BlackOnClick(View view){???
?????????
??????Intent intent=new?Intent(this,Login.class);
??????????startActivity(intent);
?????????? Regist.this.finish();
????}
???//注册
???publicvoid?RegistOnClick(View view){???
??????
?????
?????????username=eText1.getText().toString();
?????????password=eText2.getText().toString();
????????
?????????if(username.length()==0||password.length()==0){
??????????
?????????? Toast.makeText(getApplicationContext(),"账号密码不能为空!",
????????????? ? Toast.LENGTH_SHORT).show();
??????????
???????? }else{
?????????? Runnable t =?new?Runnable(){ ????????????????//线程
??????????????@Override
??????????????publicvoid?run() {
??????????????//?TODO?Auto-generatedmethod stub
?????????????????i=regist(username,password);
?????????????????System.out.println(i);
?????????????????F=1;
??????????????}
??????????????};
??????????
??????????????new?Thread(t).start();
??????????????//等待结果
??????????????while?(F!=1) {
????????????????
????????????????
??????????????}
??????????????System.out.println(" i= "+i);
????????????????
?????????????????if(i.equals("1")){
????????????????????System.out.println("-1-");
????????????????????Toast.makeText(getApplicationContext(),?"注册成功!",
?????????????????? ? Toast.LENGTH_SHORT).show();
???????????????????
???????????????????
???????????????????
????????????????????Intent intent=new?Intent(this,Login.class);
????????????????????????startActivity(intent);
???????????????????
???????????????????
?????????????????}else{
????????????????????System.out.println("-0-");
????????????????????Toast.makeText(getApplicationContext(),?"注册失败!",
?????????????????? ? Toast.LENGTH_SHORT).show();
???????????????????
?????????????????}
????????????????
????????????????
?????????????????System.out.println("---");
???????? ??
???????? }
??
????}
??
???//注册服务器链接
???private?String regist(String username,String password){
??????//1??声明一些变量
??????String flag="";
??????URL url =?null;
??????HttpURLConnection conn=null;
??????String requestBody="";//请求体
??????String?responseBody="";//响应体
?????
??????try?{
????????//url=new URL("http://10.0.2.2:8080/Chapter_13_Networking_server/servlet/LoginServlet");
????????url =?new?URL("http://10.0.2.2:8080/QQ_Server/servlet/RegistServlet");
??????????
??????}?catch?(MalformedURLException e) {
????????//?TODO?Auto-generatedcatch block
????????e.printStackTrace();
??????}
??????System.out.println("url=");
????????//2?发送用户名和密码到服务器??post
??????try{
??????conn=(HttpURLConnection)url.openConnection();
???????
??????conn.setRequestMethod("POST");??//POST
??????conn.setDoOutput(true);//设置请求体
???????
??????OutputStream os=conn.getOutputStream();
??????System.out.println("username=");
??????requestBody=new?String("username="+username+"&password="+password);
??????os.write(requestBody.getBytes("utf-8"));
??????os.flush();
??????os.close();
??????}
??????catch(Exception ex){
????????ex.printStackTrace();
????? }
??????System.out.println("1");
??????//5.接收数据
??try?{
????? InputStreamis=conn.getInputStream();
//??????byte []buffer=new byte[1024];
//??????while(in.available()!=0){
//?????????in.read(buffer);
//?????????responseBody=responseBody+buffer.toString();
//??????}
//????//6??
//??????String?msg=new String(responseBody.getBytes("utf-8"));
//???
??????byte??[]temp? ;
?????
?????
???????ByteArrayOutputStreamoutSteam =?new?ByteArrayOutputStream();
???????System.out.println("1");
???????????byte[] buffer =?newbyte[1024];?
???????????int?len = -1;?
???????????while?((len =is.read(buffer)) != -1) {?
??????????????outSteam.write(buffer, 0, len);?
?????????? }?
??????????outSteam.close();?
?????????? is.close();?
?????????? temp=outSteam.toByteArray();
?????
?????
?????
????????//获得响应头
????????//responseHeader = getResponseHeader(conn);
???????
???????
????????String msg =?new?String(temp,"UTF-8");
????????
??????? System.out.println("---msg="+msg);
???????
??????? flag=msg;
???????
??????}?catch?(IOException e) {
????????//?TODO?Auto-generatedcatch block
????????e.printStackTrace();
??????}
??System.out.println("flag="+flag);
???return?flag;
?????
?????
?????
?????
???}
??
???publicboolean?onKeyDown(int?keyCode, KeyEvent event) {
???????if?(keyCode ==KeyEvent.KEYCODE_BACK) {
?????????? Intent home =?new?Intent(Intent.ACTION_MAIN);
??????????home.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
??????????home.addCategory(Intent.CATEGORY_HOME);
?????????? startActivity(home);
???????????returntrue;
?????? }
???????returnsuper.onKeyDown(keyCode,event);
???}
}
Index.java
publicclass?Index?extends?Activity{
??
???private?List<UserInfo>?userInfos=new?ArrayList<UserInfo>();
???private?ListAdapter?adapter;
???private?ListView?mListView;
??
???EditText?eText;
??
???protectedvoid?onCreate(Bundle savedInstanceState) {
??????//?TODO?Auto-generatedmethod stub
??????super.onCreate(savedInstanceState);
??????requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
??????setContentView(R.layout.activity_index);
?????
??????//listview数据填充
?????
??????initView();
??????//标题打开
??????getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.index_title);
?????
??????//item点击方法
?????
??????mListView.setOnItemClickListener(new?OnItemClickListener() {
????????@Override
????????publicvoid?onItemClick(AdapterView<?> parent, View view,
??????????????int?position,?long?id) {
???????????Intent intent=new?Intent(Index.this,Chat.class);
????????????Bundle bundle=new?Bundle();
????????????????//传递name参数为tinyphp
???????????????bundle.putString("chat",view.findViewById(R.id.name).toString());
???????????????intent.putExtras(bundle);
???????????????startActivity(intent);
??????????
????????}
???????
???????
??????}
???????????);
???????
?????
??????Bundle bundle =?this.getIntent().getExtras();
????????//接收name值
????????String username = bundle.getString("username");
???????
????????System.out.println(username);
???????
???????
??????
???????
???????
??
???}
??
??
??
??
???privatevoid?initView() {
??????mListView?= (ListView) findViewById(R.id.listView1);
??????//新增數據
?????
???????
??????UserInfo userInfo=new?UserInfo(R.drawable.h1,?"张辉",?"在吗?");
??????UserInfo userInfo1=new?UserInfo(R.drawable.h2,?"流浪",?"附加费更痛苦");
??????UserInfo userInfo2=new?UserInfo(R.drawable.h3,?"联想",?"啊啊啊");
??????UserInfo userInfo3=new?UserInfo(R.drawable.h4,?"作者",?"ddd");
??????UserInfo userInfo4=new?UserInfo(R.drawable.h5,?"0o搜索o0",?"hello");
??????UserInfo userInfo5=new?UserInfo(R.drawable.h1,?"书橱",?"呜呜呜");
??????userInfos.add(userInfo);
??????userInfos.add(userInfo1);
??????userInfos.add(userInfo2);
??????userInfos.add(userInfo3);
??????userInfos.add(userInfo4);
??????userInfos.add(userInfo5);
?????
?????
??????//初始化数据源
??????adapter?=?new?ListAdapter(this,userInfos);
??????mListView.setAdapter(adapter);
?????
?????
??????}
?????
???//退出登录方法
??
???publicvoid?LogoutOnClick(View view){???
?????????
?????
??????System.out.println(1);
??????Context otherAppsContext;
??????//清除登录数据
??????try?{
????????otherAppsContext = createPackageContext("com.example.qq", Context.CONTEXT_IGNORE_SECURITY);
????????SharedPreferences sharedPreferences =otherAppsContext.getSharedPreferences("user", Context.MODE_WORLD_READABLE);
????????SharedPreferences.Editor editor = sharedPreferences.edit();
????????editor.clear();
????????editor.commit();
??????}?catch?(NameNotFoundException e) {
????????//?TODO?Auto-generatedcatch block
????????e.printStackTrace();
??????}
?????
???System.out.println(2);
?????
???Intent intent=new?Intent(this,Login.class);
????startActivity(intent);
????Index.this.finish();
????}
??
??
??
??
???publicboolean?onKeyDown(int?keyCode, KeyEvent event) {
???????if?(keyCode ==KeyEvent.KEYCODE_BACK) {
?????????? Intent home =?new?Intent(Intent.ACTION_MAIN);
??????????home.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
??????????home.addCategory(Intent.CATEGORY_HOME);
?????????? startActivity(home);
???????????returntrue;
?????? }
???????returnsuper.onKeyDown(keyCode,event);
???}
}
Chat.java
publicclass?Chat?extends?Activity?implements?OnClickListener,OnRefreshListenerHeader{
???private?ViewPager?mViewPager;
???private?LinearLayout?mDotsLayout;
???private?MyEditText?input;
???private?Button?send;
???private?DropdownListView?mListView;
???private?ChatLVAdapter?mLvAdapter;
??
???private?LinearLayout?chat_face_container;
???private?ImageView?image_face;//表情图标
???// 7列3行
???privateintcolumns?= 6;
???privateintrows?= 4;
???private?List<View>?views?=?new?ArrayList<View>();
???private?List<String>?staticFacesList;
???private?LinkedList<ChatInfo>?infos?=?new?LinkedList<ChatInfo>();
???private?SimpleDateFormat?sd;
??
???private?String?reply="";//模拟回复
???@SuppressLint("SimpleDateFormat")
???privatevoid?initViews() {
??????mListView?= (DropdownListView) findViewById(R.id.message_chat_listview);
??????sd=new?SimpleDateFormat("MM-ddHH:mm");
??????//模拟收到信息
??????infos.add(getChatInfoFrom("你好啊!"));
??????infos.add(getChatInfoFrom("认识你很高兴#[face/png/f_static_018.png]#"));
??????mLvAdapter?=?new?ChatLVAdapter(this,?infos);
??????mListView.setAdapter(mLvAdapter);
??????//表情图标
??????image_face=(ImageView) findViewById(R.id.image_face);
??????//表情布局
??????chat_face_container=(LinearLayout) findViewById(R.id.chat_face_container);
??????mViewPager?= (ViewPager) findViewById(R.id.face_viewpager);
??????mViewPager.setOnPageChangeListener(new?PageChange());
??????//表情下小圆点
??????mDotsLayout?= (LinearLayout) findViewById(R.id.face_dots_container);
??????input?= (MyEditText) findViewById(R.id.input_sms);
??????input.setOnClickListener(this);
??????send?= (Button) findViewById(R.id.send_sms);
??????InitViewPager();
??????//表情按钮
??????image_face.setOnClickListener(this);
??????//?发送
??????send.setOnClickListener(this);
?????
??????mListView.setOnRefreshListenerHead(this);
??????mListView.setOnTouchListener(new?OnTouchListener() {
????????@Override
????????publicboolean?onTouch(View arg0, MotionEvent arg1) {
???????????if(arg1.getAction()==MotionEvent.ACTION_DOWN){
??????????????if(chat_face_container.getVisibility()==View.VISIBLE){
?????????????????chat_face_container.setVisibility(View.GONE);
??????????????}
???????????}
???????????returnfalse;
????????}
??????});
???}
??
???@Override
???publicvoid?onClick(View arg0) {
??????switch?(arg0.getId()) {
??????case?R.id.input_sms://输入框
????????if(chat_face_container.getVisibility()==View.VISIBLE){
???????????chat_face_container.setVisibility(View.GONE);
????????}
????????break;
??????case?R.id.image_face://表情
????????hideSoftInputView();//隐藏软键盘
????????if(chat_face_container.getVisibility()==View.GONE){
???????????chat_face_container.setVisibility(View.VISIBLE);
????????}else{
???????????chat_face_container.setVisibility(View.GONE);
????????}
????????break;
??????case?R.id.send_sms://发送
????????reply=input.getText().toString();
????????if?(!TextUtils.isEmpty(reply)) {
???????????infos.add(getChatInfoTo(reply));
???????????mLvAdapter.setList(infos);
???????????mLvAdapter.notifyDataSetChanged();
???????????mListView.setSelection(infos.size() - 1);
???????????new?Handler().postDelayed(new?Runnable() {
??????????????@Override
??????????????publicvoid?run() {
?????????????????infos.add(getChatInfoFrom(reply));
?????????????????mLvAdapter.setList(infos);
?????????????????mLvAdapter.notifyDataSetChanged();
?????????????????mListView.setSelection(infos.size() - 1);
??????????????}
???????????}, 1000);
???????????input.setText("");
????????}
????????break;
??????default:
????????break;
??????}
???}
???/*
????*?初始表情?*
????*/
???privatevoid?InitViewPager() {
??????//?获取页数
??????for?(int?i = 0; i < getPagerCount(); i++) {
????????views.add(viewPagerItem(i));
????????LayoutParams params =?new?LayoutParams(16, 16);
????????mDotsLayout.addView(dotsItem(i), params);
??????}
??????FaceVPAdapter mVpAdapter =?new?FaceVPAdapter(views);
??????mViewPager.setAdapter(mVpAdapter);
??????mDotsLayout.getChildAt(0).setSelected(true);
???}
???private?View viewPagerItem(int?position) {
??????LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
??????View layout = inflater.inflate(R.layout.face_gridview,?null);//表情布局
??????GridView gridview = (GridView) layout.findViewById(R.id.chart_face_gv);
??????/**
???????*?注:因为每一页末尾都有一个删除图标,所以每一页的实际表情columns *rows - 1;?空出最后一个位置给删除图标
???????* */
??????List<String> subList =?new?ArrayList<String>();
??????subList.addAll(staticFacesList
???????????.subList(position * (columns?*?rows?- 1),
?????????????????(columns?*?rows?- 1) * (position + 1) >?staticFacesList
??????????????????????.size() ??staticFacesList.size() : (columns
??????????????????????*?rows?- 1)
??????????????????????* (position + 1)));
??????/**
???????*?末尾添加删除图标
???????* */
??????subList.add("emotion_del_normal.png");
??????FaceGVAdapter mGvAdapter =?new?FaceGVAdapter(subList,?this);
??????gridview.setAdapter(mGvAdapter);
??????gridview.setNumColumns(columns);
??????//?单击表情执行的操作
??????gridview.setOnItemClickListener(new?AdapterView.OnItemClickListener() {
????????@Override
????????publicvoid?onItemClick(AdapterView<?> parent, View view,int?position,?long?id) {
???????????try?{
??????????????String png = ((TextView) ((LinearLayout) view).getChildAt(1)).getText().toString();
??????????????if?(!png.contains("emotion_del_normal")) {//?如果不是删除图标
?????????????????insert(getFace(png));
??????????????}?else?{
?????????????????delete();
??????????????}
???????????}?catch?(Exception e) {
??????????????e.printStackTrace();
???????????}
????????}
??????});
?????
??????return?gridview;
???}
???private?SpannableStringBuilder getFace(String png) {
??????SpannableStringBuilder sb =?new?SpannableStringBuilder();
??????try?{
????????/**
?????????*?经过测试,虽然这里tempText被替换为png显示,但是但我单击发送按钮时,获取到輸入框的内容是tempText的值而不是png
?????????*?所以这里对这个tempText值做特殊处理
?????????*?格式:#[face/png/f_static_000.png]#,以方便判斷當前圖片是哪一個
?????????* */
????????String tempText =?"#["?+ png +?"]#";
????????sb.append(tempText);
????????sb.setSpan(
??????????????new?ImageSpan(Chat.this, BitmapFactory
????????????????????.decodeStream(getAssets().open(png))),sb.length()
????????????????????- tempText.length(), sb.length(),
??????????????Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
??????}?catch?(Exception e) {
????????e.printStackTrace();
??????}
??????return?sb;
???}
???/**
????*?向输入框里添加表情
????* */
???privatevoid?insert(CharSequence text) {
??????int?iCursorStart = Selection.getSelectionStart((input.getText()));
??????int?iCursorEnd = Selection.getSelectionEnd((input.getText()));
??????if?(iCursorStart != iCursorEnd) {
????????((Editable)?input.getText()).replace(iCursorStart, iCursorEnd,?"");
??????}
??????int?iCursor = Selection.getSelectionEnd((input.getText()));
??????((Editable)?input.getText()).insert(iCursor, text);
???}
???/**
????*?删除图标执行事件
????*?注:如果删除的是表情,在删除时实际删除的是tempText即图片占位的字符串,所以必需一次性删除掉tempText,才能将图片删除
????* */
???privatevoid?delete() {
??????if?(input.getText().length() != 0) {
????????int?iCursorEnd = Selection.getSelectionEnd(input.getText());
????????int?iCursorStart = Selection.getSelectionStart(input.getText());
????????if?(iCursorEnd > 0) {
???????????if?(iCursorEnd == iCursorStart) {
??????????????if?(isDeletePng(iCursorEnd)) {
?????????????????String st =?"#[face/png/f_static_000.png]#";
?????????????????((Editable)?input.getText()).delete(
??????????????????????iCursorEnd - st.length(), iCursorEnd);
??????????????}?else?{
?????????????????((Editable)?input.getText()).delete(iCursorEnd - 1,
??????????????????????iCursorEnd);
??????????????}
???????????}?else?{
??????????????((Editable)?input.getText()).delete(iCursorStart,
????????????????????iCursorEnd);
???????????}
????????}
??????}
???}
???/**
????*?判断即将删除的字符串是否是图片占位字符串tempText?如果是:则讲删除整个tempText
????* **/
???privateboolean?isDeletePng(int?cursor) {
??????String st =?"#[face/png/f_static_000.png]#";
??????String content =?input.getText().toString().substring(0, cursor);
??????if?(content.length() >= st.length()) {
????????String checkStr = content.substring(content.length() -st.length(),
??????????????content.length());
????????String regex =?"(\\#\\[face/png/f_static_)\\d{3}(.png\\]\\#)";
????????Pattern p = Pattern.compile(regex);
????????Matcher m = p.matcher(checkStr);
????????return?m.matches();
??????}
??????returnfalse;
???}
???private?ImageView dotsItem(int?position) {
??????LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
??????View layout = inflater.inflate(R.layout.dot_image,?null);
??????ImageView iv = (ImageView) layout.findViewById(R.id.face_dot);
??????iv.setId(position);
??????return?iv;
???}
???/**
????*?根据表情数量以及GridView设置的行数和列数计算Pager数量
????*?@return
????*/
???privateint?getPagerCount() {
??????int?count =?staticFacesList.size();
??????return?count % (columns?*?rows?- 1) == 0 ? count / (columns?*?rows?- 1)
???????????: count / (columns?*?rows?- 1) + 1;
???}
???/**
????*?初始化表情列表staticFacesList
????*/
???privatevoid?initStaticFaces() {
??????try?{
????????staticFacesList?=?new?ArrayList<String>();
????????String[] faces = getAssets().list("face/png");
????????//将Assets中的表情名称转为字符串一一添加进staticFacesList
????????for?(int?i = 0; i < faces.length; i++) {
???????????staticFacesList.add(faces[i]);
????????}
????????//去掉删除图片
????????staticFacesList.remove("emotion_del_normal.png");
??????}?catch?(Exception e) {
????????e.printStackTrace();
??????}
???}
???/**
????*?表情页改变时,dots效果也要跟着改变
????* */
???class?PageChange?implements?OnPageChangeListener {
??????@Override
??????publicvoid?onPageScrollStateChanged(int?arg0) {
??????}
??????@Override
??????publicvoid?onPageScrolled(int?arg0,?float?arg1,?int?arg2) {
??????}
??????@Override
??????publicvoid?onPageSelected(int?arg0) {
????????for?(int?i = 0; i <?mDotsLayout.getChildCount(); i++) {
???????????mDotsLayout.getChildAt(i).setSelected(false);
????????}
????????mDotsLayout.getChildAt(arg0).setSelected(true);
??????}
???}
???/**
????*?发送的信息
????*?@param?message
????*?@return
????*/
???private?ChatInfo getChatInfoTo(String message) {
??????ChatInfo info =?new?ChatInfo();
??????info.content?= message;
??????info.fromOrTo?= 1;
??????info.time=sd.format(new?Date());
??????return?info;
???}
??
???/**
????*?接收的信息
????*?@param?message
????*?@return
????*/
???private?ChatInfo getChatInfoFrom(String message) {
??????ChatInfo info =?new?ChatInfo();
??????info.content?= message;
??????info.fromOrTo?= 0;
??????info.time=sd.format(new?Date());
??????return?info;
???}
??
???@SuppressLint("HandlerLeak")
???private?Handler?mHandler?=?new?Handler() {
??????@Override
??????publicvoid?handleMessage(Message msg) {
????????switch?(msg.what) {
????????case?0:
???????????mLvAdapter.setList(infos);
???????????mLvAdapter.notifyDataSetChanged();
???????????mListView.onRefreshCompleteHeader();
???????????break;
????????}
??????}
???};
???@Override
???protectedvoid?onCreate(Bundle savedInstanceState) {
??????super.onCreate(savedInstanceState);
??????setContentView(R.layout.chat_main);
??????initStaticFaces();
??????initViews();
???}
???@Override
???publicvoid?onRefresh() {
??????new?Thread() {
????????@Override
????????publicvoid?run() {
???????????try?{
??????????????sleep(1000);
??????????????Message msg =?mHandler.obtainMessage(0);
??????????????mHandler.sendMessage(msg);
???????????}?catch?(InterruptedException e) {
??????????????e.printStackTrace();
???????????}
????????}
??????}.start();
???}
??
???publicvoid?hideSoftInputView() {
??????InputMethodManager manager = ((InputMethodManager)?this.getSystemService(Activity.INPUT_METHOD_SERVICE));
??????if?(getWindow().getAttributes().softInputMode?!= WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN) {
????????if?(getCurrentFocus() !=?null)
?????????? manager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
??????}
???}
}