App登录保存多个账号-----sharedpreferences保存list

忘记上次写博客是多久之前. 最近有优化项目中的登录模块 之前用户登录的账号密码都是在数据库中保存的,但我感觉就账号密码用sharedpreferences(以下简称SP)保存就够了.所以才有了这篇博客的记录.

我们在平常使用中大多数时候用sp来保存基本数据类型. 但今天我们来做一个类似qq登录一样可以保存多个账号和密码的功能.

下面我们开始

  • 先简单的画个布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <EditText
            android:id="@+id/et_id"
            android:layout_width="230dp"
            android:layout_height="wrap_content" />

        <ImageView
            android:id="@+id/iv_show_dialog"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:background="@mipmap/haier_ic_arrow_down" />
    </LinearLayout>

    <EditText
        android:id="@+id/et_pwd"
        android:layout_width="230dp"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/btn_set"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="保存" />

    <Button
        android:id="@+id/btn_get"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="取出" />
</LinearLayout>
  • 我们来看一下sp怎么保存list-----可以看到是把list转成json数据来保存
    /**
         * 保存List
         *
         * @param tag 
         * @param datalist
         */
        public void setDataList(String tag, List<People> datalist) {
            if (null == datalist || datalist.size() <= 0)
                return;
    
            Gson gson = new Gson();
            //转换成json数据,再保存
            String strJson = gson.toJson(datalist);
            editor.clear();
            editor.putString(tag, strJson);
            editor.commit();
        }
  • 然后就是取了
    /**
         * 获取List
         *
         * @param tag
         * @return
         */
        public List<People> getDataList(String tag) {
            List<People> datalist = new ArrayList<>();
            String strJson = preferences.getString(tag, null);
            if (null == strJson) {
                return datalist;
            }
            Gson gson = new Gson();
            datalist = gson.fromJson(strJson, new TypeToken<List<People>>() {
            }.getType());
            return datalist;
    
        }

    还记的刚才我们保存的时候是把list转成了json 来进行保存的,那取的话 我们一步肯定是要把这个保存的json数据取出来它是一个String类型.然后只要对String进行解析就可以拿到里面之前保存的数据了

      就是这句话

 datalist = gson.fromJson(strJson, new TypeToken<List<People>>() {
        }.getType());

 我们还需要创建一个保存账号密码的实体类

public class People implements Serializable{

    private String name;
    private String pwd;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
}

接下来我们来写Activity 来看看怎么使用

 findViewById(R.id.btn_set).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                   user = new People();
                    user.setName(et_id.getText().toString());
                    user.setPwd(et_pwd.getText().toString());
                    classTests.add(user);
                    SpdataSave.setDataList("login", classTests);
             }
        });

嗯就这么几行代码就保存完了 来看一下 首先

1.获取去editText中的name和password

2.通过实体类set方法 保存.

3.把实体类添加到list中

4.然后把list存入到sp中 

这样就把list保存到sp中了.但是聪明的你会发现这么保存时没有去重的,就是 只要你输入什么 它就给你保存什么,很显然我们不需要保存重复的数据. 下面我就来看看怎么去重

 findViewById(R.id.btn_set).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                user = new People();
                if (classTests.size() == 0) {
                    user.setName(et_id.getText().toString());
                    user.setPwd(et_pwd.getText().toString());
                    classTests.add(user);
                    SpdataSave.setDataList("login", classTests);
                } else {
                    List<String> userNames = new ArrayList<>();
                    for (int i = 0; i < classTests.size(); i++) {
                        userNames.add(classTests.get(i).getName());
                    }
                    boolean contains = userNames.contains(et_id.getText().toString());
                    if (contains == false) {
                        user.setName(et_id.getText().toString());
                        user.setPwd(et_pwd.getText().toString());
                        classTests.add(user);
                        SpdataSave.setDataList("javaBean", classTests);
                        Log.e("AYd", "" + classTests.contains(et_id.getText().toString()));
                    }

                }
            }
        });

