GVKun编程网logo

Android仿微信联系人按字母排序(微信通讯录按字母排序)

26

如果您想了解Android仿微信联系人按字母排序的相关知识,那么本文是一篇不可错过的文章,我们将对微信通讯录按字母排序进行全面详尽的解释,并且为您提供关于android–联系人中存在联系人、Andro

如果您想了解Android仿微信联系人按字母排序的相关知识,那么本文是一篇不可错过的文章,我们将对微信通讯录按字母排序进行全面详尽的解释,并且为您提供关于android – 联系人中存在联系人、Android仿微信/支付宝密码输入框、Android仿微信5实现滑动导航条、Android仿微信下拉列表实现的有价值的信息。

本文目录一览:

Android仿微信联系人按字母排序(微信通讯录按字母排序)

Android仿微信联系人按字母排序(微信通讯录按字母排序)

App只要涉及到联系人的界面,几乎都是按照字母排序以及导航栏的方式。既然这个需求这么火,于是开始学习相关内容,此篇文章是我通过参考网上资料独立编写和总结的,希望多多少少对大家有所帮助,写的不好,还请各位朋友指教。

效果图如下:

实现这个效果,需要三个知识点 :
1:将字符串 进行拼音分类
2:ExpandableListView 二级扩展列表
3:右边字母分类View

我们先一个一个来了解解决方案,再上代码。

实现字母分类:

字母分类又分为三个小要点:一个是将中文转化为拼音,一个是实现按照字母的顺序排序,另一个是字母只显示在具有相同首字母中文的第一个前面。

1、将中文转化为拼音,这里使用了一个工具包,即pinyin4j-2.5.0.jar。官网地址:http://pinyin4j.sourceforge.net/
点击下载,导入项目即可。(至于教程,网上很多)

在这里我们只需要使用将中文转换成拼音的代码即可。

PinyinUtils.java


public static String getPingYin(String inputString) {
  HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
  format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
  format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
  format.setVCharType(HanyuPinyinVCharType.WITH_V);
  char[] input = inputString.trim().tochararray();
  String output = "";
  try {
   for (char curchar : input) {
    if (java.lang.Character.toString(curchar).matches("[\\u4E00-\\u9FA5]+")) {
     String[] temp = PinyinHelper.toHanyuPinyinStringArray(curchar,format);
     output += temp[0];
    } else
     output += java.lang.Character.toString(curchar);
   }
  } catch (BadHanyuPinyinOutputFormatCombination e) {
   e.printstacktrace();
  }
  return output;
 }

2、实现按照字母的顺序排序,使用的是JAVA自带的Comparator接口,利用之前获取到的中文拼音,得到首字母并根据ascii值来实现排序。

private int sort(PersonBean lhs,PersonBean rhs) {
  // 获取ascii值
  int lhs_ascii = lhs.getFirstPinYin().toupperCase().charat(0);
  int rhs_ascii = rhs.getFirstPinYin().toupperCase().charat(0);
  // 判断若不是字母,则排在字母之后
  if (lhs_ascii < 65 || lhs_ascii > 90)
   return 1;
  else if (rhs_ascii < 65 || rhs_ascii > 90)
   return -1;
  else
   return lhs.getPinYin().compareto(rhs.getPinYin());
 }

3、字母只显示在具有相同首字母中文的第一个前面。这里算是一个小技巧,这里字母显示的布局与中文名字的布局都是存放在ListView的item的布局中的。

item的布局如下:

<?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" >
 <!-- 这个TextView就是显示字母的 -->
 <TextView
  android:id="@+id/tv_lv_item_tag"
  android:layout_width="match_parent"
  android:layout_height="20dp"
  android:background="#e6e6e6"
  android:gravity="center_vertical"
  android:paddingLeft="10dip"
  android:text="Z"
  android:visibility="visible" />
 <RelativeLayout
  android:layout_width="match_parent"
  android:layout_height="wrap_content" >
  <View 
   android:id="@+id/view_lv_item_line"
   android:layout_width="match_parent"
   android:layout_height="0.5dip"
   android:background="#174465"
   android:layout_marginLeft="10dip"
   android:layout_marginRight="20dip"
   />
  <ImageView
   android:id="@+id/iv_lv_item_head"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:src="@drawable/ic_launcher"
   android:layout_below="@id/view_lv_item_line"
   android:layout_marginLeft="5dp" />
  <TextView 
   android:id="@+id/tv_lv_item_name"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_centerVertical="true"
   android:layout_toRightOf="@id/iv_lv_item_head"
   android:layout_marginLeft="5dip"
   android:text="周华健"/>
 </RelativeLayout>
