Android登录记住多个密码的实现方法

先给大家说下我实现的思路:

在popouWindow里面加上ListView,数据是把List以字符串按照JSON的样式存入本地,先看看效果

adapter_user_item.xml是listView 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:background="#ffffff" android:gravity="center" android:minHeight="60dp" android:orientation="horizontal" > <TextView android:id="@+id/adapter_account_item_iphone" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_weight="1" android:background="@null" android:singleLine="true" android:textColor="@android:color/black" android:textSize="15sp" /> <ImageView android:id="@+id/adapter_account_item_delete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:paddingRight="20dp" android:scaleType="fitXY" android:src="@drawable/login_delete_account" /> </LinearLayout>

login_pop_view.xml只是一个列表按钮

<?xml version="1.0" encoding="utf-8"?> <ListView xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:dividerHeight="1dp" android:background="@drawable/dialog_bottom_holo_light" />

UserAdapter.java是适配器,用来填充ListView,在里面增加一个接口,用来处理ListView中的删除账户信息功能,这个功能在Activity中实现

package com.weikong.adapter; import java.util.ArrayList; import java.util.List; import com.weikong.R; import com.weikong.bean.User; import com.weikong.views.LoginActivity; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.TextureView; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; public class UserAdapter extends BaseAdapter{ private List<User> listUsers = new ArrayList<User>(); private Context context; // private LayoutInflater mLayoutInflater = null; private DeleteUser deleteUser; public void setDeleteUser(DeleteUser deleteUser) { this.deleteUser = deleteUser; } public UserAdapter(Context context){ this.context = context; } public void setListUsers(List<User> listUsers){ this.listUsers = listUsers; this.notifyDataSetChanged(); } @Override public int getCount() { // TODO Auto-generated method stub return listUsers.size(); } @Override public User getItem(int position) { // TODO Auto-generated method stub return listUsers.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { UserHolder userHolder = null; if(convertView == null){ <span style="white-space:pre"> </span>//这里装载也要这样写 convertView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.adapter_user_item,parent,false); userHolder = new UserHolder(convertView); <span style="white-space:pre"> </span>//这个很重要哦 userHolder.ivDelete.setTag(position); userHolder.ivDelete.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { deleteUser.deleteUserClick(v); } }); convertView.setTag(userHolder); }else{ userHolder = (UserHolder)convertView.getTag(); } User user = getItem(position); Log.e("", user.getId()); userHolder.tvAccount.setText(user.getId()); userHolder.ivDelete.setImageResource(R.drawable.login_delete_account); return convertView; } class UserHolder{ public TextView tvAccount; public ImageView ivDelete; public UserHolder(View v){ tvAccount = (TextView)v.findViewById(R.id.adapter_account_item_iphone); ivDelete = (ImageView)v.findViewById(R.id.adapter_account_item_delete); } } public interface DeleteUser{ public void deleteUserClick(View v); } } activity_login.xml 布局 [html] view plain copy <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@android:color/white" android:orientation="vertical" android:paddingBottom="10dp" > <ImageView android:id="@+id/loginicon" android:layout_width="120dp" android:layout_height="120dp" android:layout_centerHorizontal="true" android:layout_marginTop="10dp" android:contentDescription="@string/app_name"/> <LinearLayout android:id="@+id/mLayout" android:layout_width="300dp" android:layout_height="60dp" android:layout_below="@+id/loginicon" android:layout_centerHorizontal="true" android:gravity="center" android:layout_marginTop="30dp" android:background="@drawable/login_input_bg" > <EditText android:id="@+id/mobilenum" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginLeft="20dp" android:background="@null" android:hint="@string/please_input_phone" android:maxLength="11" android:singleLine="true" android:textSize="15sp" android:textColor="@android:color/black" /> <ImageView android:id="@+id/login_iv_show_phone_list" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:scaleType="fitXY" android:src="@drawable/ic_find_next_holo_light"/> </LinearLayout> <RelativeLayout android:id="@+id/pLayout" android:layout_width="300dp" android:layout_height="60dp" android:layout_below="@+id/mLayout" android:layout_centerHorizontal="true" android:layout_marginTop="10dp" android:background="@drawable/login_input_bg" > <EditText android:id="@+id/pwd" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:background="@null" android:hint="@string/please_input_password" android:inputType="textPassword" android:singleLine="true" android:textColor="@android:color/black"/> </RelativeLayout> <Button android:id="@+id/dologin" android:layout_width="300dp" android:layout_height="60dp" android:layout_below="@+id/pLayout" android:layout_centerHorizontal="true" android:layout_marginTop="30dp" android:background="@drawable/loginbtn_selector" android:text="@string/login" android:textColor="@android:color/white" android:textSize="@dimen/text_size_larger" /> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_marginTop="10dp" > <Button android:id="@+id/forgetPassword" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_marginTop="5dp" android:background="@null" android:text="@string/forget_password" android:textColor="@android:color/black" android:textSize="@dimen/text_size_larger" /> <Button android:id="@+id/registerbtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_marginTop="5dp" android:background="@null" android:text="@string/register_new_custom" android:textColor="@android:color/black" android:textSize="@dimen/text_size_larger" /> </RelativeLayout> </RelativeLayout>

现在就是在Activity中实现了

package com.weikong.views; import java.util.ArrayList; import java.util.List; import com.weikong.R; import com.weikong.adapter.UserAdapter; import com.weikong.adapter.UserAdapter.DeleteUser; import com.weikong.bean.User; import com.weikong.tools.DateUtil; import com.weikong.tools.Constants; import com.weikong.tools.LocalInfoUtil; import android.annotation.SuppressLint; import android.app.ActionBar.LayoutParams; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.Editable; import android.text.InputType; import android.text.TextWatcher; import android.util.Log; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnFocusChangeListener; import android.view.View.OnTouchListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.EditText; import android.widget.ImageView; import android.widget.ListView; import android.widget.PopupWindow; import android.widget.PopupWindow.OnDismissListener; /** * * @author dengyancheng * @version 1.0 —{2015-07-31} 登陆界面 * */ public class TestActivity extends BaseActivity implements OnTouchListener, OnItemClickListener, OnFocusChangeListener, DeleteUser, TextWatcher, OnDismissListener{ private final static String TAG = LoginActivity.class.getName(); private Context context; /**** 手机号、密码 ***/ private EditText etPhone, etPassword; /**用来显示电话号码列表*/ private ImageView ivShowPhoneList; /**存储电话与密码*/ private List<User> listUsers = null; /**点击ivShowPhoneList图片弹出的会话框*/ private PopupWindow popupWindow; /**在popupWindow中显示账户列表*/ // Cprivate WrapListView wrapListView; private ListView wrapListView; /**适配器*/ private UserAdapter userAdapter; protected static final int UPDATE_POPUWINDOW_HEIGHT_DELETE = 1000; protected static final int UPDATE_POPUWINDOW_HEIGHT_SHOW = 1001; private static final int UPDATE_POPUWINDOW_HEIGHT_DISMISS = 1002; @SuppressLint("HandlerLeak") private Handler myHandler = new Handler() { @Override public void handleMessage(android.os.Message msg) { switch (msg.what) { case UPDATE_POPUWINDOW_HEIGHT_DISMISS: ivShowPhoneList.setImageResource(R.drawable.ic_find_next_holo_light); break; case UPDATE_POPUWINDOW_HEIGHT_DELETE: int popuWidthDelete = findViewById(R.id.mLayout).getWidth()+10; int popuHeightDelete = ((Integer)msg.obj)<3?LayoutParams.WRAP_CONTENT:findViewById(R.id.mLayout).getHeight()*3; popupWindow.setWidth(popuWidthDelete); popupWindow.setHeight(popuHeightDelete); Log.e(TAG, "isShowing()=" + popupWindow.isShowing()); if(popupWindow.isShowing()) { popupWindow.dismiss(); } popupWindow.showAsDropDown(findViewById(R.id.mLayout), -5, -1); break; case UPDATE_POPUWINDOW_HEIGHT_SHOW: int popuWidthShow = findViewById(R.id.mLayout).getWidth()+10; int popuHeightShow = ((Integer)msg.obj)<3?LayoutParams.WRAP_CONTENT:findViewById(R.id.mLayout).getHeight()*3; popupWindow.setWidth(popuWidthShow); popupWindow.setHeight(popuHeightShow); Log.e(TAG, "isShowing()=" + popupWindow.isShowing()); if(popupWindow.isShowing()) { popupWindow.dismiss(); return; } ivShowPhoneList.setImageResource(R.drawable.ic_find_previous_holo_light); popupWindow.showAsDropDown(findViewById(R.id.mLayout), -5, -1); break; default: break; } }; }; @Override protected void onCreate(Bundle arg0) { super.onCreate(arg0); setContentView(R.layout.activity_test); context = this; initView(); addlisener(); } /*** * 初始化控件 */ private void initView() { // 获取本机系统语言 String systemlanguage = getResources().getConfiguration().locale .getCountry(); etPhone = (EditText) findViewById(R.id.mobilenum); etPhone.setOnFocusChangeListener(this); etPhone.addTextChangedListener(this); if (systemlanguage.equals("CN")) { etPhone.setInputType(InputType.TYPE_CLASS_NUMBER); } etPassword = (EditText) findViewById(R.id.pwd); etPassword.setOnFocusChangeListener(this); ivShowPhoneList = (ImageView)findViewById(R.id.login_iv_show_phone_list); ivShowPhoneList.setOnClickListener(this); wrapListView = (ListView) LayoutInflater.from(context).inflate(R.layout.login_pop_view, null); wrapListView.setOnItemClickListener(this); userAdapter = new UserAdapter(this); userAdapter.setDeleteUser(this); wrapListView.setAdapter(userAdapter); popupWindow = new PopupWindow(wrapListView); popupWindow.setBackgroundDrawable(getResources().getDrawable(R.color.transparent)); popupWindow.setFocusable(true); popupWindow.setOutsideTouchable(true); popupWindow.setOnDismissListener(this); } /*** * 添加监听事件 */ private void addlisener() { findViewById(R.id.dologin).setOnClickListener(this); findViewById(R.id.forgetPassword).setOnClickListener(this); findViewById(R.id.registerbtn).setOnClickListener(this); etPhone.setOnTouchListener(this); etPassword.setOnTouchListener(this); } @Override public void onClick(View v) { super.onClick(v); switch (v.getId()) { //点击图片显示存储登录过的账户列表 case R.id.login_iv_show_phone_list: //获取存储在本地的用户登录数据 listUsers = LocalInfoUtil.getUser(context); if(listUsers != null && listUsers.size() > 0){ userAdapter.setListUsers(listUsers); Message message = new Message(); message.obj = listUsers.size(); message.what = UPDATE_POPUWINDOW_HEIGHT_SHOW; myHandler.sendMessage(message); } break; case R.id.dologin: //把登录User信息进行存储 User user = new User(); user.setId(etPhone.getEditableText().toString()); user.setPwd(etPassword.getEditableText().toString()); user.setLoginStatus(1); user.setLoginTime(DateUtil.getCurrentNowTime()); if(listUsers == null){ listUsers = new ArrayList<User>(); } listUsers.add(user); LocalInfoUtil.saveUser(context,listUsers); break; default: break; } } @Override public boolean onTouch(View v, MotionEvent event) { Drawable drawable = null; //判断是否是电话删除 if(v.getId() == R.id.mobilenum){ drawable = etPhone.getCompoundDrawables()[2]; //判断有没有图片 if(drawable == null)return false; //判断是不是按下事件 if(event.getAction() != MotionEvent.ACTION_UP)return false; //进行判断在right图片点击范围 if (event.getX() > etPhone.getWidth()- etPhone.getPaddingRight() - drawable.getIntrinsicWidth()){ etPhone.setText(null); etPassword.setText(null); Log.e("LoginActivity","onTouch()进入删除电话"); } } //判断是否是密码删除 if(v.getId() == R.id.pwd){ drawable = etPassword.getCompoundDrawables()[2]; //判断有没有图片 if(drawable == null)return false; //判断是不是按下事件 if(event.getAction() != MotionEvent.ACTION_UP)return false; if (event.getX() > etPassword.getWidth()- etPassword.getPaddingRight() - drawable.getIntrinsicWidth()){ Log.e("LoginActivity","onTouch()进入删除密码"); etPassword.setText(null); } } return false; } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { User user = (User)parent.getAdapter().getItem(position); etPhone.setText(user.getId()); etPassword.setText(user.getPwd()); } @Override public void deleteUserClick(final View v) { final User user = userAdapter.getItem((Integer)v.getTag()); AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(getString(R.string.tips)) .setMessage(getString(R.string.sure_clear)+"("+user.getId()+")?") .setNegativeButton(getString(R.string.cancle), null) .setPositiveButton(getString(R.string.sure), new DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { listUsers = LocalInfoUtil.getUser(context); if(listUsers == null){ return; } Log.e(TAG,""+listUsers.size()); for (int i = 0; i < listUsers.size(); i++) { if(user.getId().equals(listUsers.get(i).getId())){ listUsers.remove(i); String account = LocalInfoUtil.getValueFromSP(context, Constants.LOACAL_FILE_NAME, Constants.CUSTOME_PHONE_NUN); if(account != null && user.getId().equals(account)){ Log.e(TAG,"清理内存中的对应的账户与密码"); etPassword.setText(null); etPhone.setText(null); LocalInfoUtil.clearValuesByKey(context, Constants.LOACAL_FILE_NAME, Constants.CUSTOME_PHONE_NUN); LocalInfoUtil.clearValuesByKey(context, Constants.LOACAL_FILE_NAME, Constants.CUSTOME_PWD); } break; } } LocalInfoUtil.saveUser(context, listUsers); userAdapter.setListUsers(listUsers); Log.e(TAG, "listUsers.size()="+listUsers.size()); Message message = new Message(); message.obj = listUsers.size(); message.what = UPDATE_POPUWINDOW_HEIGHT_DELETE; myHandler.sendMessage(message); } }).show(); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if(before > 0){ Log.e(TAG, "onTextChanged before>0=true"); etPassword.setText(null); } Log.e(TAG, "onTextChanged start=" + start + " count="+count); if((start + count) == 11){ listUsers = LocalInfoUtil.getUser(context); if(listUsers != null){ Log.e(TAG, "onTextChanged s=" + s); for(User user:listUsers){ if(s.toString().equals(user.getId())){ etPassword.setText(user.getPwd()); break; } Log.e(TAG, "onTextChanged " + user.getId()); } } } } @Override public void afterTextChanged(Editable s) { } @Override public void onFocusChange(View v, boolean hasFocus) { if(v.getId() == R.id.mobilenum){ Log.e(TAG, "onFocusChange mobilenum"); if(hasFocus){ Log.e(TAG, "onFocusChange 图片显示"); etPhone.setCompoundDrawablesWithIntrinsicBounds(null, null, getResources().getDrawable(R.drawable.login_delete_account), null); }else{ Log.e(TAG, "onFocusChange 图片隐藏"); etPhone.setCompoundDrawablesWithIntrinsicBounds(null, null,null, null); } } if(v.getId() == R.id.pwd){ if(hasFocus){ etPassword.setCompoundDrawablesWithIntrinsicBounds(null, null, getResources().getDrawable(R.drawable.login_delete_account), null); }else{ etPassword.setCompoundDrawablesWithIntrinsicBounds(null, null,null, null); } } } @Override public void onDismiss() { myHandler.sendEmptyMessage(UPDATE_POPUWINDOW_HEIGHT_DISMISS); } }

遇到的问题和解决方法:

1、当EditText有焦点时,键盘弹出,弹出框就会出现在顶部,有设置过当弹出框之前隐藏掉键盘,但不行。如下图

2、点击图片按钮popouWindow弹出,箭头是向上,再点击图片按钮,popouWindow消失,图片向下。一开始用图片按钮来控制这个效果,但是popouWindow把这个焦点失去了,所以用popouWindow的消失事件来监听

以上所述是小编给大家介绍的Android登录记住多个密码的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

时间: 2024-10-08 11:35:48

Android登录记住多个密码的实现方法的相关文章

Android通过SharedPreferences实现自动登录记住用户名和密码功能

最近Android项目需要一个自动登录功能,完成之后,特总结一下,此功能依靠SharedPreferences进行实现. SharedPreferences简介 SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data/data/<包名>/shared_prefs目录下.SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现

Android实现记住用户名和密码功能

Android 实现记住用户名和密码的功能是通过SharedPreference 存储来实现的.创建一个复选按钮,通过按钮的否选取来进行事件处理.若按钮选中存储账号和密码的信息.若按钮没有选中,则清空账号和密码的信息. 结果演示: 源代码下载地址: https://github.com/GXS1225/Android-----.git 分析 (1)判断是否输入了账号和密码 if(name.trim().equals("")){ Toast.makeText(this, "请您

360浏览器不能记住用户名和密码的解决方法

  在浏览器菜单栏里面点击工具--Internet选项--内容--个人信息--自动完成,如图: 在弹出的对话框中,勾选提示保存密码.

Android通过&quot;记住密码&quot;功能学习数据存储类SharedPreferences详解及实例_Android

SharedPreferences是Android中存储简单数据的一个工具类.可以想象它是一个小小的Cookie,它通过用键值对的方式把简单数据类型(boolean.int.float.long和String)存储在应用程序的私有目录下(data/data/包名/shared_prefs/)自己定义的xml文件中.  一.简介 它提供一种轻量级的数据存储方式,通过eidt()方法来修改里面的内容,通过Commit()方法来提交修改后的内容.  二.重要方法 public abstract boo

Android通过"记住密码"功能学习数据存储类SharedPreferences详解及实例

SharedPreferences是Android中存储简单数据的一个工具类.可以想象它是一个小小的Cookie,它通过用键值对的方式把简单数据类型(boolean.int.float.long和String)存储在应用程序的私有目录下(data/data/包名/shared_prefs/)自己定义的xml文件中. 一.简介 它提供一种轻量级的数据存储方式,通过eidt()方法来修改里面的内容,通过Commit()方法来提交修改后的内容. 二.重要方法 public abstract boole

Win7开机提示长时间未登录记住密码已过期怎么办

  Win7电脑开机提示长时间未登录记住密码已过期的解决方法. 方法如下: 1.点击开始按钮,选择控制面板,将查看方式修改为大图标,点击"管理工具"; 2.在打开的管理工具页面中点击"本地安全策略"; 3.展开至"安全设置>帐户策略>密码策略",在右侧双击打开"密码最长使用期限"; 4.输入密码过期时间,点击应用并确定即可.

急求!android登录密码验证页面源代码

问题描述 急求!android登录密码验证页面源代码 急求!android登录密码验证页面源代码,1369793795@qq.com 解决方案 <?xml version="1.0" encoding="utf-8"?> android:layout_width="match_parent" android:layout_height="match_parent" android:background="

Android设计登录界面、找回密码、注册功能_Android

本文实例为大家分享了Android 登录.找回密码.注册功能的实现代码,供大家参考,具体内容如下 1.数据库的设计 我在数据库中添加了两张表,一张表用来存储用户信息,诸如用户名,密码,手机号等,可任意添加.另一张表用来存储上一个登录用户的账户信息,我是为了方便才另外创建了一张表去存储,而且这张表我设计了它只能存储一条信息,每次的存储都是对上一条记录的覆盖.事实上,我尝试过在存储用户信息的那张表内添加一个标识,用来标记上一次登录的是哪一个帐号,但是这样做的话,每次改变标识都需要遍历整张表,十分的麻

网页登录中实现记住用户名和密码的功能(完成自动登录)

error_reporting(0); session_start(); ?>  代码如下 复制代码 <!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.111cn.net/1999/xhtml&