学习Android快一个月了,找个东西练练手,试着写写微信主要的四个界面。

效果图:

有色差...

首先看主界面划分,看图最直接:

Android微信界面_第1张图片

主界面

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;@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">                  <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 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);        // 初始化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;}@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 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);    //留点间隔            }        }    }    @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);    }    @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!");}@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;    }        @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,比如,最后“我界面”进去,然后出来,就会出现错误了,没时间调试了,明天回家,培训终于完了! 源码下载

更多相关文章

  1. Android入门学习笔记之人机用户界面
  2. 怎么去掉联系人、通话记录、拨号列表界面中的电话号码中间的空格
  3. Android关机界面代码
  4. 【Android 界面效果4】android背景选择器selector用法汇总
  5. Android 支付宝支付密码输入界面
  6. Android适配器之------BaseAdapter(例子)
  7. android读取工程里文件并显示在界面
  8. android制作一个简单登入界面的部分代码
  9. Android 子线程 更新 UI 界面 总结

随机推荐

  1. Web应用优化 - 减少重复计算
  2. url中#(hash)的含义
  3. 什么是ASM?
  4. NUI是什么?
  5. npm 卸载模块
  6. 如何指定某些目录配置忽略eslint?
  7. ES6 Proxy 性能之我见
  8. 使用canvas判断用户是否安装字体
  9. 如何在TypeScript中的window上显式设置新
  10. 什么是泳道