本文实例为大家分享了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);
}
}