1.Haz una foto de nueve parches
1. Significado: Una imagen png especialmente procesada que puede especificar qué áreas se pueden estirar y qué áreas no se pueden estirar.
2. Primero haz un diseño
< 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: orientación = "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 androide: layout_width = "match_parent" android: layout_height = "wrap_content" > < EditarTexto androide: id = "@ + / Identificación del input_text" android: layout_width = "0DP" android: layout_height = "wrap_content" android: layout_weight = "1" android: hint = "Escriba algo aquí" android: maxLines = "2" /> < Button android: id = "@ + id / send" android: layout_width = "wrap_content " android: layout_height = "wrap_content" android: texto = "Enviar" /> </ LinearLayout > </ LinearLayout >
La estructura básica aquí es construir un escritorio lineal y luego agregar cuadros de diálogo, cuadros de entrada y un botón
La imagen de fondo del diálogo que creamos es usar un estilo similar a WeChat
Luego, antes de diseñar el programa principal, vuelva a escribir un adaptador
empaquetar com.example.uibestpractice; importación android.widget.ArrayAdapter; importar android.widget.LinearLayout; importar android.widget.TextView; importar android.view.LayoutInflater; importar android.content.Context; import java.util. * ; importar android.view.ViewGroup; importación android.view.View; pública clase MsgAdapter extiende ArrayAdapter <msg> { privada int resourceId; public MsgAdapter (contexto de contexto, inttextViewResourceId, List <Msg> objetos) { super (contexto, textViewResourceId, objetos); resourceId = textViewResourceId; } @Override public View getView ( int position, View convertView, ViewGroup parent) { Msg msg = getItem (position); Ver vista; 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) { // Si es un mensaje recibido, muestre el diseño del mensaje a la izquierda y oculte el diseño del mensaje a la derecha viewHolder.leftLayout.setVisibility (View.VISIBLE); viewHolder.rightLayout.setVisibility (View.GONE); viewHolder.leftMsg.setText (msg.getContent ()); } else if (msg.getType () == Msg.TYPE_SENT) { // Si es un mensaje saliente, muestre el diseño del mensaje a la derecha y oculte el diseño del mensaje a la izquierda 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; } }
El significado general de este adaptador es que la información enviada por la otra parte está alineada a la izquierda, y la información enviada por sí misma está alineada a la derecha. Se puede ver que las dos primeras constantes se usan para indicar si la información se envió o se pasó; clase interna Representa el código para la alineación izquierda y derecha.
Luego escribe el programa principal para adaptar
empaquetar com.example.uibestpractice; importación android.app.Activity; importación android.os.Bundle; importar android.view.Menu; importar android.view.MenuItem; importar android.view.View; importar android.view.View.OnClickListener; importar android.view.Window; importar android.widget.Button; importar android.widget.ListView; importar android.widget.EditText; importación java.util. * ; pública clase MainActivity extiende Actividad { privadoListView msgListView; EditText privado inputText; botón privado enviar; adaptador privado MsgAdapter; Lista privada <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 (); // 初始化消息数据 adaptador = nuevo MsgAdapter (MainActivity. Este , R.layout.msg_item, msglist); inputText =(EditText) findViewById (R.id.input_text); enviar = (Botón) findViewById (R.id.send); msgListView.setAdapter (adaptador); 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 ());// Localice ListView en la última línea inputText.setText ( ""); // Vacíe el contenido en el cuadro de entrada } } }); } private void initMsgs () { Msg msg1 = new Msg ("Hello guy." , Msg. TYPE_RECEICED); msgList.add (msg1); Msg msg2 = nuevo Msg ("Hola. Quién identificó eso" , Msg.TYPE_SENT); msgList.add (msg2); Msg msg3 = nuevo Msg ("jsdlf" , Msg.TYPE_RECEIC ; msgList.add (la Msg3); } }
Segundo, el código fuente:
1. Dirección del proyecto
https://github.com/ruigege66/Android/tree/master/UIBestPractice
2.CSDN : https: //blog.csdn.net/weixin_44630050
3. Blog Park: https://www.cnblogs.com/ruigege0000/
4. Bienvenido a prestar atención al número público de WeChat: transformación de Fourier, número público personal, solo utilizado para el aprendizaje y la comunicación, responder "paquete de regalo" en segundo plano, obtener materiales de aprendizaje de big data