</LinearLayout>

而判断是否需要显示字母,是通过判断当前item的position是否等于第一个出现item对应的中文首字母的索引。

如果相等,则说明是第一次出现,便需要显示字母,否则不显示字母。而这样的判断,有一个前提,那就是中文拼音的排序必须是按照字母顺序排序的,这就是我们在上一步排序的必要。
 实现右侧的字母导航:
右侧的字母导航,其本质就是一个自定义view。除了绘制界面之外,需要注意的就是触摸事件的处理,还有回调机制(这个很多地方都会用到)的使用。这个比较重要,直接上代码吧。

package com.suse.contact;
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Typeface; 
import android.graphics.drawable.ColorDrawable; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.TextView;
public class SideBar extends View {
 // 触摸事件 
 private OnTouchingLetterChangedListener onTouchingLetterChangedListener; 
 // 26个字母 
 public static String[] A_Z = { "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","#" }; 
 private int choose = -1;// 选中 
 private Paint paint = new Paint(); 
 private TextView mTextDialog; 
 /** 
  * 为SideBar设置显示字母的TextView 
  * @param mTextDialog 
  */ 
 public void setTextView(TextView mTextDialog) { 
  this.mTextDialog = mTextDialog; 
 } 
 public SideBar(Context context,AttributeSet attrs,int defStyle) { 
  super(context,attrs,defStyle); 
 } 
 public SideBar(Context context,AttributeSet attrs) { 
  super(context,attrs); 
 } 
 public SideBar(Context context) { 
  super(context); 
 } 
 /** 
  * 重写这个方法 
  */ 
 protected void onDraw(Canvas canvas) { 
  super.onDraw(canvas); 
  // 获取焦点改变背景颜色. 
  int height = getHeight();// 获取对应高度 
  int width = getWidth(); // 获取对应宽度 
  int singleHeight = height / A_Z.length-2;// 获取每一个字母的高度 (这里-2仅仅是为了好看而已)
  for (int i = 0; i < A_Z.length; i++) { 
   paint.setColor(Color.rgb(33,65,98)); //设置字体颜色 
   paint.setTypeface(Typeface.DEFAULT_BOLD); //设置字体
   paint.setAntiAlias(true); //设置抗锯齿
   paint.setTextSize(30); //设置字母字体大小
   // 选中的状态 
   if (i == choose) { 
    paint.setColor(Color.parseColor("#3399ff")); //选中的字母改变颜色
    paint.setFakeBoldText(true); //设置字体为粗体
   } 
   // x坐标等于中间-字符串宽度的一半. 
   float xPos = width / 2 - paint.measureText(A_Z[i]) / 2; 
   float yPos = singleHeight * i + singleHeight; 
   canvas.drawText(A_Z[i],xPos,yPos,paint); //绘制所有的字母
   paint.reset();// 重置画笔 
  } 
 } 
 @Override 
 public boolean dispatchTouchEvent(MotionEvent event) { 
  final int action = event.getAction(); 
  final float y = event.getY();// 点击y坐标 
  final int oldChoose = choose; 
  final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener; 
  final int c = (int) (y / getHeight() * A_Z.length);// 点击y坐标所占总高度的比例*b数组的长度就等于点击b中的个数. 
  switch (action) { 
  case MotionEvent.ACTION_UP: 
   setBackgroundDrawable(new ColorDrawable(0x00000000)); 
   choose = -1;// 
   invalidate(); 
   if (mTextDialog != null) { 
    mTextDialog.setVisibility(View.INVISIBLE); 
   } 
   break; 
  default: 
   setBackgroundResource(R.drawable.sidebar_background); 
   if (oldChoose != c) { //判断选中字母是否发生改变
    if (c >= 0 && c < A_Z.length) { 
     if (listener != null) { 
      listener.onTouchingLetterChanged(A_Z[c]); 
     } 
     if (mTextDialog != null) { 
      mTextDialog.setText(A_Z[c]); 
      mTextDialog.setVisibility(View.VISIBLE); 
     } 
     choose = c; 
     invalidate(); 
    } 
   } 
   break; 
  } 
  return true; 
 } 
 /** 
  * 向外公开的方法 
  * 
  * @param onTouchingLetterChangedListener 
  */ 
 public void setonTouchingLetterChangedListener( 
   OnTouchingLetterChangedListener onTouchingLetterChangedListener) { 
  this.onTouchingLetterChangedListener = onTouchingLetterChangedListener; 
 } 
 /** 
  * 接口 
  * 
  * @author coder 
  * 
  */ 
 public interface OnTouchingLetterChangedListener { 
  public void onTouchingLetterChanged(String s); 
 }
}

 接下来就是MainActivity和SortAdapter的代码了。

