網站首頁 編程語言 正文
本文實例為大家分享了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
相關推薦
- 2022-06-17 基于pgrouting的路徑規劃處理方法_PostgreSQL
- 2022-04-15 python實現請求數據包簽名_python
- 2022-03-15 跨域報錯:Response to preflight request doesn‘t pass ac
- 2022-04-24 C語言浮點函數中的modf和fmod詳解_C 語言
- 2023-01-09 解決python問題?Traceback?(most?recent?call?last)_pytho
- 2023-02-02 C語言求質數的幾種簡單易懂方式_C 語言
- 2022-04-05 關于redis客戶端連接不上
- 2022-08-01 MongoDB基礎之集合操作_MongoDB
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支