안 드 로 이 드 모방 위 챗 demo―위 챗 메시지 인터페이스 구현(모 바 일 엔 드)
지난 편 에서 메 인 인터페이스 에서 위 챗 네 페이지 중간 에 모두 fragment 이 고 네 개의 fragment 의 구조 가 실현 되 지 않 았 기 때문에 이 편 은 주로 위 챗 메시지 인터페이스의 실현(첫 번 째 fragment)을 실현 했다.
위 챗 메시지 페이지 는 위아래 로 미 끄 러 질 수 있 습 니 다.목록 마다 최대 5 개의 데 이 터 를 표시 할 수 있 고 목록 을 클릭 할 수 있 습 니 다.
상소 기능 을 실현 하려 면 fragment 레이아웃 에서 ListView 를 사용 한 다음 ListView 에 Item 레이아웃 을 지정 하면 됩 니 다.
위 챗 메시지 인터페이스 fragment 레이아웃 수정
weixin_fragment.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@drawable/main_list_divider_line"
android:dividerHeight="1.5px"
android:layout_marginBottom="50dp">
</ListView>
</LinearLayout>
상기 코드 는 분할 선 을 사용자 정의 했다.위 챗 메시지 페이지 의 모든 목록 에는 분할 선 이 있 고 시스템 자체 의 분할 선 은 화면 너비 가 가득 하기 때문에 스스로 분할 선 을 정의 해 야 합 니 다.
사용자 정의 분할 라인 mainlist_divider_line.xml
main_list_divider_line.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:left="80dp"
android:right="0dp">
<shape android:shape="rectangle" >
<solid android:color="#33000000" />
</shape>
</item>
</layer-list>
위 챗 메시지 인터페이스 fragment 에서 ListView 에 대응 하 는 item 레이아웃 만 들 기weixin_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="80dp"
android:layout_marginTop="300dp"
android:padding="10dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/img1"
android:layout_width="20dp"
android:layout_height="wrap_content"
android:layout_weight="0.5"/>
<LinearLayout
android:orientation="vertical"
android:layout_marginLeft="23dp"
android:layout_width="8dp"
android:layout_height="match_parent"
android:layout_weight="4">
<TextView
android:id="@+id/title"
android:textColor="#000000"
android:textSize="18dp"
android:gravity="center_vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="2.5"/>
<TextView
android:id="@+id/content"
android:textColor="#A8A8A8"
android:gravity="center_vertical"
android:singleLine="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1.5"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingRight="-50dp"
android:layout_weight="1"
android:gravity="right"
android:orientation="vertical">
<TextView
android:id="@+id/time"
android:textColor="#A8A8A8"
android:textSize="15dp"
android:layout_gravity="right"
android:layout_marginRight="1dp"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.5"/>
<ImageView
android:id="@+id/code"
android:background="@color/white"
android:layout_gravity="right"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.5"/>
</LinearLayout>
</LinearLayout>
위 챗 메시지 인터페이스 fragment.java 코드 수정
package com.example.wxchatdemo;
import android.annotation.SuppressLint;
import android.app.Fragment;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import com.example.wxchatdemo.adapter.ImageAdapter;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@SuppressLint("ValidFragment")
public class WeixinFragment extends Fragment {
// ,
private String number;
//
private ListView listView;
//
private List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
// Hander
private MyHander myhander = new MyHander();
/* , */
@SuppressLint("ValidFragment")
WeixinFragment(String number) {
this.number = number;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
httpUrlConnPost(String.valueOf(number));
}
});
thread1.start();
/* */
try {
thread1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
// fragment
View view = inflater.inflate(R.layout.weixin_fragment, container, false);
//
listView = view.findViewById(R.id.listView);
// ,
BaseAdapter adapter = new ImageAdapter(getActivity().getApplicationContext(), list);
//
listView.setAdapter(adapter);
return view;
}
// 1.
//
public void httpUrlConnPost(String number) {
HttpURLConnection urlConnection = null;
URL url;
try {
// URL
url = new URL(
"http://100.2.178.10:8080/AndroidServer_war_exploded/WeixinInformation");
urlConnection = (HttpURLConnection) url.openConnection();// http
urlConnection.setConnectTimeout(3000);//
urlConnection.setUseCaches(false);//
// urlConnection.setFollowRedirects(false); static , URLConnection 。
urlConnection.setInstanceFollowRedirects(true);// , ,
urlConnection.setReadTimeout(3000);//
urlConnection.setDoInput(true);//
urlConnection.setDoOutput(true);//
urlConnection.setRequestMethod("POST");//
urlConnection.setRequestProperty("Content-Type",
"application/json;charset=UTF-8");//
urlConnection.connect();// , connect , TCP
JSONObject json = new JSONObject();// json
//json.put("title", URLEncoder.encode(title, "UTF-8"));// URLEncoder.encode
json.put("number", URLEncoder.encode(number, "UTF-8"));// put json
String jsonstr = json.toString();// JSON JSON
// ------------ ------------
OutputStream out = urlConnection.getOutputStream();// , ,http
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));// , , ,
bw.write(jsonstr);// json
bw.flush();// , ,
out.close();
bw.close();//
Log.i("aa", urlConnection.getResponseCode() + "");
// L , 200
if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {//
// ------------ ------------
InputStream in = urlConnection.getInputStream();
BufferedReader br = new BufferedReader(
new InputStreamReader(in));
String str = null;
StringBuffer buffer = new StringBuffer();
while ((str = br.readLine()) != null) {// BufferedReader ,
System.out.println(" :" + str);
buffer.append(str);
}
in.close();
br.close();
JSONObject rjson = new JSONObject(buffer.toString());
String str1 = rjson.getJSONObject("json").get("titleimg").toString();
String[] pic = str1.split("\r
");
String str2 = rjson.getJSONObject("json").get("title").toString();
String[] title = str2.split("\r
");
String str3 = rjson.getJSONObject("json").get("content").toString();
String[] content = str3.split("\r
");
String str4 = rjson.getJSONObject("json").get("time").toString();
String[] time = str4.split("\r
");
String str5 = rjson.getJSONObject("json").get("showcode").toString();
String[] pic2 = str5.split("\r
");
for (int i = 0; i < pic.length; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("pic", pic[i]);
System.out.println(" :" + pic[i]);
map.put("title", title[i]);
System.out.println(" :" + title[i]);
map.put("content", content[i]);
map.put("time", time[i]);
map.put("code", pic2[i]);
list.add(map);// map list
}
boolean result = rjson.getBoolean("json");// rjson key "json" , boolean
System.out.println("json:===" + result);
// true, ,
if (result) {//
// Android http , , UI, hander UI
myhander.sendEmptyMessage(1);
Log.i(" :", " ");
} else {
myhander.sendEmptyMessage(2);
System.out.println("222222222222222");
Log.i(" :", " ");
}
} else {
myhander.sendEmptyMessage(2);
}
} catch (Exception e) {
e.printStackTrace();
Log.i("aa", e.toString());
System.out.println("11111111111111111");
myhander.sendEmptyMessage(2);
} finally {
urlConnection.disconnect();// TCP ,
}
}
// Android UI, Handler UI
class MyHander extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// hander , 1 , 2
switch (msg.what) {
case 1:
Log.i("aa", msg.what + "");
break;
case 2:
Log.i("aa", msg.what + "");
}
}
}
}
상기 코드 의 구체 적 인 내용 은 논술 하지 않 고 코드 는 모두 주석 이 있다.주로 위 에서 ListView 에 어댑터 를 설정 합 니 다.사용자 정의 어댑터 입 니 다.계승 시스템 자체 어댑터 BaseAdapter 를 통 해 해당 하 는 방법 을 다시 쓰 고 LlistView 에 대응 하 는 item 레이아웃 에 해당 하 는 구성 요소 에 데 이 터 를 표시 합 니 다.왜 사용자 정의 해 야 하 는 지 에 대해 서 는 위 챗 메시지 페이지 마다 최소 두 개의 그림 데이터 가 있 기 때 문 입 니 다.구성 요소 에 그림 을 불 러 오 려 면 도구 클래스 가 필요 합 니 다.(뒤에 제 시 됩 니 다)위의 fragment.자바 코드 는 어댑터 를 사용자 정의 하 였 습 니 다.지금 바로 만 들 겠 습 니 다.만 들 기 전에 가방 을 만 들 고 어댑터 를 따로 저장 하여 관리 할 수 있 습 니 다.
ImageAdapter.java
package com.example.wxchatdemo.adapter;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.wxchatdemo.tools.GetImageByUrl;
import com.example.wxchatdemo.R;
import java.util.List;
import java.util.Map;
public class ImageAdapter extends BaseAdapter {
//
private List<Map<String, Object>> data;
//
private Context context;
//
private ViewHolder viewHolder;
public ImageAdapter(Context context, List<Map<String, Object>> data) {
this.context = context;
this.data = data;
}
//
@Override
public int getCount() {
// TODO Auto-generated method stub
return data.size();
}
//
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return data.get(position);
}
// id
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
//
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// null
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = View.inflate(context, R.layout.weixin_item, null);
viewHolder.img1 = (ImageView) convertView
.findViewById(R.id.img1);
viewHolder.title = (TextView) convertView
.findViewById(R.id.title);
viewHolder.content = (TextView) convertView
.findViewById(R.id.content);
viewHolder.time = (TextView) convertView
.findViewById(R.id.time);
viewHolder.code = (ImageView) convertView
.findViewById(R.id.code);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
// List map
Map<String, Object> map = data.get(position);
// url
String pic = map.get("pic").toString();
// setImage
GetImageByUrl getImageByUrl = new GetImageByUrl();
getImageByUrl.setImage(viewHolder.img1, pic);
String title = map.get("title").toString();
viewHolder.title.setText(title);
String content = map.get("content").toString();
viewHolder.content.setText(content);
String time = map.get("time").toString();
viewHolder.time.setText(time);
// url
String code = map.get("code").toString();
// setImage
GetImageByUrl getImageByUrl2 = new GetImageByUrl();
getImageByUrl2.setImage(viewHolder.code, code);
return convertView;
}
/**
*
*
*
*
*/
class ViewHolder {
public ImageView img1;
public TextView title;
public TextView content;
public TextView time;
public ImageView code;
}
}
위 에 그림 로 딩 도구 류 를 사용 하면 다음 에 드 립 니 다.패키지 tools 에 그림 불 러 오기 도구 클래스 만 들 기 GetImageByUrl.java
GetImageByUrl.java
package com.example.wxchatdemo.tools;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* url
*
*
*
*/
public class GetImageByUrl {
private PicHandler pic_hdl;
private ImageView imgView;
private String url;
/**
* url
*
*
*
*/
public void setImage(ImageView imgView, String url) {
this.url = url;
this.imgView = imgView;
pic_hdl = new PicHandler();
Thread t = new LoadPicThread();
t.start();
}
class LoadPicThread extends Thread {
@Override
public void run() {
Bitmap img = getUrlImage(url);
System.out.println(img + "---");
Message msg = pic_hdl.obtainMessage();
msg.what = 0;
msg.obj = img;
pic_hdl.sendMessage(msg);
}
}
class PicHandler extends Handler {
@Override
public void handleMessage(Message msg) {
Bitmap myimg = (Bitmap) msg.obj;
imgView.setImageBitmap(myimg);
}
}
public Bitmap getUrlImage(String url) {
Bitmap img = null;
try {
URL picurl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) picurl
.openConnection();
conn.setConnectTimeout(6000);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.connect();
InputStream is = conn.getInputStream();
img = BitmapFactory.decodeStream(is);
is.close();
} catch (Exception e) {
e.printStackTrace();
}
return img;
}
}
총결산이 위 챗 메시지 페이지 이동 단 은 완성 되 었 습 니 다.서버 기능 이 아직 실현 되 지 않 았 기 때문에 테스트 할 때 위 챗 메시지 페이지 는 공백 으로 표 시 됩 니 다.ListView 가 대응 하 는 Item 레이아웃 은 기본적으로 데이터 가 없 기 때문에 데 이 터 는 서버 에서 얻 은 것 입 니 다.다음 편 은 서버 기능 을 보완 하고 우리 의 다른 내용 도 주목 해 주 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
콩짜개 검색 - 위 챗 공공 플랫폼 접속 (wechatpy)위의 글 은 위 챗 공공 플랫폼 을 어떻게 연결 하 는 지 소 개 했 지만 그 안의 검증 코드 는 우리 가 스스로 실현 한 것 이다.그러나 지금 우 리 는 더 좋 은 선택 이 생 겼 다.위 챗 (WeChat) 퍼 블...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.