MainActivity.java:
package com.suse.contact;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.TextView;
import com.suse.contact.SideBar.OnTouchingLetterChangedListener;
/**
 * 
* @ClassName: MainActivity 
* @Description: Todo(这里用一句话描述这个类的作用) 
* @author 银色的流星 欢迎批评、指导、交流 QQ:962455668
 */
public class MainActivity extends Activity {
 private ListView listView;
 private SortAdapter sortadapter;
 private List<PersonBean> data;
 private SideBar sidebar;
 private TextView dialog;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  init();
 }
 private List<PersonBean> getData(String[] data) {
  List<PersonBean> listarray = new ArrayList<PersonBean>();
  for (int i = 0; i < data.length; i++) {
   String pinyin = PinyinUtils.getPingYin(data[i]);
   String Fpinyin = pinyin.substring(0,1).toupperCase();
   PersonBean person = new PersonBean();
   person.setName(data[i]);
   person.setPinYin(pinyin);
   // 正则表达式,判断首字母是否是英文字母
   if (Fpinyin.matches("[A-Z]")) {
    person.setFirstPinYin(Fpinyin);
   } else {
    person.setFirstPinYin("#");
   }
   listarray.add(person);
  }
  return listarray;
 }
 private void init() {
  // Todo Auto-generated method stub
  sidebar = (SideBar) findViewById(R.id.sidebar);
  listView = (ListView) findViewById(R.id.listview);
  dialog = (TextView) findViewById(R.id.dialog);
  sidebar.setTextView(dialog);
  // 设置字母导航触摸监听
  sidebar.setonTouchingLetterChangedListener(new OnTouchingLetterChangedListener() {
   @Override
   public void onTouchingLetterChanged(String s) {
    // Todo Auto-generated method stub
    // 该字母首次出现的位置
    int position = sortadapter.getPositionForSelection(s.charat(0));
    if (position != -1) {
     listView.setSelection(position);
    }
   }
  });
  data = getData(getResources().getStringArray(R.array.listpersons));
  // 数据在放在adapter之前需要排序
  Collections.sort(data,new PinyinComparator());
  sortadapter = new SortAdapter(this,data);
  listView.setAdapter(sortadapter);
 }
}

SortAdapter.java:

package com.suse.contact;
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.TextView;
public class SortAdapter extends BaseAdapter {
 private Context context;
 private List<PersonBean> persons;
 private LayoutInflater inflater;
 public SortAdapter(Context context,List<PersonBean> persons) {
  this.context = context;
  this.persons = persons;
  this.inflater = LayoutInflater.from(context);
 }
 @Override
 public int getCount() {
  // Todo Auto-generated method stub
  return persons.size();
 }
 @Override
 public Object getItem(int position) {
  // Todo Auto-generated method stub
  return persons.get(position);
 }
 @Override
 public long getItemId(int position) {
  // Todo Auto-generated method stub
  return position;
 }
 @Override
 public View getView(int position,View convertView,ViewGroup parent) {
  ViewHolder viewholder = null;
  PersonBean person = persons.get(position);
  if (convertView == null) {
   viewholder = new ViewHolder();
   convertView = inflater.inflate(R.layout.list_item,null);
   viewholder.tv_tag = (TextView) convertView
     .findViewById(R.id.tv_lv_item_tag);
   viewholder.tv_name = (TextView) convertView
     .findViewById(R.id.tv_lv_item_name);
   convertView.setTag(viewholder);
  } else {
   viewholder = (ViewHolder) convertView.getTag();
  }
  // 获取首字母的assii值
  int selection = person.getFirstPinYin().charat(0);
  // 通过首字母的assii值来判断是否显示字母
  int positionForSelection = getPositionForSelection(selection);
  if (position == positionForSelection) {// 相等说明需要显示字母
   viewholder.tv_tag.setVisibility(View.VISIBLE);
   viewholder.tv_tag.setText(person.getFirstPinYin());
  } else {
   viewholder.tv_tag.setVisibility(View.GONE);
  }
  viewholder.tv_name.setText(person.getName());
  return convertView;
 }
 public int getPositionForSelection(int selection) {
  for (int i = 0; i < persons.size(); i++) {
   String Fpinyin = persons.get(i).getFirstPinYin();
   char first = Fpinyin.toupperCase().charat(0);
   if (first == selection) {
    return i;
   }
  }
  return -1;
 }
 class ViewHolder {
  TextView tv_tag;
  TextView tv_name;
 }
}

