Android Studio实现智能聊天
作者:醉流年 发布时间:2021-10-03 09:56:18
标签:Android,Studio,聊天
本文实例为大家分享了Android Studio实现智能聊天的具体代码,供大家参考,具体内容如下
1、布局activit_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:id="@+id/recycle">
</androidx.recyclerview.widget.RecyclerView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<EditText
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/input"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/send"
android:text="发送"/>
</LinearLayout>
</LinearLayout>
2、创建子布局msg_item,显示聊天对话框
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:padding="10dp"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/left_layout"
android:layout_gravity="left"
android:background="@drawable/message_left">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:layout_marginTop="10dp"
android:id="@+id/left_msg"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/right_layout"
android:layout_gravity="right"
android:layout_marginLeft="10dp"
android:background="@drawable/message_right">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:layout_marginTop="10dp"
android:id="@+id/right_msg"/>
</LinearLayout>
3、创建类Msg获取数据
public class Msg {
public static final int MSG_RECEIVED = 0;
public static final int MSG_SEND =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;
}
}
4、创建RecyclerView的适配器,MsgAdapter继RecyclerView.Adapter<MsgAdapter.ViewHolder>
public class MsgAdapter extends RecyclerView.Adapter<MsgAdapter.ViewHolder> {
private List<Msg> mMsgList;
public class ViewHolder extends RecyclerView.ViewHolder {
LinearLayout leftLayout;
TextView leftMsg;
LinearLayout rightLayout;
TextView rightMsg;
public ViewHolder(@NonNull View itemView) {
super(itemView);
leftLayout=itemView.findViewById(R.id.left_layout);
rightLayout=itemView.findViewById(R.id.right_layout);
leftMsg=itemView.findViewById(R.id.left_msg);
rightMsg=itemView.findViewById(R.id.right_msg);
}
}
public MsgAdapter(List<Msg> msgList){
mMsgList=msgList;
}
@NonNull
@Override
public MsgAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.msg_item,parent,false);
ViewHolder holder=new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull MsgAdapter.ViewHolder holder, int position) {
Msg msg=mMsgList.get(position);
if (msg.getType()==Msg.MSG_RECEIVED){
holder.leftLayout.setVisibility(View.VISIBLE);
holder.rightLayout.setVisibility(View.GONE);
holder.leftMsg.setText(msg.getContent());
}else if (msg.getType()==Msg.MSG_SEND){
holder.leftLayout.setVisibility(View.GONE);
holder.rightLayout.setVisibility(View.VISIBLE);
holder.rightMsg.setText(msg.getContent());
}
}
@Override
public int getItemCount() {
return mMsgList.size();
}
5、创建 RobotManager类封装网络,网络地址:青云客,智能聊天机器人
public class RobotManager {
private static String Url="http://api.qingyunke.com/api.php?key=free&appid=0&msg=!!";
public static String getUrl(String question){
String real_Url=Url.replace("!!",question);
return real_Url;
}
}
6、逻辑
public class MainActivity extends AppCompatActivity {
private static String TAG="MainActivity";
private List<Msg> msgList = new ArrayList<>();
private EditText input;
private RecyclerView recyclerView;
private LinearLayoutManager manager;
private Button button;
private MsgAdapter adapter;
private String input_text;
private StringBuilder response;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
//获取解析数据,显示在Recycle中
Bundle data = msg.getData();
String result = data.getString("result");
Msg msg_get = new Msg(result, Msg.MSG_RECEIVED);
msgList.add(msg_get);
//数据刷新
adapter.notifyItemInserted(msgList.size() - 1);
recyclerView.scrollToPosition(msgList.size() - 1);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initMsg();//初始化数据
recyclerView = findViewById(R.id.recycle);
button = findViewById(R.id.send);
input = findViewById(R.id.input);
manager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(manager);
adapter = new MsgAdapter(msgList);
recyclerView.setAdapter(adapter);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
input_text = input.getText().toString();
Msg msg = new Msg(input_text, Msg.MSG_SEND);
msgList.add(msg);
adapter.notifyItemInserted(msgList.size() - 1);
recyclerView.scrollToPosition(msgList.size() - 1);
input.setText("");
getInter(); //发起网络请求
}
});
}
private void getInter() {
//开起线程
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection connection = null;
BufferedReader reader = null;
try {
URL url = new URL(RobotManager.getUrl(input_text));
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setReadTimeout(8000);
connection.setConnectTimeout(8000);
InputStream in = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(in));
StringBuilder response = new StringBuilder();
String line = "";
while ((line = reader.readLine()) != null) {
response.append(line);
}
// 2,解析获得的数据
Gson gson=new Gson();
Msg msg=gson.fromJson(response.toString(),Msg.class);
Log.d(TAG, "result:" + msg.getType());
Log.d(TAG, "content:" + msg.getContent());
// 3,将解析的数据保存到 Message中,传递到主线程中显示
Bundle data=new Bundle();
Message msg1=new Message();
if (msg.getType()==0){
data.putString("result",msg.getContent());
}else {
data.putString("result","我不知道你在说什么!");
}
msg1.setData(data);
msg1.what=1;
handler.sendMessage(msg1);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (connection != null) {
connection.disconnect();
}
}
}
}).start();
}
private void initMsg() {
Msg msg = new Msg("我是菲菲,快来和我聊天吧!", Msg.MSG_RECEIVED);
msgList.add(msg);
}
}
来源:https://blog.csdn.net/weixin_63307826/article/details/123942426


