一、登录界面

本来是只想仿一个qq的聊天界面的,顺便做了一个登录界面,熟悉下SharedPreferences(解释一下:SharedPreferences由于非常适合记录一些零散的简单的数据,因此登录界面的相关信息的记录就是通过它进行记录的)的使用,这里是自己设计的一个登录界面,实现了用户登录账户名和密码的记录。

布局:

这里的布局很简单就是一个头像(ImageView)、用户名、密码(EditText)、记住密码(CheckBox)、登录(Button)。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="center"android:background="@drawable/background_logo"android:orientation="vertical" ><ImageView
        android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_marginTop="50dp"android:src="@drawable/myheadimg" /><LinearLayout
        android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:orientation="horizontal" ><EditText
            android:id="@+id/useraccount"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="QQ号/手机号/邮箱" /></LinearLayout><LinearLayout
        android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><EditText
            android:id="@+id/password"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="密码" android:password="true"/></LinearLayout><RelativeLayout
        android:layout_width="match_parent"android:layout_height="wrap_content" ><Button
            android:id="@+id/button_login"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_alignParentRight="true"android:background="#0000"android:padding="20dp"android:text="登录"android:textColor="#ffffff"android:textSize="18sp" /><CheckBox
            android:id="@+id/checkbox_remember"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_alignParentLeft="true"android:background="#0000"android:padding="20dp"android:text="记住密码"android:textColor="#ffffff"android:textSize="18sp" /></RelativeLayout></LinearLayout>

activity

package com.example.mylittlechart;import java.io.FileInputStream;
import java.io.InputStreamReader;import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;import android.os.Bundle;
import android.os.Environment;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.Toast;public class Mylogin extends Activity implements OnClickListener,OnCheckedChangeListener{private EditText medit_useracount;private EditText medit_password;private CheckBox mcheckbox_remember;private Button mbutton_login;private Intent mintent;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.login_layout);medit_useracount=(EditText) findViewById(R.id.useraccount);medit_password=(EditText) findViewById(R.id.edittext_words);mcheckbox_remember=(CheckBox) findViewById(R.id.checkbox_remember);mbutton_login=(Button) findViewById(R.id.button_login);mintent=new Intent(getApplicationContext(),MainActivity.class);mbutton_login.setOnClickListener(this);//用于数据的回显,通过从info文件中获得数据//从而使点击back后再打开也是有数据的readaccount();}@Overridepublic void onClick(View v) {switch(v.getId()){case R.id.button_login:{//点击登录按钮后开启聊天界面 mcheckbox_remember.setOnCheckedChangeListener(this);    startActivity(mintent);Toast.makeText(getApplicationContext(), "登录成功", Toast.LENGTH_SHORT).show();//Mylogin.this.finish();}break;default:break;}}@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {if(isChecked){//sharedpreferance非常适合保存零散的简单的数据,这里使用它来保存用户名和密码//路径data/data/……SharedPreferences sp=getSharedPreferences("info", MODE_PRIVATE);//设置属性,90%为私有//拿到SharedPreferences的编辑器Editor ed=sp.edit();//将数据放入ed.putString("name", medit_useracount.getText().toString());ed.putString("password", medit_password.getText().toString());//最后记得提交ed.commit();}       }public void readaccount() {SharedPreferences sp=getSharedPreferences("info", MODE_PRIVATE);//90%为私有String name=sp.getString("name","");String password=sp.getString("password", "");medit_useracount.setText(name);medit_password.setText(password);
}}

二聊天界面

聊天界面的注意点与小技巧比较多,主要有:
重点内容
1、对主界面布局时就将GridView(用于弹出表情界面的布局)布局在主界面中,只是先设置其属性为GONE(不可见也不占空间),在点击表情按钮时以popupwindow形式弹出。
2、关于界面的左右显示问题,也是涉及到跟GridView相同的技巧,根据信息是谁传递的设置visibliti为GONE or VISIBLE
3、富文本的转换问题,将EditText的内容转换为CHarSequence类型的方法。medittext_words.getText().subSequence(0, medittext_words.getText().toString().length())转成富文本之后,TextView中是可以显示富文本的,将富文本放置TextView中,显示在界面中即可。
4、在这里我编写了一个可以简化FindViewById的BaseActivity类,其他需要用到FindViewById以后都可以直接继承BaseActivity,用generateFindViewById方法代替FindViewById,但是在这个仿聊天界面的例子中并未起到作用。这里作为优化代码的一种方式展示一下。
5、该例子中还涉及到了全屏的问题,这个问题不再详细介绍,有不会的可以参考我之前博客。

