学习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"/><ImageViewandroid: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" /><ImageViewandroid: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><LinearLayoutandroid: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.ViewPagerandroid: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;@Overrideprotected 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);//添加Fragmentfrags = 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() {@Overridepublic void onPageSelected(int arg0) {((RadioButton)rg.getChildAt(arg0)).setChecked(true);}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageScrollStateChanged(int arg0) {}});//RadioGroup监听器rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@Overridepublic 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;}//设置当前FragmentviewPager.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!");}@Overridepublic 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"><TextViewandroid: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.ContactsRightToolandroid: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 implementsListView.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!");}@Overridepublic 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);// 初始化ListAdapterquickLocationListAdapter = 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;}@Overridepublic void onClick(View v) {}@Overridepublic 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 implementsContactsRightTool.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);    //留点间隔}}}@Overridepublic 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)));// 泡泡文字以第一个可见列表为准}@Overridepublic 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);}@Overrideprotected 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;//填充Textcanvas.drawText(b[i], xPos, yPos, paint);paint.reset();}}@Overridepublic 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>0listener.onTouchingLetterChanged(b[c]);choose = c; //处理重复invalidate();}}break;case MotionEvent.ACTION_MOVE://按住,移动if (oldChoose != c && listener != null) {if (c > 0 && c <= b.length) {  //如果第一个字母是#,无效点击的话,条件变为c>0listener.onTouchingLetterChanged(b[c]);choose = c;invalidate();}}break;case MotionEvent.ACTION_UP://还原showBkg = false;choose = -1;invalidate();break;}return true;}@Overridepublic 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!");}@Overridepublic 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; //所有的Fragmentpublic ViewPagerAdapter(FragmentManager fm, List<Fragment> frags) {super(fm);this.frags = frags;}@Overridepublic Fragment getItem(int arg0) {return frags.get(arg0);}@Overridepublic 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;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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);//设置TagconvertView.setTag(holder);}else{//获取Tagholder = (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;  //当前Fragmentpublic FragListViewAdapter(List<HashMap<String, String>> list,Context context) {this.context = context;this.list = list;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if(convertView == null){//使用XML文件填充convertViewLayoutInflater inflater = LayoutInflater.from(context);convertView = inflater.inflate(R.layout.find_layout_lv, null);}//获取ListView中的某一项数据HashMap<String, String> map = list.get(position);//判断是否需要添加右边的ImageViewif(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;}@Overridepublic int getCount(){return stringArr == null ? 0 : stringArr.length;}/*** 根据stringArr获取Value*/@Overridepublic Object getItem(int position){if (stringArr != null) {String string = map.get(stringArr[position]);return string;}return null;}@Overridepublic long getItemId(int position){return position;}@Overridepublic 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,比如,最后“我界面”进去,然后出来,就会出现错误了,没时间调试了,明天回家,培训终于完了!
源码下载

Android微信界面相关推荐

  1. Android微信界面的设计

    Android微信界面的设计   [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51777792 微信6.0主界面: (1 ...

  2. Android微信界面的制作

    移动互联网开发第一课 要求完成以下需求: 1.页面具有标题"微信" 2.页面具有中间显示框 3.页面具有底部选择框,并且具有选择事件 4.页面底部选择框在进行改变的时候,我们需要中 ...

  3. Android 微信界面简单的侧滑效果+listview+DrawerLayout+fragment+viewpager

    先写一个android.support.v4.widget.DrawerLayout的控件.里面包裹的第一个LinearLayout是主界面的里面是一个viewpager的控件用来实现QQfragme ...

  4. Android简易微信界面

    Android简易微信界面 专选课移动互联网开发的第一次作业,利用Android Studio进行了简易Android微信界面的搭建 完整项目代码 界面样式展示: 界面xml源码 主界面xml源码 & ...

  5. android 微信缩小通话界面_安卓如何做出微信那样的界面仿微信“我”的界面2/5...

    本系列目标 通过安卓编程仿写微信"我"的界面,让大家也能做出类似微信界面.效果图如下: 本文目标 做出支付部分(其他部分在后续文章中逐步分享).效果图如下: 实现方案 通过截图工具 ...

  6. Android之微信界面设计

    Android Studio 学习之实现微信首页界面 一.界面布局分析. 首先进行界面布局,看需要几个.xml文件. 1.top.xml对微信界面的顶部进行设计 2.bottom.xml对于微信界面的 ...

  7. Android 二维码扫描(仿微信界面),根据Google zxing

    Android 二维码扫描(仿微信界面),根据Google zxing Android项目开发中经常会用到二维码扫描,例如登陆.支付等谷歌方面已经有了一个开源库(地址: https://github. ...

  8. 安卓移动开发实验:Android Studio设计微信界面

    一.实验的目的 通过使用Android Studio的Fragment和layout,来实现简单的微信界面切换. 二.app的功能 能够通过应用底部的bottom来实现四个页面的来回切换. 三.实验过 ...

  9. 微信界面Android实现

    欢迎浏览我的博客 这个学期我学习到关于移动开发的课程,我将在这里记录我的学习进度,也是分享我的个人心得以及我的所学内容总结. 本次实验内容 这次我们的学习内容是对移动开发的初步了解,这次通过在Andr ...

最新文章

  1. 屏幕适配方式都有哪些
  2. (转) OpenLayers3基础教程——OL3 介绍control
  3. IIS中WEB服务器的日志存放到SQL Server 2005中
  4. Spring-Cloud中的统一配置中心
  5. 如果BigDecimal是答案,那肯定是一个奇怪的问题
  6. python 获取当前目录_如何在Python中获取当前的工作目录?
  7. Eval绑定日期时,修改日期显示的格式
  8. jmeter单线程读取csv_jmeter中如何使用csv文件并读取数据
  9. Mysql中的外键分析(什么是外键,为什么要用外键,添加外键,主外键关联删除)
  10. 解决了asp.net 关于服务器版本不正确的问题
  11. 阅兵奇葩服装:美军顶鸡毛掸子 伊军扮鬼妖
  12. MCS-51子程序库-1
  13. TCP发送接收数据2
  14. python生成api文档_文档API生成工具
  15. Optisystem软件与Matlab软件的联合数据读取
  16. 挑战程序设计竞赛题解目录
  17. GIS数据处理-OSGB转换3dTiles
  18. 老照片免费修复软件有哪些?一键智能修复老照片工具推荐给你
  19. [转] 串、并行加法器
  20. 练习题︱豆瓣图书的推荐与搜索、简易版知识引擎构建(neo4j)

热门文章

  1. gnuradio模块分类
  2. android 天气 没有广告,收集几款无广告的纯净天气App
  3. Android Wifi自动打开并连接
  4. 北京联合大学 计算机应用大赛,北京联合大学计算机应用大赛方案.pdf
  5. 「云服务」腾讯云服务器配置
  6. 原来菜鸟也可以做一个漂亮的网站,我的建站经验!
  7. 【零基础】极星量化小技巧:启动时自动轮换合约
  8. 淘宝api开放平台买家卖家订单接口,python网络爬虫采集数据
  9. zig语言代替C语言进行裸机开发的尝试-2023年笔记
  10. 安装vmware虚拟机详细教程