学习Android快一个月了,找个东西练练手,试着写写微信主要的四个界面。
效果图:
有色差...
首先看主界面划分,看图最直接:
主界面
activity_main.xml:
<RelativeLayout 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:id="@+id/main"
tools:context="${relativePackage}.${activityClass}" >
<RelativeLayout
android:id="@+id/main_top"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#333333"
android:orientation="horizontal"
android:gravity="center_vertical">
<TextView
android:id="@+id/main_top_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="微信"
android:textColor="#FFFFFF"
android:textSize="25dp"
android:layout_margin="10dp"/>
<ImageView
android:id="@+id/main_top_iv_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignTop="@+id/main_top_tv"
android:src="@android:drawable/ic_input_add"
android:layout_marginRight="10dp" />
<ImageView
android:id="@+id/main_top_iv_search"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/main_top_iv_add"
android:layout_toLeftOf="@+id/main_top_iv_add"
android:layout_marginRight="10dp"
android:src="@android:drawable/ic_menu_search" />
</RelativeLayout>
<LinearLayout
android:id="@+id/main_bottom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:descendantFocusability="afterDescendants"
android:layout_alignParentBottom="true"
android:background="#cccccc">
<RadioGroup
android:id="@+id/main_bottom_rg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_marginTop="1dp"
android:gravity="center_vertical"
android:background="#FFFFFF">
<RadioButton
android:id="@+id/main_bottom_rg_main"
android:drawableTop="@android:drawable/ic_dialog_email"
android:button="@null"
android:gravity="center_horizontal"
android:layout_weight="1"
android:text="微信"
android:checked="true"
android:textColor="@drawable/rb_color"/>
<RadioButton
android:id="@+id/main_bottom_rg_contacts"
android:drawableTop="@android:drawable/ic_dialog_alert"
android:button="@null"
android:gravity="center_horizontal"
android:layout_weight="1"
android:textColor="@drawable/rb_color"
android:text="通讯录"/>
<RadioButton
android:id="@+id/main_bottom_rg_find"
android:drawableTop="@android:drawable/ic_dialog_info"
android:button="@null"
android:gravity="center_horizontal"
android:layout_weight="1"
android:textColor="@drawable/rb_color"
android:text="发现"/>
<RadioButton
android:id="@+id/main_bottom_rg_self"
android:drawableTop="@android:drawable/ic_dialog_map"
android:button="@null"
android:gravity="center_horizontal"
android:layout_weight="1"
android:textColor="@drawable/rb_color"
android:text="我 "/>
</RadioGroup>
</LinearLayout>
<android.support.v4.view.ViewPager
android:id="@+id/main_viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/main_top"
android:layout_above="@id/main_bottom"
/>
</RelativeLayout>
MainActivity:
package com.edu.pro1202_weixin;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.view.Window;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import com.edu.adapter.ViewPagerAdapter;
import com.edu.fragment.ContactsFragment;
import com.edu.fragment.FindFragment;
import com.edu.fragment.MainFragment;
import com.edu.fragment.SelfFragment;
public class MainActivity extends FragmentActivity {
private ViewPager viewPager;
private List<Fragment> frags;
private RadioGroup rg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
viewPager = (ViewPager) findViewById(R.id.main_viewpager);
rg = (RadioGroup) findViewById(R.id.main_bottom_rg);
//添加Fragment
frags = new ArrayList<>();
frags.add(new MainFragment());
frags.add(new ContactsFragment());
frags.add(new FindFragment());
frags.add(new SelfFragment());
//ViewPager适配器
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager(), frags);
viewPager.setAdapter(adapter);
//设置监听器
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
((RadioButton)rg.getChildAt(arg0)).setChecked(true);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
//RadioGroup监听器
rg.setOnCheckedChangeListener(
new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
int i = -1;
switch (checkedId) {
case R.id.main_bottom_rg_main:
i = 0;
break;
case R.id.main_bottom_rg_contacts:
i = 1;
break;
case R.id.main_bottom_rg_find:
i = 2;
break;
case R.id.main_bottom_rg_self:
i = 3;
break;
}
//设置当前Fragment
viewPager.setCurrentItem(i);
}
});
}
}
微信界面(MainFragment)
main_frag_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/frag_main_lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp">
</ListView>
</LinearLayout>
MainFragment:
package com.edu.fragment;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import com.edu.adapter.MainFragAdapter;
import com.edu.pro1202_weixin.R;
public class MainFragment extends Fragment {
private ListView mainLv;
private MainFragAdapter adapter;
private List<HashMap<String, Object>> list;
public MainFragment() {
System.out.println("MainFragment Create!");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.main_frag_layout, null);
//填充数据
setData();
adapter = new MainFragAdapter(list, getActivity());
mainLv = (ListView) view.findViewById(R.id.frag_main_lv);
mainLv.setAdapter(adapter);
return view;
}
public void setData(){
list = new ArrayList<>();
HashMap<String, Object> map = null;
for (int i = 0; i < 20; i++) {
map = new HashMap<>();
map.put("name", "好友"+i);
map.put("time", "时间"+i);
map.put("message", "消息"+i);
list.add(map);
}
}
}
联系人界面(ContactsFragment)
contacts_frag_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@+id/list_title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="18dp"
android:padding="5dp"
android:background="#e1e1e1"
android:textColor="#f00"
android:text="a"
android:layout_alignParentTop="true"
android:visibility="gone">
</TextView>
<ListView android:id="@+id/listInfo"
android:layout_below="@id/list_title"
android:focusable="true"
android:layout_weight="1.0"
android:layout_height="match_parent"
android:layout_width="fill_parent"
android:scrollbars="none"
android:cacheColorHint="#00000000"
android:background="#fff">
</ListView>
<com.edu.util.ContactsRightTool
android:id="@+id/rightCharacterListView"
android:background="#08000000"
android:layout_width="20dip"
android:layout_height="fill_parent"
android:layout_alignParentRight="true"/>
</RelativeLayout>
ContactsFragment
package com.edu.fragment;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import android.content.Context;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.edu.adapter.ConstactsListAdapter;
import com.edu.pro1202_weixin.R;
import com.edu.util.MixComparator;
import com.edu.util.MyUtil;
import com.edu.util.ContactsRightTool;
public class ContactsFragment extends Fragment implements
ListView.OnScrollListener, OnItemClickListener, OnClickListener {
private ContactsRightTool letterListView; //右侧字木栏
private Handler handler;
private int scrollState; //滚动状态
private ConstactsListAdapter quickLocationListAdapter;
private ListView listMain; //主界面的ListView
//txtOverlay首字母悬浮提示框,listView的title顶部悬浮
private TextView txtOverlay, title;
private WindowManager windowManager;
private DisapearThread disapearThread;
<span style="white-space:pre"> </span>//读取联系人姓名,生成数组
private String[] stringArr = { "张杰", "胖子", "张胖子", "韩璐韩璐", "韩露",
"玛莎杀", "&&", "?", "瑶瑶瑶瑶", "尧尧", "成都", "上海", "老王",
"武汉", "子弹", "狗头", "贺总", "zzzz广州", "广州", "上海",
"cc", "aa" ,"dd"};
private String[] stringArr3 = new String[0]; //右侧英文字母列表
private ArrayList arrayList = new ArrayList(); //此列表添加所有拼音
private ArrayList arrayList2 = new ArrayList(); //此列表添加所有拼音首字母
private ArrayList arrayList3 = new ArrayList(); //此列表添加不规则字符
//key为拼音
private Map<String, String> map = new HashMap<String, String>();
public ContactsFragment() {
System.out.println("ContactsFragment Create!");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.contacts_frag_main, null);
for (int i = 0; i < stringArr.length; i++) {
String pinyin = MyUtil.converterToPinYin(stringArr[i]);
arrayList.add(pinyin);
Collections.sort(arrayList, new MixComparator());
if (!arrayList2.contains(pinyin.substring(0, 1))
&& MyUtil.isWord(pinyin.substring(0, 1))) {
arrayList2.add(pinyin.substring(0, 1));
//可能会重复,重新排序
Collections.sort(arrayList2, new MixComparator());
}
map.put(pinyin, stringArr[i]);
}
stringArr = (String[]) arrayList.toArray(stringArr);
arrayList3.add("#");
for (int i = 0; i < arrayList2.size(); i++) {
String string = (String) arrayList2.get(i);
//toUpperCase大写字母
arrayList3.add(string.toUpperCase());
}
arrayList3.add("*");
// 得到右侧英文字母列表
stringArr3 = (String[]) arrayList3.toArray(stringArr3);
letterListView = (ContactsRightTool)
view.findViewById(R.id.rightCharacterListView);
letterListView.setB(stringArr3);
letterListView.setOnTouchingLetterChangedListener
(new LetterListViewListener());
textOverlayout(view);
// 初始化ListAdapter
quickLocationListAdapter = new ConstactsListAdapter(
getActivity(), stringArr, this, map);
listMain = (ListView) view.findViewById(R.id.listInfo);
listMain.setOnItemClickListener(this);
listMain.setOnScrollListener(this);
listMain.setAdapter(quickLocationListAdapter);
disapearThread = new DisapearThread();
return view;
}
@Override
public void onClick(View v) {
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
String personalName = map.get(stringArr[position]);
Toast.makeText(getActivity(), personalName, 1).show();
}
/**
* 设置悬浮字母
*/
public void textOverlayout(View view)
{
handler = new Handler();
title = (TextView) view.findViewById(R.id.list_title);
txtOverlay = (TextView) LayoutInflater.from(getActivity()).inflate(
R.layout.contacts_char, null);
txtOverlay.setVisibility(View.INVISIBLE);
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_APPLICATION,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
PixelFormat.TRANSLUCENT);
windowManager = (WindowManager) getActivity()
.getSystemService(Context.WINDOW_SERVICE);
windowManager.addView(txtOverlay, lp);
}
/**
* 右侧导航条点击列表滚动指定位置
*/
public class LetterListViewListener implements
ContactsRightTool.OnTouchingLetterChangedListener
{
public void onTouchingLetterChanged(final String s)
{
int num = 0;
// 联系人姓名和参数s进行比较
for (int i = 0; i < stringArr.length; i++) {
if ("a".equals(s) || "#".equals(s)) { //顶部
num = 0;
}
else if ("*".equals(s)) { //底部
num = stringArr.length;
}else if (MyUtil.isWord(stringArr[i].substring(0, 1))
&& (MyUtil.character2ASCII(stringArr[i].substring(0, 1))
< (MyUtil.character2ASCII(s) + 32))) {
/**
* 首先判断是字母,字母的ASCLL值小于参数s时,滚动位置+1;
* 如果有10个数据小于s,就滚到10处
*/
num += 1;
}
}
if (num < 2) {
//设置ListView选中的位置,同时在Y轴设置一个偏移量
listMain.setSelectionFromTop(num, 0);
}
else {
listMain.setSelectionFromTop(num, 5); //留点间隔
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
title.setVisibility(View.VISIBLE);
if (firstVisibleItem != 0) {
title.setText(map.get(stringArr[firstVisibleItem]));
}
else {
title.setText("a");
}
title.setText(map.get(stringArr[firstVisibleItem]));
txtOverlay.setText(String.valueOf(stringArr[firstVisibleItem].charAt(0)));// 泡泡文字以第一个可见列表为准
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
this.scrollState = scrollState;
if (scrollState == ListView.OnScrollListener.SCROLL_STATE_IDLE) {
//removeCallbacks()是删除指定的Runnable对象,使线程对象停止运行
handler.removeCallbacks(disapearThread);
// 提示延迟1.0s再消失
// postDelayed:延迟多少毫秒后开始运行
boolean bool = handler.postDelayed(disapearThread, 1000);
} else {
txtOverlay.setVisibility(View.VISIBLE);
}
}
/**
* 延迟线程,用来是悬浮字母消失
* @author xukai
* 2015年12月5日
*
*/
public class DisapearThread implements Runnable
{
public void run()
{
// 避免在1.5s内,用户再次拖动时提示框又执行隐藏命令。
/**
* SCROLL_STATE_FLING,这个参数表示你手离开后ListView还在“飞”
* SCROLL_STATE_IDLE,这个参数表示ListView停下不动了
* SCROLL_STATE_TOUCH_SCROLL,这个参数表示你手还在ListView上
*/
if (scrollState == ListView.OnScrollListener
.SCROLL_STATE_IDLE) {
//当ListView滚动停止了,悬浮字母设置不可见
txtOverlay.setVisibility(View.INVISIBLE);
}
}
}
}
右侧悬浮字母
package com.edu.util;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
/**
* 右侧字母表,快速定位
*/
public class ContactsRightTool extends View
{
private String[] b = new String[]{}; //右侧字母表的所有字母
public void setB(String[] b)
{
this.b = b;
}
OnTouchingLetterChangedListener onTouchingLetterChangedListener;
int choose = -1;
Paint paint = new Paint();
boolean showBkg = false;
public ContactsRightTool(Context context, AttributeSet attrs,
int defStyle)
{
super(context, attrs, defStyle);
}
public ContactsRightTool(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public ContactsRightTool(Context context)
{
super(context);
}
@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
if (showBkg) {
canvas.drawColor(Color.parseColor("#10000000"));
}
int height = getHeight(); //悬浮栏高度
int width = getWidth(); //悬浮栏宽度
int singleHeight = height / b.length; //单个字母高度
// 循环填充字母
for (int i = 0; i < b.length; i++) {
paint.setColor(Color.BLACK);
paint.setTypeface(Typeface.DEFAULT_BOLD);
//消除锯齿
paint.setAntiAlias(true);
if (i == choose) {
//第i个字母被选中
//改变字体背景色
paint.setColor(Color.parseColor("#3399ff"));
//设置标记,中文仿“粗体”
paint.setFakeBoldText(true);
}
//Text起始X轴位置
float xPos = width / 2 - paint.measureText(b[i]) / 2;
//Text起始Y轴位置
float yPos = singleHeight * i + singleHeight;
//填充Text
canvas.drawText(b[i], xPos, yPos, paint);
paint.reset();
}
}
@Override
public boolean dispatchTouchEvent(MotionEvent event)
{
final int action = event.getAction();
final float y = event.getY();
final int oldChoose = choose; //记录上次选择
final OnTouchingLetterChangedListener listener =
onTouchingLetterChangedListener;
/**
* y / getHeight() 为整个屏幕的几分之几
* 再乘以字母数据长度,即为当前字母
*/
final int c = (int) (y / getHeight() * b.length); //字母位置
switch (action) {
case MotionEvent.ACTION_DOWN:
showBkg = true;
if (oldChoose != c && listener != null) {
if (c > 0 && c <= b.length) {
//如果第一个字母是#,无效点击的话,条件变为c>0
listener.onTouchingLetterChanged(b[c]);
choose = c; //处理重复
invalidate();
}
}
break;
case MotionEvent.ACTION_MOVE:
//按住,移动
if (oldChoose != c && listener != null) {
if (c > 0 && c <= b.length) {
//如果第一个字母是#,无效点击的话,条件变为c>0
listener.onTouchingLetterChanged(b[c]);
choose = c;
invalidate();
}
}
break;
case MotionEvent.ACTION_UP:
//还原
showBkg = false;
choose = -1;
invalidate();
break;
}
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
return super.onTouchEvent(event);
}
/**
* 设置监听
*/
public void setOnTouchingLetterChangedListener(
OnTouchingLetterChangedListener
onTouchingLetterChangedListener) {
this.onTouchingLetterChangedListener =
onTouchingLetterChangedListener;
}
/**
* 给右侧悬浮窗添加一个监听接口
* @author xukai
* 2015年12月5日
*/
public interface OnTouchingLetterChangedListener
{
public void onTouchingLetterChanged(String s);
}
}
各种工具类
package com.edu.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
/**
* 判断字母数字混合<br>
* 判断字母<br>
* 判断数字<br>
* 判断空<br>
* 汉语拼音转换工具<br>
* 把单个英文字母或者字符串转换成数字ASCII码<br>
* @author xukai
* 2015年12月6日
*
*/
public class MyUtil {
/**
* 判断字母数字混合
*
* @param str
* @return
*/
public static boolean isAllWord(String str)
{
Pattern pattern = Pattern.compile("^[A-Za-z0-9]+$");
Matcher isNum = pattern.matcher(str);
if (!isNum.matches()) {
return false;
}
else {
return true;
}
}
/**
* 判断字母
* @param str
* @return
*/
public static boolean isWord(String str)
{
Pattern pattern = Pattern.compile("^[A-Za-z]+$");
Matcher isNum = pattern.matcher(str);
if (!isNum.matches()) {
return false;
}
else {
return true;
}
}
/**
* 判断数字
* @param str
* @return
*/
public static boolean isNumeric(String str)
{
Pattern pattern = Pattern.compile("^[0-9]*$");
Matcher isNum = pattern.matcher(str);
if (!isNum.matches()) {
return false;
}
else {
return true;
}
}
/**
* 判断空
* @param str
* @return
*/
public static boolean isEmpty(String str)
{
return "".equals(str.trim());
}
/**
* 汉语拼音转换工具
*
* @param chinese
* @return
*/
public static String converterToPinYin(String chinese)
{
String pinyinString = "";
char[] charArray = chinese.toCharArray();
// 根据需要定制输出格式,我用默认的即可
HanyuPinyinOutputFormat defaultFormat =
new HanyuPinyinOutputFormat();
try {
// 遍历数组,ASC码大于128进行转换
for (int i = 0; i < charArray.length; i++) {
if (charArray[i] > 128) {
// charAt(0)取出首字母
if (charArray[i] >= 0x4e00
&& charArray[i] <= 0x9fa5) {
//判断是否中文
pinyinString += PinyinHelper
.toHanyuPinyinStringArray(
charArray[i], defaultFormat)[0].charAt(0);
}
else {
//不是中文的打上未知,所以无法处理韩文日本等等其他文字
pinyinString += "?";
}
}
else {
pinyinString += charArray[i];
}
}
return pinyinString;
}
catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
return null;
}
}
/**
* 把单个英文字母或者字符串转换成数字ASCII码
*
* @param input
* @return
*/
public static int character2ASCII(String input)
{
char[] temp = input.toCharArray();
StringBuilder builder = new StringBuilder();
for (char each : temp) {
builder.append((int) each);
}
String result = builder.toString();
return Integer.parseInt(result);
}
}
package com.edu.util;
import java.util.Comparator;
/**
* 混合排序工具
*/
public class MixComparator implements Comparator<String>
{
public int compare(String o1, String o2)
{
// 判断是否为空""
if (MyUtil.isEmpty(o1) && MyUtil.isEmpty(o2))
return 0;
if (MyUtil.isEmpty(o1))
return -1;
if (MyUtil.isEmpty(o2))
return 1;
String str1 = "";
String str2 = "";
try {
str1 = (o1.toUpperCase()).substring(0, 1);
str2 = (o2.toUpperCase()).substring(0, 1);
}
catch (Exception e) {
System.out.println("某个str为\" \" 空");
}
if (MyUtil.isWord(str1) && MyUtil.isWord(str2)) {
//字母
return str1.compareTo(str2);
}
else if (MyUtil.isNumeric(str1) && MyUtil.isWord(str2)) {
//数字字母
return 1;
}
else if (MyUtil.isNumeric(str2) && MyUtil.isWord(str1)) {
return -1;
}
else if (MyUtil.isNumeric(str1) && MyUtil.isNumeric(str2)) {
//数字数字
if (Integer.parseInt(str1) > Integer.parseInt(str2)) {
return 1;
}
else {
return -1;
}
}
else if (MyUtil.isAllWord(str1) && (!MyUtil.isAllWord(str2))) {
//数字字母 其他字符
return -1;
}
else if ((!MyUtil.isAllWord(str1)) && MyUtil.isWord(str2)) {
return 1;
}
else {
return 1;
}
}
}
发现界面(FindFragment)
find_frag_layout.xml:<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/gravy">
<RelativeLayout
android:id="@+id/find_r_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:descendantFocusability="blocksDescendants"
android:layout_marginTop="20dp">
<ListView
android:id="@+id/r_1_lv"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</ListView>
</RelativeLayout>
<RelativeLayout
android:id="@+id/find_r_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:descendantFocusability="blocksDescendants"
android:layout_below="@id/find_r_1"
android:layout_marginTop="20dp">
<ListView
android:id="@+id/r_2_lv"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</ListView>
</RelativeLayout>
<RelativeLayout
android:id="@+id/find_r_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"
android:background="@android:color/white"
android:layout_below="@id/find_r_2"
android:layout_marginTop="20dp"
android:orientation="horizontal"
>
<ListView
android:id="@+id/r_3_lv"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</ListView>
</RelativeLayout>
<RelativeLayout
android:id="@+id/find_r_4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:descendantFocusability="blocksDescendants"
android:layout_below="@id/find_r_3"
android:layout_marginTop="20dp">
<ListView
android:id="@+id/r_4_lv"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</ListView>
</RelativeLayout>
</RelativeLayout>
Findfragment:
package com.edu.fragment;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import com.edu.adapter.FragListViewAdapter;
import com.edu.pro1202_weixin.R;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
public class FindFragment extends Fragment {
private List<HashMap<String, String>> list0;
private List<HashMap<String, String>> list1;
private List<HashMap<String, String>> list2;
private List<HashMap<String, String>> list3;
private ListView lv0;
private ListView lv1;
private ListView lv2;
private ListView lv3;
private FragListViewAdapter adapter;
public FindFragment() {
System.out.println("FindFragment Create!");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.find_frag_layout, null);
init(view); //初始化
setData(); //添加数据
//给每个ListView设置适配器
adapter = new FragListViewAdapter(list0, getActivity());
lv0.setAdapter(adapter);
adapter = new FragListViewAdapter(list1, getActivity());
lv1.setAdapter(adapter);
adapter = new FragListViewAdapter(list2, getActivity());
lv2.setAdapter(adapter);
adapter = new FragListViewAdapter(list3, getActivity());
lv3.setAdapter(adapter);
return view;
}
private void init(View view) {
lv0 = (ListView) view.findViewById(R.id.r_1_lv);
lv1 = (ListView) view.findViewById(R.id.r_2_lv);
lv2 = (ListView) view.findViewById(R.id.r_3_lv);
lv3 = (ListView) view.findViewById(R.id.r_4_lv);
}
public void setData(){
list0 = new ArrayList<>();
list1 = new ArrayList<>();
list2 = new ArrayList<>();
list3 = new ArrayList<>();
HashMap<String, String> map = new HashMap<>();
map.put("info", "朋友圈");
map.put("image", android.R.drawable.ic_menu_camera+"");
map.put("rightImage", android.R.drawable.ic_menu_help+"");
list0.add(map);
map = new HashMap<>();
map.put("info", "扫一扫");
map.put("image", android.R.drawable.ic_menu_camera+"");
list1.add(map);
map = new HashMap<>();
map.put("info", "摇一摇");
map.put("image", android.R.drawable.ic_menu_camera+"");
list1.add(map);
map = new HashMap<>();
map.put("info", "附近的人");
map.put("image", android.R.drawable.ic_menu_camera+"");
list2.add(map);
map = new HashMap<>();
map.put("info", "购物");
map.put("image", android.R.drawable.ic_menu_camera+"");
list3.add(map);
map = new HashMap<>();
map.put("info", "游戏");
map.put("image", android.R.drawable.ic_menu_camera+"");
list3.add(map);
}
}
我界面
self_frag_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"
android:background="@color/gravy" >
<RelativeLayout
android:id="@+id/self_r_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:descendantFocusability="blocksDescendants"
android:layout_marginTop="20dp">
<ListView
android:id="@+id/self_r_1_lv"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</ListView>
</RelativeLayout>
<RelativeLayout
android:id="@+id/self_r_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:descendantFocusability="blocksDescendants"
android:layout_below="@id/self_r_1"
android:layout_marginTop="20dp">
<ListView
android:id="@+id/self_r_2_lv"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</ListView>
</RelativeLayout>
<RelativeLayout
android:id="@+id/self_r_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"
android:background="@android:color/white"
android:layout_below="@id/self_r_2"
android:layout_marginTop="20dp"
android:orientation="horizontal"
>
<ListView
android:id="@+id/self_r_3_lv"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</ListView>
</RelativeLayout>
<RelativeLayout
android:id="@+id/self_r_4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:descendantFocusability="blocksDescendants"
android:layout_below="@id/self_r_3"
android:layout_marginTop="20dp">
<ListView
android:id="@+id/self_r_4_lv"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</ListView>
</RelativeLayout>
<RelativeLayout
android:id="@+id/self_r_5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:descendantFocusability="blocksDescendants"
android:layout_below="@id/self_r_4"
android:layout_marginTop="20dp">
<ListView
android:id="@+id/self_r_5_lv"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</ListView>
</RelativeLayout>
</LinearLayout>
SelfFragment和FindFragment基本相同。
适配器
ViewPagerAdapter
package com.edu.adapter;
import java.util.List;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
/**
* MainActivity中的ViewPager适配器
* @author xukai
* 2015年12月5日
*
*/
public class ViewPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> frags; //所有的Fragment
public ViewPagerAdapter(FragmentManager fm, List<Fragment> frags) {
super(fm);
this.frags = frags;
}
@Override
public Fragment getItem(int arg0) {
return frags.get(arg0);
}
@Override
public int getCount() {
return frags.size();
}
}<strong>
</strong>
MainFragAdapter
package com.edu.adapter;
import java.util.HashMap;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.edu.pro1202_weixin.R;
/**
* MainFragment中ListView的适配器
* @author xukai
* 2015年12月5日
*/
public class MainFragAdapter extends BaseAdapter {
private List<HashMap<String, Object>> list;
private Context context;
public MainFragAdapter(List<HashMap<String, Object>> list,
Context context) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null){
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.fram_mian_lv, null);
holder = new ViewHolder();
holder.iv = (ImageView) convertView
.findViewById(R.id.lv_layout_image);
holder.tvName = (TextView) convertView
.findViewById(R.id.main_tv_name);
holder.tvMsg = (TextView) convertView
.findViewById(R.id.main_lv_msg);
holder.tvTime = (TextView) convertView
.findViewById(R.id.main_lv_time);
//设置Tag
convertView.setTag(holder);
}else{
//获取Tag
holder = (ViewHolder) convertView.getTag();
}
HashMap<String, Object> map = list.get(position);
holder.tvMsg.setText(map.get("name")+"");
holder.tvTime.setText(map.get("time")+"");
holder.tvMsg.setText(map.get("message")+"");
return convertView;
}
/**
* 内部类:为ListView的Item中的所有组件<br>
* 方便使用,不用每次都重新new
* @author xukai
* 2015年12月5日
*/
class ViewHolder{
ImageView iv;
TextView tvName;
TextView tvMsg;
TextView tvTime;
}
}
FragListViewAdapter
package com.edu.adapter;
import java.util.HashMap;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.edu.pro1202_weixin.R;
/**
* SelfFragment FindFragment 中ListView的适配器
* @author xukai
* 2015年12月5日
*
*/
public class FragListViewAdapter extends BaseAdapter {
private List<HashMap<String, String>> list; //数据
private Context context; //当前Fragment
public FragListViewAdapter(List<HashMap<String, String>> list,
Context context) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null){
//使用XML文件填充convertView
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.find_layout_lv, null);
}
//获取ListView中的某一项数据
HashMap<String, String> map = list.get(position);
//判断是否需要添加右边的ImageView
if(map.get("rightImage") != null){
ImageView ivRight = (ImageView) convertView
.findViewById(R.id.find_layout_iv_right);
//设置背景图片
ivRight.setImageDrawable(context.getResources()
.getDrawable(
Integer.parseInt(map.get("rightImage")+"")));
}
ImageView iv = (ImageView) convertView
.findViewById(R.id.find_layout_iv);
TextView tv = (TextView) convertView
.findViewById(R.id.find_layout_tv);
tv.setText(map.get("info"));
iv.setImageDrawable(context.getResources()
.getDrawable(Integer.parseInt(map.get("image")+"")));
return convertView;
}
}
ConstactsListAdapter
package com.edu.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.edu.pro1202_weixin.R;
/**
* 列表适配器
*/
public class ConstactsListAdapter extends BaseAdapter
{
private LayoutInflater layoutInflater;
private OnClickListener onClickListener;
private String[] stringArr ; //字母缩写数组
private Map<String, String> map =
new HashMap<String, String>(); //数据
public ConstactsListAdapter(Context context,
String[] arr, OnClickListener listener,
Map<String, String> map)
{
layoutInflater = LayoutInflater.from(context);
this.onClickListener = listener;
stringArr = arr;
this.map = map;
}
@Override
public int getCount()
{
return stringArr == null ? 0 : stringArr.length;
}
/**
* 根据stringArr获取Value
*/
@Override
public Object getItem(int position)
{
if (stringArr != null) {
String string = map.get(stringArr[position]);
return string;
}
return null;
}
@Override
public long getItemId(int position)
{
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder = null;
if (convertView == null) {
convertView = layoutInflater
.inflate(R.layout.find_list_item, null);
holder = new ViewHolder();
holder.firstCharHintTextView = (TextView) convertView
.findViewById(R.id.text_first_char_hint);
holder.nameTextView = (TextView) convertView
.findViewById(R.id.text_website_name);
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
holder.nameTextView.setText(map.get(stringArr[position]));
int idx = position - 1;
//前一个字符
char previewChar = idx >= 0 ? stringArr[idx].charAt(0) : ' ';
//当前字符
char currentChar = stringArr[position].charAt(0);
if (currentChar != previewChar) { // 如果不相等时显示
if (isWord(currentChar)) {
if (position != 0) {
holder.firstCharHintTextView
.setVisibility(View.VISIBLE);
} else {
holder.firstCharHintTextView
.setVisibility(View.GONE);
}
holder.firstCharHintTextView.setText(String
.valueOf(currentChar));
} else {
if (isWord(previewChar)) {
holder.firstCharHintTextView
.setVisibility(View.VISIBLE);
holder.firstCharHintTextView.setText("*");
} else {
holder.firstCharHintTextView.setVisibility(View.GONE);
}
}
} else {
holder.firstCharHintTextView.setVisibility(View.GONE);
}
return convertView;
}
public final class ViewHolder
{
public TextView firstCharHintTextView;
public TextView nameTextView;
}
/**
* 判断是否为一个字符<br>
* 字符 true;非字符 false;
*/
public boolean isWord(char c)
{
Pattern pattern = Pattern.compile("^[A-Za-z]+$");
Matcher isNum = pattern.matcher(String.valueOf(c));
if (!isNum.matches()) {
return false;
}
else {
return true;
}
}
}
微信基本页面是实现了,有很多BUG,比如,最后“我界面”进去,然后出来,就会出现错误了,没时间调试了,明天回家,培训终于完了!