ListView布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity" android:orientation="vertical"><LinearLayout
          android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:background="@color/blue"android:weightSum="6"><Button
        android:id="@+id/button_back"android:layout_width="30dp"android:layout_height="30dp"android:background="@drawable/back"/><TextView android:layout_height="wrap_content"android:layout_width="wrap_content"android:layout_gravity="center"android:layout_weight="5"android:gravity="center_horizontal"android:text="我的聊天室"    android:textColor="@color/withe"    /></LinearLayout><ListView
        android:id="@+id/listview"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:divider="#0000" android:transcriptMode="normal"></ListView><LinearLayout android:layout_width="match_parent"android:layout_height="wrap_content"  android:orientation="horizontal"android:weightSum="5"android:gravity="bottom"><Button
        android:id="@+id/leftsend"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1" android:text="你说"/><Button
        android:id="@+id/biaoqingsend"android:layout_width="20dp"android:layout_height="20dp"android:layout_gravity="center_vertical"android:background="@drawable/hi"/><EditText android:id="@+id/edittext_words"android:layout_width="0dp"android:layout_height="wrap_content"android:hint="你想说的话语"android:layout_weight="3"android:maxLines="2"/><Button android:id="@+id/rightsend"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="我说"/>
</LinearLayout>
<GridView android:id="@+id/mygridview"android:layout_width="match_parent"android:layout_height="wrap_content"android:numColumns="5"android:layout_weight="1"android:visibility="gone"></GridView>
</LinearLayout>

message_layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><LinearLayout
        android:id="@+id/left_linear"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="5dp"android:layout_marginTop="5dp" ><ImageView
            android:id="@+id/img_you"android:layout_width="40dp"android:layout_height="40dp"android:src="@drawable/yourimg" android:layout_weight="0"/><TextView
            android:id="@+id/textview_left"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/yousend"android:text="你说 " android:gravity="left"android:textSize="20sp"           android:layout_marginRight="10dp"android:layout_gravity="center"android:layout_weight="1"/></LinearLayout><LinearLayout
        android:id="@+id/right_linear"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="right"android:layout_marginRight="5dp"android:layout_marginTop="5dp" ><TextView
            android:id="@+id/textview_right"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/mysend"android:text="我说"           android:layout_gravity="center"android:textSize="20sp"android:gravity="right"android:layout_marginLeft="10dp"android:layout_weight="1"/><ImageView
            android:id="@+id/img_my"android:layout_width="40dp"android:layout_height="40dp"android:src="@drawable/myimg" /></LinearLayout></LinearLayout>

Message(类)

package com.example.mylittlechart;import android.text.Spanned;public class Message {public static final int TYPE_YOU=1;public static final int TYPE_MY=0;private CharSequence words;private int type;public Message(CharSequence words, int type) {super();this.words = words;this.type = type;}public CharSequence getWords() {return words;}public void setWords(CharSequence words) {this.words = words;}public int getType() {return type;}public void setType(int type) {this.type = type;}}

MessageAdapter

