Android(安卓)一个简单的聊天界面的实现(eclipse实现)
这几天刚刚学习一下安卓的编程,尝试制作了一个简单的聊天界面(还没有实现网络等后续功能)软件界面如图。(使用eclipse实现)
当输入一些内容后,聊天界面可以下拉显示更多的聊天信息,如下图
首先对这个聊天软件的界面进行一个总结,要能够实现聊天信息的下拉功能,需要使用ListView空间,文字输入界面需要使用EditView,按钮的实验需要用到Button,关于按钮,需要为按钮添加相关的事件,关于ListView,需要为其添加适配器,这个后面一步步的来进行。
首先,是修改activity_main.xml 文件,使其呈现出一个聊天界面的框架。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><ListViewandroid:id="@+id/msg_list_view"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1" ></ListView><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><EditTextandroid:id="@+id/input_text"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:hint="Type somthing here"android:maxLines="2" /><Buttonandroid:id="@+id/send"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Send" /></LinearLayout>
</LinearLayout>
Button空间中的text=“Send”语句,编译器提示警告,一般程序员都知道,警告的东西往往可以忽略。其实这样写也不算错误,但是不是非常的规范,一般情况下,都是定义一个字符串的名字,这里直接饮用了字符串的名字,然后字符串的名字与字符串的对应关系在string.xml文件中存储,这才是规范的使用方式。具体这个细节大家有兴趣的可以再去查一下相关资料。这里的警告我们就忽视他就好了。
可以看到通过上述的xml代码,我们就已经实现了这个聊天界面的外观,其中layout_weight这个属性非常重要,这个属性表示在屏幕空间的剩余部分,按照layout_weight所表示的比例来占据空间的大小(不懂的查一下,网上有些资料说的很详细了),然后考虑实现它的一些简单的功能。
我们定义一个消息类Msg,其代码如下
public class Msg {
public static final int TYPE_RECEIVED = 0;
public static final int TYPE_SENT = 1;
private String content;
private int type;
public Msg(String content, int type) {
this.content = content;
this.type = type;
}
public String getContent() {
return content;
}
public int getType() {
return type;
}
}
Msg类中只有两个字段,content表示消息的内容,type 表示消息的类型。其中消息类型有两个值可选,TYPE_RECEIVED 表示这是一条收到的消息,TYPE_SENT 表示这是一条发出的消息。
接着来编写 ListView子项的布局,新建 msg_item.xml,代码如下所示:
<?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"android:padding="10dp" ><LinearLayoutandroid:id="@+id/left_layout"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="left"><TextViewandroid:id="@+id/left_msg"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_margin="10dp"android:textColor="#fff" /></LinearLayout><LinearLayoutandroid:id="@+id/right_layout"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="right"><TextViewandroid:id="@+id/right_msg"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_margin="10dp" /></LinearLayout>
</LinearLayout>
这里把发送消息和接收消息的布局全部都写在了一个文件里,稍后的使用中,我们通过调整其可见性,就可以分别实现发送和接收消息的布局,例如发送的消息,就把接收消息的布局设置为不可见即可。
接下来需要创建 ListView的适配器类,让它继承自 ArrayAdapter,并将泛型指定为 Msg类。新建类 MsgAdapter,代码如下
class ViewHolder {LinearLayout leftLayout;LinearLayout rightLayout;TextView leftMsg;TextView rightMsg;}public class MsgAdapter extends ArrayAdapter<Msg> {private int resourceId;public MsgAdapter(Context context, int textViewResourceId, List<Msg>objects) {super(context, textViewResourceId, objects);resourceId = textViewResourceId;}
@Overridepublic View getView(int position, View convertView, ViewGroup parent) {Msg msg = getItem(position);View view;ViewHolder viewHolder;if (convertView == null) {view = LayoutInflater.from(getContext()).inflate(resourceId, null);viewHolder = new ViewHolder();viewHolder.leftLayout = (LinearLayout) view.findViewById(R.id.left_layout);viewHolder.rightLayout = (LinearLayout) view.findViewById(R.id.right_layout);viewHolder.leftMsg = (TextView) view.findViewById(R.id.left_msg);viewHolder.rightMsg = (TextView) view.findViewById(R.id.right_msg);view.setTag(viewHolder);} else {view = convertView;viewHolder = (ViewHolder) view.getTag();}if (msg.getType() == Msg.TYPE_RECEIVED) {
// 如果是收到的消息,则显示左边的消息布局,将右边的消息布局隐藏viewHolder.leftLayout.setVisibility(View.VISIBLE);viewHolder.rightLayout.setVisibility(View.GONE);viewHolder.leftMsg.setText(msg.getContent());} else if(msg.getType() == Msg.TYPE_SENT) {
// 如果是发出的消息,则显示右边的消息布局,将左边的消息布局隐藏viewHolder.rightLayout.setVisibility(View.VISIBLE);viewHolder.leftLayout.setVisibility(View.GONE);viewHolder.rightMsg.setText(msg.getContent());}return view;}
}
在整个过程中,编译器会提示一些出错的地方,愿意是没有导入相应的包,只需要按照编译器的提示中的第一条,将相应的包导入后,错误的部分即可消除。
最后修改 MainActivity中的代码,来为 ListView初始化一些数据,并给发送按钮加入事件响应,代码如下
public class MainActivity extends Activity {private ListView msgListView;private EditText inputText;private Button send;private MsgAdapter adapter;private List<Msg> msgList = new ArrayList<Msg>();
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);initMsgs(); // 初始化消息数据adapter = new MsgAdapter(MainActivity.this, R.layout.msg_item, msgList);inputText = (EditText) findViewById(R.id.input_text);send = (Button) findViewById(R.id.send);msgListView = (ListView) findViewById(R.id.msg_list_view);msgListView.setAdapter(adapter);send.setOnClickListener(new OnClickListener() {
@Overridepublic void onClick(View v) {String content = inputText.getText().toString();if (!"".equals(content)) {Msg msg = new Msg(content, Msg.TYPE_SENT);msgList.add(msg);adapter.notifyDataSetChanged(); // 当有新消息时,刷新ListView中的显示msgListView.setSelection(msgList.size()); // 将ListView定位到最后一行inputText.setText(""); // 清空输入框中的内容}}});
}
private void initMsgs() {Msg msg1 = new Msg("Hello guy.", Msg.TYPE_RECEIVED);msgList.add(msg1);Msg msg2 = new Msg("Hello. Who is that?", Msg.TYPE_SENT);msgList.add(msg2);Msg msg3 = new Msg("This is Tom. Nice talking to you. ", Msg.TYPE_RECEIVED);msgList.add(msg3);}
}
在这个文件中,我们初始化出了一些消息,并且为按钮添加的事件的响应。
至此,这个聊天界面的小程序已经完成,已经可以导入手机并在手机上运行了。
2015年9月29日 西安交通大学
Android(安卓)一个简单的聊天界面的实现(eclipse实现)相关推荐
- Android 极光IM简单的聊天界面全手动实现
Android 极光IM简单的聊天界面全手动实现 说到实时通讯,很多人都想到融云,极光,环信,网易啊等等一系列, 因为需求原因,我们最近的项目呢是用的极光. 由于极光的界面Demo十分繁琐,很多功能我 ...
- Android适配器以及作用,Android Studio:自定义Adapter(适配器)的一些通俗易懂的理解(以一个简单的聊天界面为例)...
本文是博主对Adapter(适配器)的一些理解,为了加深对Adapter的理解以及记录自己的阶段学习而写,同时也适合初学者阅读,参考本条博客的逻辑进行学习. 第一 先来看看实现这个程序需要需要创建哪 ...
- Android Jetpack Compose——一个简单的微信界面
一个简单的微信界面 简述 效果视频 底部导航栏 导航元素 导航栏 放入插槽 绘制地图 消息列表 效果图 实现 聊天 效果图 实现 气泡背景 联系人界面 效果图 实现 好友详情 效果图 实现 发现 效果 ...
- 一个简单可以聊天的聊天界面
一个简单QQ聊天界面 1, 代码实现 2, 效果图 3, 仿QQ聊天系统资源下载 具体代码实现如下: package com.cts.entity;import java.awt.*; import ...
- android实现计算器功能吗,利用Android实现一个简单的计算器功能
利用Android实现一个简单的计算器功能 发布时间:2020-11-20 16:25:01 来源:亿速云 阅读:90 作者:Leah 今天就跟大家聊聊有关利用Android实现一个简单的计算器功能, ...
- 通信软件基础B-重庆邮电大学-Java-编程实现一个简单的聊天程序-多线程编程实现
实验任务六 编程实现一个简单的聊天程序-多线程编程实现 1. 系统设计要求 编程实现一个简单的聊天程序,实现两台计算机间的信息交互,使用多线程编程实现:可同时连接多个客户端,服务器收到客户端发送的消息 ...
- WebSocket(二) -- 使用原生webSocket实现一个简单的聊天
上文中,我们已经基本了解了webscoket的原理以及部分api的实现,接下来我们就使用websocket来实现一个简单的聊天室功能. 1. 需求分析 1.1 登陆聊天室: 1.2 登陆成功后与别人进 ...
- 用ServletContext做一个简单的聊天室
这里主要是ServletContext的一个特性:ServletContext是一个公共的空间,可以被所有的客户访问.由此可见ServletContext比cookie和session的作用范围要大[ ...
- Netty - 一个简单的聊天室小项目
经过一段时间对Netty的学习,我们对Netty各版本以及像ProtocolBuffers等技术应用都有了不少相关的了解, 我们就用这段时间学到的只是做一个简单的聊天室的小项目来练习自己学到的技术. ...
最新文章
- 三个数字的运算规律预测
- java 工厂的变形模拟的各种应用
- Windows系统下的各类用户角色
- 命令行下安装的tensorflow怎么打开_CourseMaker微课制作教程18:录ppt一直“正在打开……”及WPS下ppt满屏放映怎么办?...
- 8 包含min函数的栈
- 员工辞职,多留几天只会怠工
- tkinter教程_Tkinter教程–第2部分
- 坐标求四面体体积_给定4个点坐标求四面体体积
- android 停止服务方法,Android编程实现开始及停止service的方法
- iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 80 -j DNAT ...
- Oracle12.2c统一审计(unified auditing)六问
- golang 解析 --- 进程,线程,协程
- 好家伙,这几个隐藏功能,太香了
- Python学习案例2——数独解题及出题程序
- linux强制关闭程序快捷键,Linux 使用、ctrl+z或screen后台运行命令程序的方法
- 你所不知道的精神分裂症
- 七牛云配置二级域名,从而避免七牛云30天自动更改域名的问题
- 290页12万字数字乡村项目规划建设方案
- you-get:使用命令行工具下载网络资源,可下载 B 站视频
- 海信电视可以刷鸿蒙系统吗,海信电视通用刷机教程
热门文章
- 【算法数据结构Java实现】时间复杂度为O(n)的最大和序列
- 深度学习人体姿态估计算法综述
- The LMAX disruptor Architecture--转载
- 解决java.sql.SQLException: Parameter number X is not an OUT parameter--转
- 【大数据-Hadoop】Hive
- 从程序员的角度分析微信小程序
- 李彦宏透露百度真正的护城河
- Spring Cloud Alibaba - 25 Gateway-路由断言工厂Route Predicate Factories谓词工厂示例及源码解析
- Android常见XML属性解析
- 系统优化怎么做-Tomcat优化