猜你喜欢
- 问题分析疑惑满满小枫听到这个面试题的时候,心想这是什么水面试官,怎么问这么简单的题目,心想一个for循环加上equal判断再删除不就完事了吗
- 在上篇文章给大家介绍了Android开发之开发者头条(一)启动页实现,感兴趣的朋友可以参考下。title: 带你实现开发者头条(二) 实现左
- 序列化与反序列化序列化:把对象转换成字节的过程,称为对象序列化反序列化:把字节恢复成对象的过程,称为反序列化对象的持久化概念:把字节保存的硬
- 快捷键是很多软件的常用功能,本文实例讲解了三种方法来实现C# button快捷键,如Alt + *(按钮快捷键),Ctrl+*及其他组合键等
- 一:什么是classpath?classpath指的就是 *.java文件,资源文件等编译后存放的位置,对于maven项目就是指 targe
- 本文通过介绍了Asp.Net中MVC缓存的种类,以及他们之间的区别等内容,让学习者能够深入的了解MVC缓存的原理机制,以下是具体内容:缓存是
- 本文实例讲述了Android编程实现二维码的生成与解析。分享给大家供大家参考,具体如下:直接上代码,代码上面有具体的解析,并且提供jar供下
- 一个非常简单的登录权限 * ,具体代码如下:以下代码是继承OncePerRequestFilter实现登录过滤的代码:/** * * @
- 本文实例讲述了C#修改IIS站点framework版本号的方法。分享给大家供大家参考。具体如下:使用ASP.NET IIS 注册工具 (As
- InheritableThreadLocal的作用: 当我们需要在子线程中使用父线程中的值得时候我们就可以像使用ThreadLocal那样来
- 目录前言实现思路实测前言需求 导出Excel:本身以为是一个简单得导出,但是每行得记录文件中有一列为图片url,需要下载所有记录行对应得图片
- 概述新版的音悦台 APP 播放页面交互非常有意思,可以把播放器往下拖动,然后在底部悬浮一个小框,还可以左右拖动,然后回弹的时候也会有相应的效
- 一、IDEA自带打包插件内容:此种方式可以自己选择制作胖包或者瘦包,但推荐此种方式制作瘦包。输出:输出目录在out目录下流程步骤:第一步:
- 一、导言1.1 介绍桥接模式及其应用背景桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以
- ??是一个二元运算符,如果左操作数非空,则返回左操作数,否则返回右操作数,所以,在一些特定的场合可以用它来代替?:运算符,简化代码书写。例1
- 在前台请求数据的时候,sql语句一直都是打印到控制台的,有一个想法就是想让它打印到日志里,该如何做呢?见下面的mybatis配置文件:<
- 继承反应了类和类之间的关系。世界上很多事物都是有共性的,共性的那一部分我们就抽象为基类,用于派生其它类,这样提高了代码的复用性,使得代码的结
- Android Handler的使用,在讲Handler之前,我们先提个小问题,就是如何让程序5秒钟更新一下Title.首先我们看一下习惯了
- 目录为什么要使用 TaskTask 和 Thread 区别Task 介绍Task 简单实现Task 执行状态1.等待(Wait)2. 返回值
- 我遇到一个重复性操作,为了能偷懒发现idea的功能还比较实用纵列选择:Alt+鼠标左键大小写转换:Ctrl+Shirt+u使用小技巧:像这样