package com.example.mylittlechart;import java.util.List;import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;public class MessageAdapter extends BaseAdapter{private List<Message> mMessage;private LayoutInflater minfInflater; public MessageAdapter(List<Message> mMessage, LayoutInflater minfInflater) {super();this.mMessage = mMessage;this.minfInflater = minfInflater;}@Overridepublic int getCount() {return mMessage.size();}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {//  mMessageViewHolder vh;if(convertView==null){convertView=minfInflater.inflate(R.layout.message_layout, null);vh=new ViewHolder();vh.textview_left=(TextView) convertView.findViewById(R.id.textview_left);vh.textview_right=(TextView) convertView.findViewById(R.id.textview_right);vh.img_you=(ImageView) convertView.findViewById(R.id.img_you);vh.img_my=(ImageView) convertView.findViewById(R.id.img_my);vh.left_linear=(LinearLayout) convertView.findViewById(R.id.left_linear);vh.right_linear=(LinearLayout) convertView.findViewById(R.id.right_linear);convertView.setTag(vh);}else{vh=(ViewHolder) convertView.getTag();}Message message=mMessage.get(position); if(message.getType()==Message.TYPE_YOU){vh.left_linear.setVisibility(View.VISIBLE);vh.right_linear.setVisibility(View.GONE);vh.textview_left.setText(message.getWords());}if(message.getType()==Message.TYPE_MY){vh.left_linear.setVisibility(View.GONE);vh.right_linear.setVisibility(View.VISIBLE);vh.textview_right.setText(message.getWords());}return convertView;}class ViewHolder{TextView textview_left;TextView textview_right;ImageView img_you;ImageView img_my;LinearLayout left_linear;LinearLayout right_linear;}}

MainActivity

package com.example.mylittlechart;import java.util.ArrayList;
import java.util.List;import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.inputmethodservice.Keyboard;
import android.os.Bundle;
import android.text.Html;
import android.text.Spanned;
import android.text.Html.ImageGetter;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;public class MainActivity extends BaseAcitivity implements android.view.View.OnClickListener,OnItemClickListener{private ListView mlistview_content;private Button mbtn_leftsend;private Button mbtn_rightsend;private EditText medittext_words;private Button mbutton_back;private Button mbutton_biaoqing;private List<Message> mMessage=new ArrayList<Message>();;private LayoutInflater minflater;private View mview;private MessageAdapter madapter;private PopupWindow mpopwindow;private ExpressionSend expressionsend;private GridView mgridview;private List<Myexpression> mMyexpressions;private MyexpressionAdapter madaptergrid;private boolean flag;private Spanned span;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);mlistview_content=generateFindViewById(R.id.listview);medittext_words=generateFindViewById(R.id.edittext_words);mbtn_leftsend=generateFindViewById(R.id.leftsend);mbtn_rightsend=generateFindViewById(R.id.rightsend);mbutton_back=generateFindViewById(R.id.button_back);mbutton_biaoqing=generateFindViewById(R.id.biaoqingsend);mpopwindow=new PopupWindow();mgridview=(GridView) findViewById(R.id.mygridview);minflater=getLayoutInflater();initData();madaptergrid=new MyexpressionAdapter(mMyexpressions,minflater);mgridview.setAdapter(madaptergrid);mgridview.requestFocus();mbtn_leftsend.setOnClickListener(this);mbtn_rightsend.setOnClickListener(this);mbutton_back.setOnClickListener(this);mbutton_biaoqing.setOnClickListener(this);mview=minflater.inflate(R.layout.message_layout, null);madapter=new MessageAdapter(mMessage,minflater);mlistview_content.setAdapter(madapter);}@Overridepublic void onClick(View v) {switch(v.getId()){case R.id.leftsend:{leftmessage();}break;case R.id.rightsend:{rightmessage();}break;case R.id.biaoqingsend:{popwindow();//弹出gridview界面}break;case R.id.button_back:{MainActivity.this.finish();}break;default:break;}}public void leftmessage(){     Message message=new Message(medittext_words.getText().subSequence(0, medittext_words.getText().toString().length()), 1);mMessage.add(message);madapter.notifyDataSetChanged();medittext_words.setText("");}public void rightmessage(){Message message=new Message(medittext_words.getText().subSequence(0, medittext_words.getText().toString().length()), 0);mMessage.add(message);madapter.notifyDataSetChanged();medittext_words.setText("");}private void popwindow() {if(flag){mgridview.setVisibility(View.VISIBLE); flag=!flag;}else{mgridview.setVisibility(View.GONE);flag=!flag;}mgridview.setOnItemClickListener(this);LayoutInflater inflater=getLayoutInflater();View popwindowview=inflater.inflate(R.layout.gridview, null);mpopwindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);mpopwindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);mpopwindow.setContentView(popwindowview);mpopwindow.setFocusable(false);mpopwindow.setOutsideTouchable(true);mpopwindow.showAsDropDown(mbutton_back);}@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {final int imggetterid=mMyexpressions.get(position).getImg_biaoqing();ImageGetter imggetter=new ImageGetter() {@Overridepublic Drawable getDrawable(String source) {Drawable drawable=getResources().getDrawable(imggetterid);drawable.setBounds(0,0,40,40);return drawable;}};span=Html.fromHtml("<img src=''/>",imggetter,null);medittext_words.append(span);   }private void initData() {mMyexpressions=new ArrayList<Myexpression>();Myexpression myexpression0=new Myexpression(R.drawable.dianwo);mMyexpressions.add(myexpression0);  Myexpression myexpression1=new Myexpression(R.drawable.a);mMyexpressions.add(myexpression1);Myexpression myexpression2=new Myexpression(R.drawable.apple);mMyexpressions.add(myexpression2);Myexpression myexpression3=new Myexpression(R.drawable.xihan);mMyexpressions.add(myexpression3);Myexpression myexpression4=new Myexpression(R.drawable.xihuan);mMyexpressions.add(myexpression4);Myexpression myexpression5=new Myexpression(R.drawable.liuhan);mMyexpressions.add(myexpression5);Myexpression myexpression6=new Myexpression(R.drawable.kelian);mMyexpressions.add(myexpression6);  Myexpression myexpression7=new Myexpression(R.drawable.heng);mMyexpressions.add(myexpression7);Myexpression myexpression8=new Myexpression(R.drawable.ganga);mMyexpressions.add(myexpression8);Myexpression myexpression9=new Myexpression(R.drawable.kaixin);mMyexpressions.add(myexpression9);}}

键盘界面的弹出设置

在我们的程序不进行设置时,当我们已进入聊天界面,软键盘将会自动弹出,下面是一种解决方法。
1、在Mainnifest中的Activity添加

android:windowSoftInputMode="adjustResize|stateHidden"

2、在ListView中添加

android:transcriptMode="normal"

Android 仿qq聊天界面之一相关推荐

  1. android 仿微信聊天界面 以及语音录制功能,Android仿微信录制语音功能

    本文实例为大家分享了Android仿微信录制语音的具体代码,供大家参考,具体内容如下 前言 我把录音分成了两部分 1.UI界面,弹窗读秒 2.一个类(包含开始.停止.创建文件名功能) 第一部分 由于6 ...

  2. Android仿微信聊天界面

    今天说说android的仿微信聊天界面,我只想说两个字:坑爹 项目已经传到了github: https://github.com/hebiao6446/Hantu-android- 还好我写过iOS仿 ...

  3. Android仿QQ主界面-------完善篇

    在我前面的博文中,做出了仿QQ主界面的主要工作,博文地址:Android仿QQ主界面. 但是在那一篇中还有一个不起眼的地方没做,今天就完善它. 今天要实现在文字下面来个ImageView,实现动画.先 ...

  4. Android—简单的仿QQ聊天界面

    最近仿照QQ聊天做了一个类似界面,先看下界面组成(画面不太美凑合凑合呗,,,,): 其中聊天背景可以是一个LinearLayout或者RelativeLayout里面存放的是ListView(将Lis ...

  5. android仿qq聊天项目点评,android 实现qq聊天对话界面效果

    [实例简介] Android UI[android 仿微信.QQ聊天,带表情,可翻页,带翻页拖动缓冲] 博客介绍http://blog.csdn.net/lnb333666/article/detai ...

  6. UI界面编写(仿QQ聊天界面)

    UI界面编写实战 这里我们模拟QQ聊天的主界面,编写一个简单的聊天界面. 项目描述 首先搭建我们的主界面,在最上边放一个标题栏,然后是一个ListView,用于展示发送的消息,最下边是选择要发送的表情 ...

  7. Android仿QQ登录界面示例,实现登录、注册功能。

    首语 欢迎大家关注我的公众号:八归少年 微信公众号优先更新文章.扫描上面二维码即可关注!一起进步,一同成长. Android开发经常用到注册.登录功能,于是便整理出一般通用的登录界面,并实现其相应功能 ...

  8. android模拟微信聊天功能,android仿微信聊天界面 语音录制功能

    本例为模仿微信聊天界面UI设计,文字发送以及语言录制UI. 1先看效果图: 第一:chat.xml设计 android:layout_width="fill_parent" and ...

  9. android高仿微信下拉有页面,Android——(仿微信聊天界面布局实例)

    今天看郭霖<第一行代码>书上写了一个聊天窗体的小例子,自己就练习学了一下.加上一些自己的理解整理了一下. 1.第一步首先是制作9.patch图片,这个在android  sdk 目录下to ...

最新文章

  1. 清华姚班/智班2020级新生来了!中国奥数新晋“一姐”在列,湖南、湖北人数最多...
  2. 敏捷开发中如何做质量管理?
  3. 2006.08.10
  4. JavaScript实现京东购物车页基础面效果
  5. python中json格式数据输出实现方式(无unicode编码输出形式)
  6. idea 构建spring_以Spring方式构建企业Java应用程序
  7. 三星Galaxy Note20新旗舰发布会官宣:8月5日线上见
  8. Etcd服务发现原理
  9. 树莓派能直接运行python程序_在树莓派上运行python脚本 - python
  10. IT成长日记(二)——联想打印机
  11. [渝粤教育] 信阳师范学院 奥尔夫音乐教育 参考 资料
  12. 主板知识详解:主板结构
  13. 使用tensorflow进行简单的强化学习 1—Q-learning
  14. Python编程:函数
  15. 【区块链实战】什么是 P2P 网络,区块链和 P2P 网络有什么关系
  16. 使用Nexus搭建Maven私服、私服下载与上传
  17. 车流量 题解-【统计】
  18. Protege Tutorial
  19. 从前有座灵剑山--理想以及狂热(6)
  20. Android Studio安装超详细步骤(包括SDK安装不成功,模拟器无法创建等问题)

热门文章

  1. iPhone4 iOS 4.3.3 更换“新增”短信铃声
  2. 普耐尔momo7w安装Linux,momo7w安装单系统(安卓)或双系统(安卓+windows)教程第七次修订版.doc...
  3. Word07横竖版混排如何保持装订时页码位置不变
  4. Pixel-安卓系统刷机指南
  5. python函数分为哪几种_python常用函数
  6. oracle各种函数的使用
  7. fastadmin升级bootstrap遇到的问题
  8. 高仿交通银行手机客户端界面
  9. 一文看懂:史上最通俗的视频编码技术详解
  10. (Vue)Vue课后题