Android連載5-編寫一個微信聊天界面

来源:https://www.cnblogs.com/ruigege0000/archive/2020/04/16/12709809.html
-Advertisement-
Play Games

一、製作Nine-Patch圖片 1.含義:一種被特殊處理的png圖片,能夠指定哪些區域可以被拉伸,哪些區域不可以被拉伸。 2.首先先製作一個佈局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xml ...


一、製作Nine-Patch圖片

1.含義:一種被特殊處理的png圖片,能夠指定哪些區域可以被拉伸,哪些區域不可以被拉伸。

2.首先先製作一個佈局

 

<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"

    android:background="#d8e0e8"

    android:orientation="vertical" >

   

    <ListView

        android:id="@+id/msg_list_view"

        android:layout_width="match_parent"

        android:layout_height="0dp"

        android:layout_weight="1"

        android:divider="#0000" >

    </ListView><LinearLayout

      android:layout_width="match_parent"

      android:layout_height = "wrap_content">

     

      <EditText

          android:id="@+id/input_text"

          android:layout_width="0dp"

          android:layout_height="wrap_content"

          android:layout_weight="1"

          android:hint="Type something here"

          android:maxLines="2"/>

     

      <Button

          android:id="@+id/send"

          android:layout_width="wrap_content"

          android:layout_height="wrap_content"

          android:text="Send"/>

     

  </LinearLayout></LinearLayout>

 

這裡的基本結構就是,建立一個線性桌面,然後添加對話框、輸入框和一個按鈕

 


我們建立對話框的背景圖片就是選用類似於微信的那種樣式

 

 

然後再設計主程式之前,先重寫一個適配器

 

package com.example.uibestpractice;

​

import android.widget.ArrayAdapter;

import android.widget.LinearLayout;

import android.widget.TextView;

import android.view.LayoutInflater;

import android.content.Context;

import java.util.*;

import android.view.ViewGroup;

import android.view.View;

​

​

public class MsgAdapter extends ArrayAdapter<Msg>{

 

  private int resourceId;

 

  public MsgAdapter(Context context,int textViewResourceId,List<Msg> objects) {

    super(context,textViewResourceId,objects);

    resourceId = textViewResourceId;

  }

 

  @Override

  public 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_RECEICED) {

      //如果是收到的消息,則顯示左邊的消息佈局,將右邊的消息佈局隱藏

      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;

   

  }

 

 

  class ViewHolder{

    LinearLayout leftLayout;

   

    LinearLayout rightLayout;

   

    TextView leftMsg;

   

    TextView rightMsg;

  }

}

 

這個適配器大致的意思就是,對方發來的信息就左對齊,自己發的信息就是右對齊,可以看出來開頭兩個常量使用來,標誌信息到底是發來的,還是發過去的​;內部類表示了左對齊和右對齊的代碼​;

 

然後編寫主程式,來進行適配

package com.example.uibestpractice;

​

import android.app.Activity;

​

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.Window;

import android.widget.Button;

import android.widget.ListView;

import android.widget.EditText;

import java.util.*;

​

public class MainActivity extends Activity {

 

  private ListView msgListView;

 

  private EditText inputText;

 

  private Button send;

 

  private MsgAdapter adapter;

 

  private List<Msg> msgList= new ArrayList<Msg>();

 

  @Override

  protected 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.setAdapter(adapter);

    send.setOnClickListener(new OnClickListener() {

      @Override

      public void onClick(View v) {

        String content = inputText.getText().toString();

        if(!"".contentEquals(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_RECEICED);

    msgList.add(msg1);

    Msg msg2 = new Msg("Hello. Who id that",Msg.TYPE_SENT);

    msgList.add(msg2);

    Msg msg3 = new Msg("jsdlf",Msg.TYPE_RECEICED);

    msgList.add(msg3);   

  }

}

​

 

 

 

二、源碼:

1.項目地址

https://github.com/ruigege66/Android/tree/master/UIBestPractice

2.CSDN:https://blog.csdn.net/weixin_44630050

3.博客園:https://www.cnblogs.com/ruigege0000/

4.歡迎關註微信公眾號:傅里葉變換,個人公眾號,僅用於學習交流,後臺回覆”禮包“,獲取大數據學習資料

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 影響用戶訪問的最大部分是前端的頁面。網站的劃分一般為二:前端和後臺。我們可以理解成後臺是用來實現網站的功能的,比如:實現用戶註冊,用戶能夠為文章發表評論等等。而前端呢?其實應該是屬於功能的表現。 而我們建設網站的目的是什麼呢?不就是為了讓目標人群來訪問嗎?所以我們可以理解成前端才是真正和用戶接觸的。 ...
  • 本文基於Supermap平臺實現二維矢量數據的84轉火星。 步驟: 在iDesktop中把數據轉換成wgs84的地理坐標系 在iDesktop中,把數據轉成geojson。 註意格式要選擇utf-8,不然中文欄位會亂碼。 在nodejs下,使用projzh包把wgs84坐標轉成火星坐標。 //ind ...
  • 物聯網海量設備心跳註冊,脫網清除——多線程高併發互斥鎖落地 [toc] 1.應用背景 在物聯網應用場景中,需要維護很多個設備的連接,比如基於TCP socket通信的長連接,目的是為了獲取設備採集的信息,反向控制設備的數字開關或者模擬量。我們把這些TCP長連接都放入了基於線程安全的Concurren ...
  • BUAA OO 第二單元總結 Part 1 設計策略 這三次作業採用了 主線程獲取請求,多級調度器逐級分派,電梯模擬運行的策略 。具體來說,主線程實例化 類,通過阻塞讀取方式獲得請求 ,之後將請求分配給調度器 ,調度器負責處理請求(既可以自己處理,也可以分配給其他子調度器處理),每一個電梯與一個 綁 ...
  • 北航OO(2020)第二單元博客作業 [TOC] 設計策略分析(多線程視角) 本單元的三次作業中,我採用了相似的策略:採用輸入線程與電梯線程通過線程安全的調度器進行交互的方式。這種方式基本屬於生產者 消費者模式。在調度器的設計方面,我主要採用synchronized關鍵字結合wait和notify方 ...
  • 前言 這是一個基於中小型企業或團隊的架構設計。 不考慮大廠。有充分的理由相信,大廠有絕對的實力來搭建一個相當複雜的環境。 中小型企業或團隊是個什麼樣子? 開發團隊人員配置不全,部分人員身兼開發過程上下游的數個職責; 沒有專職的維護人員,或者維護人員實力不足以完全掌控生產和開發環境。 這種情況下,過於 ...
  • 無處不在的線程,多線程,阻塞隊列,併發 編程世界無新鮮事,看你翻牆翻得厲不厲害 場景:現在的軟體開發迭代速度(一周一更新,甚至一天一發佈)真是太快了,今天進行軟體更新的時候,看到了有趣的現象,這不就是線程池,ThreadPoolExecutor,阻塞隊列,任務(下載和安裝)最好的案例嘛!經常看到很多 ...
  • redis為什麼那麼快?結論有三點,大家都知道,這裡主要是分析。 首先第一點 redis是記憶體訪問的,所以快 當然這個大家都知道,所以不是重點 io密集型和cpu密集型 一般我們把任務分為io密集型和cpu密集型 io密集型 IO密集型指的是系統的CPU性能相對硬碟、記憶體要好很多,此時,系統運作,大 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...