虽然不全,但比较重要的代码都已经贴上去了,希望对大家有所帮助 

android – 联系人中存在联系人

android – 联系人中存在联系人

我有电话号码.有没有办法检查设备中的联系人数据库中是否存在电话号码?根据我的需要,我的应用程序进一步移动.请建议或者如果有任何人可以提供示例代码段,请提供.

以下是我写的代码:

public boolean contactExists(Activity _activity,String number) {
    String[] mPhoneNumberProjection = { PhoneLookup._ID,PhoneLookup.NUMBER,PhoneLookup.disPLAY_NAME };
    Cursor cur = _activity.getContentResolver().query(number,mPhoneNumberProjection,null,null);
    try {
        if (cur.movetoFirst()) {
            return true;
        }
    } finally {
        if (cur != null)
            cur.close();
    }
    return false;
}// contactExists

提前致谢…

解决方法

public boolean contactExists(Activity _activity,String number) {
    if (number != null) {
        Uri lookupUri = Uri.withAppendedpath(PhoneLookup.CONTENT_FILTER_URI,Uri.encode(number));
        String[] mPhoneNumberProjection = { PhoneLookup._ID,PhoneLookup.disPLAY_NAME };
        Cursor cur = _activity.getContentResolver().query(lookupUri,null);
        try {
            if (cur.movetoFirst()) {
                return true;
            }
        } finally {
            if (cur != null)
                cur.close();
        }
        return false;
    } else {
        return false;
    }
}// contactExists

处理nullpointer异常.

Android仿微信/支付宝密码输入框

Android仿微信/支付宝密码输入框

在用到支付类app时,都有一个简密的输入框。。开始实现的时候思路有点问题,后来到github上搜了下,找到了一个开源的库看起来相当的牛逼,,来个地址先:

https://github.com/Jungerr/GridPasswordView

效果图:

这个开源库我研究了之后,又有了自己的一个思路:来个假的简密框---底部放一个EditTextView,顶部放置6个ImageView的原点,控制他们的显隐来实现这个简密宽

开发步骤:

1 布局

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_height="50dp" > 
 <LinearLayout 
  android:baselineAligned="false" 
  android:layout_width="match_parent" 
  android:layout_height="50dp" 
android:background="@drawable/sdk2_simple_pwd_bg_" 
  android:orientation="horizontal" > 
  <RelativeLayoutandroid:layout_weight="1" 
   android:orientation="horizontal" > 
   <ImageView 
    android:id="@+id/sdk2_pwd_one_img"android:layout_centerInParent="true" 
android:src="@drawable/sdk_circle_icon" 
    android:visibility="invisible" /> 
   <View 
    android:layout_width="1dp" 
    android:layout_height="fill_parent" 
android:layout_alignParentRight="true"  android:background="@color/sdk_color_pwd_line" /> 
  </RelativeLayout> 
  <RelativeLayoutandroid:layout_weight="1" 
   android:orientation="horizontal" > 
   <ImageView 
    android:id="@+id/sdk2_pwd_two_img"android:layout_centerInParent="true" 
android:src="@drawable/sdk_circle_icon" 
    android:visibility="invisible" /> 
   <View 
    android:layout_width="1dp" 
    android:layout_height="fill_parent" 
 android:layout_alignParentRight="true"  android:background="@color/sdk_color_pwd_line" /> 
  </RelativeLayout> 
  <RelativeLayoutandroid:layout_weight="1" 
   android:orientation="horizontal" > 
   <ImageView 
 android:id="@+id/sdk2_pwd_three_img"android:layout_centerInParent="true" 
  android:src="@drawable/sdk_circle_icon" 
    android:visibility="invisible" /> 
   <View 
    android:layout_width="1dp" 
    android:layout_height="fill_parent" 
  android:layout_alignParentRight="true" 
 android:background="@color/sdk_color_pwd_line" /> 
  </RelativeLayout> 
  <RelativeLayoutandroid:layout_weight="1" 
   android:orientation="horizontal" > 
   <ImageView 
    android:id="@+id/sdk2_pwd_four_img"android:layout_centerInParent="true" 
 android:src="@drawable/sdk_circle_icon" 
    android:visibility="invisible" /> 
   <View 
    android:layout_width="1dp" 
    android:layout_height="fill_parent" 
 android:layout_alignParentRight="true"  android:background="@color/sdk_color_pwd_line" /> 
  </RelativeLayout> 
  <RelativeLayoutandroid:layout_weight="1" 
   android:orientation="horizontal" > 
   <ImageView 
    android:id="@+id/sdk2_pwd_five_img"android:layout_centerInParent="true" 
