个人仿制android QQ、android大作业

仿制android QQ说明

app下载地址:http://download.csdn.net/download/h18733517027/10258434

服务器下载:http://download.csdn.net/download/h18733517027/10258435

说明下载:http://download.csdn.net/download/h18733517027/10258480

1、概要

这个作品有五个界面:首页、登录、注册、好友、聊天。实现了一些简易的功能,连接服务器进行登录和注册功能,显示了好友列表,借鉴别人的聊天页面。

试运行用户:

用户名:123

密码:     123

2、首页界面、

在这个页面进行应用打开缓冲,根据登录状态信息判断进行页面跳转,未登录-》登录界面、登录-》好友界面。

3、 登录界面

在这个界面进行登录信息输入,连接服务器验证信息,正确跳转到好友界面,并存储登录信息和状态,下次打开应用不必登录,错误进行提醒。如果无账号,点击新用户,进入注册页面

4、注册界面

该页面进行注册功能,连接服务器,进行注册,注册成功进入登录界面,也可以点击返回,返回登录界面

5、好友界面

显示好友消息,好友消息,如果不退出登录,下次打开应用进入此界面。点击退出登录,会清除登录信息,点击好友进入聊天页面。

 

 

6、聊天界面(参考网上教程)

该页面进行聊天,可发送字符和表情,未连接服务器。点击返回键返回好友界面。

 

7、代码简述

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;//表情图标

   // 73

   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);

      }

   }

 

}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/46526.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

仿写App,如何获取app内的图片资源?以安卓机为例

​ 获取到App的apk包 有些安卓手机中&#xff0c;长按该app图标&#xff0c;会有个弹窗&#xff0c;弹窗里有分享按钮&#xff0c; 分享出去的就是一个apk包 修改后缀 把apk包的后缀名改为.zip 解压zip包 使用解压工具&#xff0c;解压zip包&#xff0c;会获得该app内的所…

豁然开朗篇:安卓开发中关于内存那些事

你所写的每一句代码&#xff0c;在内存里是怎么分布的&#xff0c;搞清楚这个问题&#xff0c;你对编程的理解又上升到一个高度了 前言 首先&#xff0c;如果对于java虚拟机的内存划分不清楚的同学&#xff0c;可以先去了解一下java虚拟机把java程序加载到内存以及内存的分布是…

基于Android的背单词软件【源码+文档+答辩PPT】

目录 1、关于本课题 2、开发平台 3、系统分析 3.1 国外安卓应用发展的现状 3.2 国内安卓应用发展的现状 3.3 系统构建目标分析 3.4 系统构建功能分析 3.4.1 系统的总体架构 3.4.2 系统功能模块 3.4.3 应用功能规划图 4、系统设计 4.1 前台背单词展示子系统详细设计 …

自动驾驶:硬件平台

自动驾驶的研发流程 大致可以分为以下4个步骤&#xff1a; 软件在环 软件在环是基于仿真和模拟的软件仿真&#xff0c;类似于赛车类游戏。即是在软件系统里仿真模拟出真实的道路环境如光照、天气等自然环境&#xff0c;开发者可将自动驾驶代码开发完毕后&#xff0c;在仿真系…

自动驾驶(五十)---------Gtest测试

本文将介绍单元测试工具Google Test&#xff08;GTest&#xff09;在Linux操作系统中测试环境的搭建方法。本文属于Google Test使用的基础教程。在Linux中使用Google Test之前&#xff0c;需要对如下知识有一些了解&#xff1a; C/C编程方法 makefile的编写 Linux命令行操作 GT…

BEV感知:BEVDet

自动驾驶&#xff1a;BEVDet IntroductionMethodoloData AugmentationNetwork StructureScale-NMS 实验 Introduction 作者通过现有的算法&#xff08;LSS&#xff09;、独特的数据增强方案与新的NMS方案整合了一个BEV框架&#xff08;BEVDet&#xff09;。 如下图&#xff1a…

【自动驾驶】高级辅助驾驶系统与车联网

【自动驾驶】高级辅助驾驶系统与车联网 Note&#xff1a;本文是对刘春晖教授的 高级辅助驾驶系统与车联网(上)&#xff0c;高级辅助驾驶系统与车联网(下) 论文进行排版整理&#xff0c;由于论文中插图较多&#xff0c;并没有全部整理进来&#xff0c;用能力的小伙伴请看原文 文…

自动驾驶技术

高精地图&#xff08;HD Maps&#xff09;&#xff1a;支持其他模块 定位&#xff08;Localization&#xff09;&#xff1a;讨论汽车如何确定他所处的位置&#xff0c;汽车利用激光和雷达数据&#xff0c;将这些传感器感知内容与高分辨地图进行对比&#xff0c;这种对比使得汽…

自动驾驶仿真软件简介----CARLAGazeboLGSVLOthers

