Android微信界面
16lz
2021-01-23
学习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;@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,比如,最后“我界面”进去,然后出来,就会出现错误了,没时间调试了,明天回家,培训终于完了! 源码下载
更多相关文章
- Android入门学习笔记之人机用户界面
- 怎么去掉联系人、通话记录、拨号列表界面中的电话号码中间的空格
- Android关机界面代码
- 【Android 界面效果4】android背景选择器selector用法汇总
- Android 支付宝支付密码输入界面
- Android适配器之------BaseAdapter(例子)
- android读取工程里文件并显示在界面
- android制作一个简单登入界面的部分代码
- Android 子线程 更新 UI 界面 总结