android:src="@drawable/sdk_circle_icon" 
    android:visibility="invisible" /> 
   <View 
    android:layout_width="1dp" 
    android:layout_height="fill_parent" 
  android:layout_alignParentRight="true" 
    android:background="@color/sdk_color_pwd_line" /> 
  </RelativeLayout> 
  <RelativeLayoutandroid:layout_weight="1" 
   android:orientation="horizontal" > 
   <ImageView    android:id="@+id/sdk2_pwd_six_img"android:layout_centerInParent="true"     android:src="@drawable/sdk_circle_icon" 
    android:visibility="invisible" /> 
   <View 
android:layout_width="1dp"    android:layout_height="fill_parent"     android:layout_alignParentRight="true"    android:background="@color/sdk_color_pwd_line" /> 
  </RelativeLayout> 
 </LinearLayout> 
 <EditText 
  android:id="@+id/sdk2_pwd_edit_simple"android:background="@null" 
  android:cursorVisible="false" 
  android:inputType="numberPassword" 
  android:maxLength="6" 
 android:textColor="@color/sdk2_color_black" /> 
</FrameLayout> 

2:自定义一个控件来处理输入、删除、显隐等事件

package com.suning.mobile.paysdk.view; 
import android.content.Context; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.util.AttributeSet; 
import android.view.KeyEvent; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import com.suning.mobile.paysdk.R; 
import com.suning.mobile.paysdk.utils.FunctionUtils; 
import com.suning.mobile.paysdk.utils.log.LogUtils; 
/** 
 * 
 * 〈一句话功能简述〉<br> 
 * 〈功能详细描述〉 简密输入框 
 */ 
public class SecurityPasswordEditText extends LinearLayout { 
 private EditText mEditText; 
 private ImageView oneTextView; 
 private ImageView twoTextView; 
 private ImageView threeTextView; 
 private ImageView fourTextView; 
 private ImageView fiveTextView; 
 private ImageView sixTextView; 
 LayoutInflater inflater; 
 ImageView[] imageViews; 
 View contentView; 
 public SecurityPasswordEditText(Context context,AttributeSet attrs) { 
  super(context,attrs); 
  inflater = LayoutInflater.from(context); 
  builder = new StringBuilder(); 
  initWidget(); 
 } 
 private void initWidget() { 
  contentView = inflater.inflate(R.layout.sdk_simple_pwd_widget,null); 
  mEditText = (EditText) contentView 
    .findViewById(R.id.sdk_pwd_edit_simple); 
  oneTextView = (ImageView) contentView 
    .findViewById(R.id.sdk_pwd_one_img); 
  twoTextView = (ImageView) contentView 
    .findViewById(R.id.sdk_pwd_two_img); 
  fourTextView = (ImageView) contentView 
    .findViewById(R.id.sdk_pwd_four_img); 
  fiveTextView = (ImageView) contentView 
    .findViewById(R.id.sdk_pwd_five_img); 
  sixTextView = (ImageView) contentView 
    .findViewById(R.id.sdk_pwd_six_img); 
  threeTextView = (ImageView) contentView 
    .findViewById(R.id.sdk_pwd_three_img); 
  LinearLayout.LayoutParams lParams = new LayoutParams( 
    LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT); 
  mEditText.addTextChangedListener(mTextWatcher); 
  mEditText.setonKeyListener(keyListener); 
  imageViews = new ImageView[] { oneTextView,twoTextView,threeTextView,fourTextView,fiveTextView,sixTextView }; 
  this.addView(contentView,lParams); 
 } 
 TextWatcher mTextWatcher = new TextWatcher() { 
  @Override 
  public void onTextChanged(CharSequence s,int start,int before,int count) { 
  } 
  @Override 
  public void beforeTextChanged(CharSequence s,int count,int after) { 
  } 
  @Override 
  public void afterTextChanged(Editable s) { 
   if (s.toString().length() == ) { 
    return; 
   } 
   if (builder.length() < ) { 
    builder.append(s.toString()); 
    setTextValue(); 
   } 
   s.delete(,s.length()); 
  } 
 }; 
 OnKeyListener keyListener = new OnKeyListener() { 
  @Override 
  public boolean onKey(View v,int keyCode,KeyEvent event) { 
   if (keyCode == KeyEvent.KEYCODE_DEL 
     && event.getAction() == KeyEvent.ACTION_UP) { 
    delTextValue(); 
    return true; 
   } 
   return false; 
  } 
 }; 
 private void setTextValue() { 
  String str = builder.toString(); 
  int len = str.length(); 
  if (len <= ) { 
   imageViews[len - ].setVisibility(View.VISIBLE); 
  } 
  if (len == ) { 
   LogUtils.i("回调"); 
   LogUtils.i("支付密码" + str); 
   if (mListener != null) { 
    mListener.onNumCompleted(str); 
   } 
   LogUtils.i("jone",builder.toString()); 
   FunctionUtils.hideSoftInputByView(getContext(),mEditText); 
  } 
 } 
 private void delTextValue() { 
  String str = builder.toString(); 
  int len = str.length(); 
  if (len == ) { 
   return; 
  } 
  if (len > && len <= ) { 
   builder.delete(len -,len); 
  } 
  imageViews[len - ].setVisibility(View.INVISIBLE); 
  ; 
 } 
 StringBuilder builder; 
 public interface SecurityEditCompleListener { 
  public void onNumCompleted(String num); 
 } 
 public SecurityEditCompleListener mListener; 
 public void setSecurityEditCompleListener( 
   SecurityEditCompleListener mListener) { 
  this.mListener = mListener; 
 } 
 public void clearSecurityEdit() { 
  if (builder != null) { 
   if (builder.length() == ) { 
    builder.delete(,); 
   } 
  } 
  for (ImageView tv : imageViews) { 
   tv.setVisibility(View.INVISIBLE); 
  } 
 } 
 public EditText getSecurityEdit() { 
  return this.mEditText; 
 } 
} 