首先当list的size为0时 我们就正常保存就可以..我们看else里面 在代码中 我又创建了一个list ,这个list是干啥的呢? 没错 我把之前保存账号密码的那个list里面的name全部遍历存到了这个userNames中,为什么要怎么操作了? 接着往下看.我们都知道 判断list中是否包含某个元素可以用 contanis 来判断.这里我就用它来判断 用户输入的这个name在 userNames 这个list中是否存在.如果不存在就把他存进去.存在就保存了.

  • 最后看看取 的代码
     classTests = SpdataSave.getDataList("login");
            if (classTests.size() > 0) {
                Log.e("AYD", classTests.size() + "");
                et_id.setText(classTests.get(classTests.size() - 1).getName());
                et_pwd.setText(classTests.get(classTests.size() - 1).getPwd());
            }

    很简单..这里呢 我取的是 最后一个登陆的账号和密码

  • 还有显示在popupwindow上的 我下面把Adapter代码贴出来 很简单..

      class PopListAdapter extends BaseAdapter {
            List<People> list;
            public PopListAdapter(List<People> list) {
                this.list = list;
            }
            @Override
            public int getCount() {
                return null == list ? 0 : list.size();
            }
    
            @Override
            public Object getItem(int location) {
                return list.get(location);
            }
    
            @Override
            public long getItemId(int arg0) {
                return arg0;
            }
    
            @Override
            public View getView(final int position, View convertView, ViewGroup group) {
                ViewHolder viewHolder;
                if (convertView == null) {
                    viewHolder = new ViewHolder();
                    convertView = LayoutInflater.from(SpActivity.this).inflate(R.layout.pop_username_list_item, group, false);
                    viewHolder.tv_username =convertView.findViewById(R.id.tv_username);
                    convertView.setTag(viewHolder);
                } else {
                    viewHolder = (ViewHolder) convertView.getTag();
                }
                final People bean = list.get(position);
    
                if (bean == null) {
                    viewHolder.tv_username.setText("没有任何账号");
                } else {
                    viewHolder.tv_username.setText(bean.getName());
                }
                convertView.setClickable(true);
    
                convertView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        try {
                            if (null != classTests && classTests.size() > 0) {
                                people = classTests.get(position);
                                et_id.setText(people.getName());
                                if (people.getPwd() != null && !people.getPwd().equals("")) {
                                    et_pwd.setText(people.getPwd());
                                } else {
                                    et_pwd.setText("");
                                }
                                et_pwd.requestFocus();
                            }
                            popupWindowDissmiss();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
                return convertView;
            }
        }
        class ViewHolder {
            private TextView tv_username;
            private ImageButton ivb_clean;
        }

    看完有帮助就点个赞吧~
    补充: 由于当时 忘记删掉 HaierUserCenterSDK:3.3.8 这个sdk 的依赖, 导致跑项目的时候会报错,直接删掉依赖就可以,抱歉

  • Demo下载看这里.........

 

### 回答1: 跑起来了健身app是一款基于安卓平台开发的健身应用。以下是关于跑起来了健身app的安卓代码。 1. 主界面布局文件 首先,创建一个主界面布局文件,其中包括一个顶部导航栏、一个底部导航栏以及一个显示内容的主体布局,可以使用LinearLayout或者RelativeLayout进行布局。可以使用XML代码来定义各个元素的样式和位置。 2. 界面跳转 在MainActivity中添加按钮点击事件,使用Intent进行页面跳转,将主界面跳转到健身计划页面或跑步记录页面。使用startActivity方法启动相应的Activity。 3. 健身计划页面 创建一个健身计划页面的布局文件,其中包括显示用户当前计划的文本框、选择健身计划的下拉菜单、开始健身按钮等元素。当用户选择了健身计划并点击开始按钮时,通过Intent将用户选定的计划传递到健身记录页面。 4. 跑步记录页面 创建跑步记录页面的布局文件,其中包括显示跑步历史记录的列表视图、显示总里程和总时间的文本框等元素。通过在代码中获取用户的历史跑步数据,并将其显示在列表视图中。 5. 用户计划和记录数据的储 使用SharedPreferences或者数据库来储用户的健身计划和跑步记录数据。在用户选择计划时,将计划保存SharedPreferences或者数据库中。在用户完成跑步记录时,将跑步的时间和里程保存SharedPreferences或者数据库中。 以上是大致的健身app安卓代码概述,具体实现还需根据需求和功能进行详细开发和调试。 ### 回答2: 跑起来了健身app一个关于健身运动的安卓应用程序。下面是一个简化版本的安卓代码示例: 首先,在AndroidManifest.xml文件中添加必要的权限声明,例如访问网络、储等权限。 接下来,创建一个MainActivity类,是应用程序的入口点。在这个类中,你可以设置主界面的布局和组件,例如显示用户运动数据的文本框或实时运动轨迹的地图。 然后,创建一个运动跟踪服务的类,例如TrackingService类。这个类可以使用传感器来监测用户的运动,例如计步器或加速度计。它还可以使用地理位置服务来记录用户的运动轨迹,并计算距离和花费的卡路里。 在MainActivity类中,你可以使用Intent来启动和停止TrackingService类,以便在应用程序运行时跟踪用户的运动数据。 在界面上,你可以添加按钮或菜单选项,用于启动和停止跟踪服务。你还可以显示用户的运动数据和统计信息,例如每日步数、路程和消耗卡路里等。 除了运动跟踪服务,你还可以添加其他功能,例如饮食记录、健身计划或社交媒体分享等。 最后,在代码中添加适当的注释和错误处理,以提高应用程序的可靠性和用户体验。 总之,以上是一个简化版本的跑起来了健身app的安卓代码示例。根据实际需求,你可以进一步扩展和优化代码,以实现更多功能和提升用户体验。 ### 回答3: 跑起来了健身App一个运动健身类的安卓应用,以下是它的核心功能和部分代码实现。 1. 用户注册和登录功能: 用户可以通过手机号或邮箱进行注册,注册成功后可以使用账号登录。以下是注册和登录功能的部分代码实现: 注册功能: ```java public void register(String username, String password, String email) { // 检查输入信息的合法性 if (!isValidUsername(username)) { // 用户名不合法的处理逻辑 return; } if (!isValidPassword(password)) { // 密码不合法的处理逻辑 return; } if (!isValidEmail(email)) { // 邮箱不合法的处理逻辑 return; } // 将注册信息保存到数据库 // ... } private boolean isValidUsername(String username) { // 检查用户名合法性的逻辑 } private boolean isValidPassword(String password) { // 检查密码合法性的逻辑 } private boolean isValidEmail(String email) { // 检查邮箱合法性的逻辑 } ``` 登录功能: ```java public boolean login(String username, String password) { // 检查输入信息的合法性 if (!isValidUsername(username)) { // 用户名不合法的处理逻辑 return false; } if (!isValidPassword(password)) { // 密码不合法的处理逻辑 return false; } // 验证用户名和密码是否匹配 // ... // 返回登录结果 return true; } ``` 2. 健身计划和记录功能: 用户可以制定自己的运动健身计划,并记录自己的运动进度。以下是健身计划和记录功能的部分代码实现: 创建健身计划: ```java public void createFitnessPlan(String planName, String description, List<String> exercises) { // 创建健身计划对象并设置属性 FitnessPlan plan = new FitnessPlan(); plan.setPlanName(planName); plan.setDescription(description); plan.setExercises(exercises); // 保存健身计划到数据库 // ... } ``` 记录运动进度: ```java public void recordExerciseProgress(String exerciseName, int duration, int caloriesBurned) { // 创建运动记录对象并设置属性 ExerciseProgress progress = new ExerciseProgress(); progress.setExerciseName(exerciseName); progress.setDuration(duration); progress.setCaloriesBurned(caloriesBurned); // 保存运动记录到数据库 // ... } ``` 通过以上的代码实现,用户可以在跑起来了健身App中注册、登录账号,并创建自己的健身计划,并记录运动进度。这样用户可以很方便地管理和追踪自己的健身活动。当然,除了以上提到的功能,还可以添加其它功能,如社交分享、运动排行榜等,让用户更好地享受健身的乐趣和互动。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值