Android開發學習之路--UI之簡單聊天介面

來源:互聯網
上載者:User

標籤:

    學了很多的ui的知識,這裡就來實現個聊天的介面,首先來實現個layout的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">    <ListView        android:id="@+id/msg_list_view"        android:layout_height="0dp"        android:layout_width="match_parent"        android:layout_weight="1"        android:divider="#0000"/>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content">        <EditText            android:id="@+id/input_text"            android:layout_height="wrap_content"            android:layout_width="0dp"            android:layout_weight="1"            android:hint="輸入你想說的話"            android:maxLines="2"/>        <Button            android:id="@+id/send"            android:layout_height="wrap_content"            android:layout_width="wrap_content"            android:text="發送"/>    </LinearLayout></LinearLayout>

    這裡主要是listview來實現聊天的記錄顯示,edittext用於輸入資訊,button用於按鈕發送。效果如下:


    然後實現個listView的介面,這裡用到了兩張準備好的圖片,是*.9.png,也就是9宮格的圖片,主要的作用就是為了防止不該展開的地方展開,這裡的介面用到了氣泡,所以只要展開中間的背景就好了,兩邊的就不要展開了,建立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">    <LinearLayout        android:id="@+id/left_layout"        android:layout_height="wrap_content"        android:layout_width="wrap_content"        android:layout_gravity="left"        android:background="@drawable/left_messages">        <TextView            android: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>    <LinearLayout        android:id="@+id/right_layout"        android:layout_height="wrap_content"        android:layout_width="wrap_content"        android:layout_gravity="right"        android:background="@drawable/right_messages">        <TextView            android:id="@+id/right_msg"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="center"            android:layout_margin="10dp"/>    </LinearLayout></LinearLayout>
    效果如所示:



    這裡的圖片是網上找的png,然後ps改變大小,最後在android studio中,右擊選擇建立9-patch圖片,然後選擇展開的位置,如所示:


    這樣,綠色顯示的是整個背景圖片,然後中間的紅色就是可以展開的地方。其中相對於png圖片,*.9.png圖片主要多了四周的黑線條。這裡不再詳細講解*.9.png圖片的製作了。

    接著建立Msg類,代碼如下:

package com.example.jared.uitest;/** * Created by jared on 16/2/10. */public class Msg {    public static final int TYPE_RECEIVED = 0;    public static final int TYPE_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;    }}

    然後就是Adapter了,MsgAdapter代碼如下:

package com.example.jared.uitest;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.LinearLayout;import android.widget.TextView;import java.util.List;/** * Created by jared on 16/2/10. */public class MsgAdapter extends ArrayAdapter<Msg> {    private int resourceId;    public MsgAdapter(Context context, int textViewResourceId, List<Msg> objects) {        super(context, textViewResourceId, objects);        resourceId = textViewResourceId;    }    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_RECEIVED) {            viewHolder.leftLayout.setVisibility(View.VISIBLE);            viewHolder.rightLayout.setVisibility(View.GONE);            viewHolder.leftMsg.setText(msg.getContent());        } else if(msg.getType() == Msg.TYPE_SEND) {            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;    }}

    最後我們來實現MainActivity的代碼:

package com.example.jared.uitest;import android.os.Bundle;import android.support.v7.app.ActionBar;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ListView;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity {    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);        ActionBar actionBar = getSupportActionBar();        actionBar.hide();        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 View.OnClickListener() {            @Override            public void onClick(View view) {                String content = inputText.getText().toString();                if(!"".equals(content)) {                    Msg msg = new Msg(content, Msg.TYPE_SEND);                    msgList.add(msg);                    adapter.notifyDataSetChanged();                    msgListView.setSelection(msgList.size());                    inputText.setText("");                }            }        });    }    private void initMsgs() {        Msg msg1 = new Msg("Hello, how are you?", Msg.TYPE_RECEIVED);        msgList.add(msg1);        Msg msg2 = new Msg("Fine, thank you, and you?", Msg.TYPE_SEND);        msgList.add(msg2);        Msg msg3 = new Msg("I am fine, too!", Msg.TYPE_RECEIVED);        msgList.add(msg3);    }}

    運行看下效果,輸入一些文字,然後發送:


    上面這個介面已經和的也有點類似了,那麼下面再加上個頭像,那麼會不會更好呢?我們來試試。首先準備兩張頭像的圖片,簡單命名為head1,head2,這裡的頭像最好喝聊天背景的height像素相同,本例子是45。然後修改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">    <LinearLayout        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:orientation="horizontal">        <ImageView            android:id="@+id/head_left"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="left"            android:src="@drawable/head1"/>        <LinearLayout            android:id="@+id/left_layout"            android:layout_height="wrap_content"            android:layout_width="wrap_content"            android:layout_gravity="left"            android:background="@drawable/left_messages">            <TextView                android: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>    </LinearLayout>    <LinearLayout        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="right"        android:orientation="horizontal">    <LinearLayout        android:id="@+id/right_layout"        android:layout_height="wrap_content"        android:layout_width="wrap_content"        android:layout_gravity="right"        android:background="@drawable/right_messages">        <TextView            android:id="@+id/right_msg"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="center"            android:layout_margin="10dp"/>    </LinearLayout>        <ImageView            android:id="@+id/head_right"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:src="@drawable/head2"/>    </LinearLayout></LinearLayout>

    這裡主要是頭像的ImageView和聊天記錄的TextView需要在同一行,所以這裡LinearLayout裡面又一次嵌套了LinearLayout。

    然後修改MsgAdapter代碼如下:

package com.example.jared.uitest;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.TextView;import java.util.List;/** * Created by jared on 16/2/10. */public class MsgAdapter extends ArrayAdapter<Msg> {    private int resourceId;    public MsgAdapter(Context context, int textViewResourceId, List<Msg> objects) {        super(context, textViewResourceId, objects);        resourceId = textViewResourceId;    }    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);            viewHolder.head1 = (ImageView)view.findViewById(R.id.head_left);            viewHolder.head2 = (ImageView)view.findViewById(R.id.head_right);            view.setTag(viewHolder);        } else {            view = convertView;            viewHolder = (ViewHolder) view.getTag();        }        if(msg.getType() == Msg.TYPE_RECEIVED) {            viewHolder.leftLayout.setVisibility(View.VISIBLE);            viewHolder.head1.setVisibility(View.VISIBLE);            viewHolder.rightLayout.setVisibility(View.GONE);            viewHolder.head2.setVisibility(View.GONE);            viewHolder.leftMsg.setText(msg.getContent());        } else if(msg.getType() == Msg.TYPE_SEND) {            viewHolder.rightLayout.setVisibility(View.VISIBLE);            viewHolder.head2.setVisibility(View.VISIBLE);            viewHolder.leftLayout.setVisibility(View.GONE);            viewHolder.head1.setVisibility(View.GONE);            viewHolder.rightMsg.setText(msg.getContent());        }        return view;    }    class ViewHolder {        LinearLayout leftLayout;        LinearLayout rightLayout;        TextView leftMsg;        TextView rightMsg;        ImageView head1;        ImageView head2;    }}

    這裡viewHolder中添加了head1和head2,然後擷取資源中也添加了,並且添加了顯示和隱藏的代碼。

    圖片,代碼都準備好了,那就運行看看效果了:


    基本上和的聊天介面也有幾分相似了。學習了這麼多ui的知識,總算可以簡單地開發一個介面了。ui就先學到這裡,接下去繼續學習別的知識吧。

Android開發學習之路--UI之簡單聊天介面

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.