这样子其实也实现了简密功能,但是这个比前面那个开源库简单了许多,当然功能也没有前面的那个强大。

以上内容给大家介绍了Android仿微信/支付宝密码输入框的全部叙述,希望大家喜欢。

Android仿微信5实现滑动导航条

Android仿微信5实现滑动导航条

本文实例为大家分享了Android 仿微信5滑动导航效果,供大家参考,具体内容如下

ViewPageAdapter.java

package com.rong;

import java.util.ArrayList;
import java.util.List;

import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;

public class ViewPagerAdapter extends PagerAdapter {

 private List<View> views;

 public ViewPagerAdapter(List<View> views) {
 this.views = views;
 }

 @Override
 public int getCount() {
 return views.size();
 }

 @Override
 public boolean isViewFromObject(View arg0,Object arg1) {
 return arg0 == arg1;
 }

 @Override
 public void destroyItem(View container,int position,Object object) {
 ((ViewPager) container).removeView(views.get(position));
 }

 @Override
 public Object instantiateItem(View container,int position) {
 ((ViewPager) container).addView(views.get(position));
 return views.get(position);
 }

 /**
 * 插入一个View到viewpager中
 * 
 * @param view
 * @return
 */
 public boolean insert(View view) {
 if (this.views == null) {
  this.views = new ArrayList<View>();
 }

 return this.views.add(view);
 }
}

HomeAcitivity.java

package com.rong;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPagechangelistener;
import android.util.displayMetrics;
import android.util.Log;
import android.view.display;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;

import com.rong.wechat5.R;