CARLA CARLA 是一个开源模拟器&#xff0c;它使自主驾驶研究领域平民化。模拟器是开源的&#xff0c;是基于虚幻引擎开发的。它是一个模块化和灵活的工具&#xff0c;配备了强大的API来支持ADAS系统的培训和验证。因此&#xff0c;CARLA试图满足ADAS各种用例的要求&#xff0c…

自动驾驶概述

自动驾驶概述 邱辉俊&#xff08;少隆&#xff09; 高德技术 2021-09-28 11:37 导读 汽车行业处在一个变革的时代&#xff0c;自动驾驶相关技术发展应用如火如荼。关注或者想了解这个领域的人也越来越多。本文的目标在于帮助大家对自动驾驶技术有一个全局的基础认识。文章分别…

Google 悄悄更新:你发布的内容都将被用于 AI 训练

世上没有绝对的垃圾&#xff0c;只有放错位置的资源。在数字原住民的 Z 世代的口口相传中&#xff0c;「互联网时代 99%的公开信息都是垃圾」的粗略定义早已见怪不怪了&#xff0c;而有趣的是&#xff0c;彼之砒霜&#xff0c;我之蜜糖&#xff0c;以 Google 为代表的 AI巨头却…

文案智能改写-AI智能文章改写软件

随着人工智能技术的不断发展&#xff0c;越来越多的智能写作软件相继面世&#xff0c;其中&#xff0c;AI智能改写工具是一款非常有实用价值的工具。本文将从全自动批量改写、没有错别字和标准语法、支持图文模式改写、支持各种语言改写以及严格按照标准格式结构改写几个方面&a…

AIGC产生内容的版权到底归属于谁?

随着ChatGPT的火热&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;产生的内容越来越被大众使用&#xff0c;但是&#xff0c;有一个问题一直困扰着大家&#xff0c;包括放牛娃。那就是&#xff1a;AIGC产生的内容&#xff0c;有版权吗&#xff1f;版权到底归属于谁&…

33款可用来抓数据的开源爬虫软件工具

要玩大数据&#xff0c;没有数据怎么玩&#xff1f;这里推荐一些33款开源爬虫软件给大家。 爬虫&#xff0c;即网络爬虫&#xff0c;是一种自动获取网页内容的程序。是搜索引擎的重要组成部分&#xff0c;因此搜索引擎优化很大程度上就是针对爬虫而做出的优化。 网络爬虫是一个…

IntelliJ IDEA,真有你的!

因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享 点击关注#互联网架构师公众号&#xff0c;领取架构师全套资料 都在这里 0、2T架构师学习资料干货分 上一篇&#xff1a;ChatGPT研究框架&#xff08;80页PPT&#xff0c;附下载&#xff09;…

盘点一个Jupyter显示的细节问题

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 弦弦掩抑声声思&#xff0c;似诉平生不得志。 大家好&#xff0c;我是皮皮。 一、前言 前几天在Python白银群【小王子】问了一个Python基础的问题&…

5.1劳动节,Cocos社区年度精品大盘点!幸运抽奖,周边好礼送送送~

Cocos 引擎的生态建设与繁荣&#xff0c;离不开社区开发者的辛勤付出。 2022.5 ~ 2023.5 年度期间&#xff0c;有这样一批 Cocos 社区开发者&#xff0c;他们使用 Cocos Creaor 引擎创作内容与产品、分享技术和经验&#xff0c;为 Cocos 社区默默贡献自己的一份力量&#xff0c…

5.1劳动节,致敬最可爱的人!Cocos社区杰出贡献者出炉

Cocos 引擎的生态建设与繁荣&#xff0c;离不开社区开发者的辛勤付出。 2022.5 ~ 2023.5 年度期间&#xff0c;有这样一批 Cocos 社区开发者&#xff0c;他们使用 Cocos Creaor 引擎创作内容与产品、分享技术和经验&#xff0c;为 Cocos 社区默默贡献自己的一份力量&#xff0c…

都说今年高考作文很难?AI花5秒写了几篇,专家给满分,引爆全网热议!

来源 | 浙江新闻 每一年高考作文题目公布起 社交网络上就会掀起 “一年一度高考作文写作大赛” 今年&#xff0c;浙江语文采用新课标I卷 作文题目与“故事”有关 我们分别请ChatGPT、 文心一言、通义千问等大模型 来写了写今年的高考作文 ↓↓↓ ChatGPT 故事的力量&am…

AI聊天机器人,你更爱哪个?

嗨,各位同学,最近这几个人工智能助手可是火得很啊! 叮咚~AI哥们儿ChatGPT已经很强了,轻松应对各种问题,文笔挺不错的! 咻~Anthropic公司的Claude也很给力,聊天能力十分强大! 嗖~Google新出的Bard看着也很厉害,刚一出世就引起不小轰动! 面对这三个AI大佬,我们该如何抉择呢?今天…