public class HomeActivity extends Activity {
 private View home_line;
 private int screenWidth1_3;
 private ViewPager home_vp;
 private ViewPagerAdapter viewPagerAdapter;
 private List<View> views = new ArrayList<View>();

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.layout_home);
 initView();
 }

 private void initView() {
 display display = getwindow().getwindowManager().getDefaultdisplay();
 displayMetrics dm = new displayMetrics();
 display.getMetrics(dm);

 home_line = (View) findViewById(R.id.home_line);
 home_vp = (ViewPager) findViewById(R.id.home_vp);

 LayoutParams lp = home_line.getLayoutParams();
 screenWidth1_3 = dm.widthPixels / 3;
 lp.width = screenWidth1_3;
 lp.height = 5;
 home_line.setLayoutParams(lp);

 View layout1 = View.inflate(this,R.layout.layout_view1,null);
 View layout2 = View.inflate(this,R.layout.layout_view2,null);
 View layout3 = View.inflate(this,R.layout.layout_view3,null);
 views.add(layout1);
 views.add(layout2);
 views.add(layout3);
 viewPagerAdapter = new ViewPagerAdapter(views);
 home_vp.setAdapter(viewPagerAdapter);

 home_vp.setonPagechangelistener(new OnPagechangelistener() {

  @Override
  public void onPageSelected(int arg0) {

  }

  @Override
  public void onPageScrolled(int position,float positionOffset,int positionOffsetPixels) {
  Log.i("TAG",position+"=="+positionOffset+"=="+positionOffsetPixels);
  LinearLayout.LayoutParams lp = (android.widget.LinearLayout.LayoutParams) home_line.getLayoutParams();
  lp.leftMargin = (int) (screenWidth1_3 * position + screenWidth1_3* positionOffset);
  home_line.setLayoutParams(lp);
  }

  @Override
  public void onPageScrollStateChanged(int arg0) {

  }
 });
 }

}

layout_home.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:background="#ffffff"
  android:orientation="vertical" >

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:orientation="horizontal" >

    <RelativeLayout
      android:layout_width="0dp"
      android:layout_height="match_parent"
      android:layout_weight="1" >

      <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="消息"
        android:textColor="#000000"
        android:textSize="24sp" />
    </RelativeLayout>

    <RelativeLayout
      android:layout_width="0dp"
      android:layout_height="match_parent"
      android:layout_weight="1" >

      <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="朋友圈"
        android:textColor="#000000"
        android:textSize="24sp" />
    </RelativeLayout>

    <RelativeLayout
      android:layout_width="0dp"
      android:layout_height="match_parent"
      android:layout_weight="1" >

      <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="我"
        android:textColor="#000000"
        android:textSize="24sp" />
    </RelativeLayout>
  </LinearLayout>

  <View
    android:id="@+id/home_line"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:background="#ff0000" />

  <android.support.v4.view.ViewPager
    android:id="@+id/home_vp"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1" />

</LinearLayout>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

Android仿微信下拉列表实现

Android仿微信下拉列表实现

 本文要实现微信6.1中点击顶部菜单栏的“+”号按钮时,会弹出一个列表框。这里用的了Activity实现,其实最好的方法可以用ActionBar,不过这货好像只支持3.0以后的版本。本文的接上文Android仿微信底部菜单栏+顶部菜单栏(附源码)

效果:

技术分享

一、仿微信下拉列表布局pop_dialog.xml

<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >
 
    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginTop="45dp"
        android:layout_marginRight="20dp">

        <LinearLayout
            android:id="@+id/id_pop_dialog_layout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:background="@drawable/pop_item_normal"
            android:orientation="vertical" >

            <LinearLayout
                android:id="@+id/id_groupchat"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"
                android:layout_marginRight="5dp"
                android:layout_marginTop="5dp"
                android:background="@drawable/pop_list_selector" >

                <ImageView
                    android:id="@+id/id_imageView1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:layout_marginLeft="8dp"
                    android:src="@drawable/pop_group" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="8dp"
                    android:text="发起聊天"
                     android:layout_gravity="center_vertical"
                    android:textColor="#fff"
                    android:textSize="16sp" />
            </LinearLayout>

            <ImageView
                android:id="@+id/id_imageView5"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/pop_line" />

            <LinearLayout
                android:id="@+id/id_addfrd"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"
                android:layout_marginRight="5dp"
                android:background="@drawable/pop_list_selector" >

                <ImageView
                    android:id="@+id/id_imageView2"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:layout_marginLeft="8dp"
                    android:src="@drawable/pop_add" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="8dp"
                    android:text="添加朋友"
                      android:layout_gravity="center_vertical"
                    android:textColor="#fff"
                    android:textSize="16sp" />
            </LinearLayout>

            <ImageView
                android:id="@+id/id_imageView5"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/pop_line" />

            <LinearLayout
                android:id="@+id/id_find"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"
                android:layout_marginRight="5dp"
                android:background="@drawable/pop_list_selector" >

                <ImageView
                    android:id="@+id/id_imageView3"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:layout_marginLeft="8dp"
                    android:src="@drawable/pop_qrcode" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="8dp"
                    android:text="扫一扫"
                  android:layout_gravity="center_vertical"
                    android:textColor="#fff"
                    android:textSize="16sp" />
            </LinearLayout>

            <ImageView
                android:id="@+id/id_imageView5"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/pop_line" />

            <LinearLayout
                android:id="@+id/id_feedback"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="3dp"
                android:layout_marginLeft="5dp"
                android:layout_marginRight="5dp"
                android:background="@drawable/pop_list_selector" >

                <ImageView
                    android:id="@+id/id_imageView4"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:layout_marginLeft="8dp"
                    android:src="@drawable/pop_feedback" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="8dp"
                    android:text="帮助与反馈"
                   android:layout_gravity="center_vertical"
                    android:textColor="#fff"
                    android:textSize="16sp" />
            </LinearLayout>
        </LinearLayout>
    </RelativeLayout>

</RelativeLayout>


其中,按下图片后变换颜色:

pop_list_selector.xml如下

pop_list_selector.xml如下

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/pop_item_pressed" android:state_focused="true"/>
    <item android:drawable="@drawable/pop_item_pressed" android:state_pressed="true"/>
    <item android:drawable="@drawable/pop_item_pressed" android:state_selected="true"/>
    <item android:drawable="@drawable/pop_item_normal"/>

</selector>

看看效果,这是去掉标题栏后的(也可以用代码去掉)

技术分享

去掉标题栏的方法:

技术分享

二、对应代码

pop_dialog.xml对应的代码为PopDialogActivity.java

如下:

/**
 * @作者 林炳文(邮箱:ling20081005@126.com)
 * @博客 http://blog.csdn.net/evankaka/
 * @功能描述:弹出微信下拉列表框
 */
package com.example.tabexample;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;

public class PopDialogActivity extends Activity implements OnClickListener{
	//定义四个按钮区域
	private LinearLayout mGroupChat;
	private LinearLayout mAddFrd;
	private LinearLayout mFind;
	private LinearLayout mFeedBack;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.pop_dialog);

		initView();
	}

	/**
	 * 初始化组件
	 */
	private void initView(){
		//得到布局组件对象并设置监听事件
		mGroupChat = (LinearLayout)findViewById(R.id.id_groupchat);
		mAddFrd = (LinearLayout)findViewById(R.id.id_addfrd);
		mFind = (LinearLayout)findViewById(R.id.id_find);
		mFeedBack = (LinearLayout)findViewById(R.id.id_feedback);

		mGroupChat.setOnClickListener(this);
		mAddFrd.setOnClickListener(this);
		mFind.setOnClickListener(this);
		mFeedBack.setOnClickListener(this);
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event){
		finish();
		return true;
	}
	
	@Override
	public void onClick(View v) {
		
	}
}

三、设置背景透明

     如果单这样,当这个Activity出来后,就会把之前的Activity覆盖,但是如果把它背景设置成透明的不就可以了么?方法如下:

在AndroidManifest.xml中添加:

          <!-- 这里一定要注册上这个activity,否则跳转将会失败,因为系统找不到这个activity -->
        <activity
            android:name="com.example.tabexample.PopDialogActivity"
            android:label="@string/app_name" 
            android:theme="@style/MyDialogStyleTop">
        </activity>

其中

"@style/MyDialogStyleTop"

是我自己定义的格式,在value/style下添加:

    <style name="MyDialogStyleTop" parent="android:Theme.Dialog">
        <item name="android:windowFrame">@null</item><!-- 边框 -->
        <item name="android:windowIsFloating">true</item> <!-- 是否浮现在activity之上 -->
        <item name="android:windowIsTranslucent">false</item><!-- 半透明 -->
        <item name="android:windowNoTitle">true</item> <!-- 无标题 -->
        <item name="android:windowBackground">@android:color/transparent</item><!-- 背景透明 -->
        <item name="android:backgroundDimEnabled">false</item><!-- 模糊 -->
    </style>

四、使用

其实使用就是Activity的跳转了,方法很简单,一句:

startActivity(new Intent(MainActivity.this,PopDialogActivity.class));

把这句放在“+”按钮的点击事件当中去,这里添加点击事件就不用说了,很简单,然后最终的效果如下:

技术分享

若你觉得此文对你有用,那就帮我赞一下~~谢谢啦

本文出自 “林炳文博客空间” 博客,请务必保留此出处http://linbingwen.blog.51cto.com/9912186/1619372

Android仿微信下拉列表实现


关于Android仿微信联系人按字母排序微信通讯录按字母排序的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android – 联系人中存在联系人、Android仿微信/支付宝密码输入框、Android仿微信5实现滑动导航条、Android仿微信下拉列表实现等相关知识的信息别忘了在本站进行查找喔。

本文标签: