Android Studio初学者实例:SharedPreferences 登录/注册模块实现

该实验是紧接上一期使用SP登录、记住密码的实验,主要实现是除了上次登陆以外,登录以后在主界面有一系列假数据,可以通过右上角进行排序选择,以下是实验效果:

 示例:好友名排序效果

首先是登陆界面以及逻辑代码,在逻辑代码中实现记住密码(勾选选择框后)

activity_login3.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#E6E6E6"
    android:orientation="vertical"
    android:padding="10dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:background="@android:color/white"
        android:orientation="horizontal">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:text="账号:"
            android:textColor="#000"
            android:textSize="20sp" />
        <EditText

            android:id="@+id/et_account"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:background="@null"
            android:padding="10dp" />
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:background="@android:color/white"
        android:orientation="horizontal">
        <TextView
            android:id="@+id/tv_password"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:text="密码:"
            android:textColor="#000"
            android:textSize="20sp" />

        <EditText
            android:id="@+id/et_password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:background="@null"
            android:inputType="textPassword"
            android:padding="10dp" />
    </LinearLayout>

    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="记住密码"
        android:id="@+id/cb"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:id="@+id/btn_login"
            android:layout_weight="1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="25dp"
            android:background="#3C8DC4"
            android:text="登录"
            android:textColor="@android:color/white"
            android:textSize="20sp" />
        <Button
            android:id="@+id/btn_reg"
            android:layout_weight="1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="25dp"
            android:background="#3C8DC4"
            android:text="注册"
            android:textColor="@android:color/white"
            android:textSize="20sp" />
    </LinearLayout>

</LinearLayout>

 登陆成功后跳转到主界面,主界面由一个ListView和右上角抽屉Menu构成

以下是主界面的界面代码

activity_main60.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity60">

  <ListView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
    android:id="@+id/lv"/>
  </LinearLayout>

 因为用到了ListView,所以需要一个item的布局代码:

frin_item.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="horizontal"
    android:padding="10dp">

    <ImageView
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:src="@drawable/txlogo" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

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

            <TextView
                android:id="@+id/id"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="ID:1"
                android:textSize="20dp" />

            <TextView
                android:id="@+id/name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="姓名:李"
                android:textSize="20dp" />
        </LinearLayout>

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

            <TextView
                android:id="@+id/sex"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="性别:女"
                android:textSize="20dp" />

            <TextView
                android:id="@+id/phone"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="电话:123123"
                android:textSize="20dp" />
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

 menu的代码:(在res下创建menu文件夹在文件夹中创建menu.xml)

menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menu_order"
        android:icon="@android:drawable/ic_menu_help"
        android:title="排序"
        />
</menu>

 接下来是主界面的逻辑代码,需要处理几件事:设置好友初始化数据、设置ListView适配器以及显示数据、初始化Menu、点击Menu能够跳转到选择排序的设置界面

值得注意的是适配器采用内部类的方式写在了MainActivity60中

以下是逻辑代码:

首先是登录界面的逻辑代码(上期内容)

SharedHelper

import android.content.Context;
import android.content.SharedPreferences;
import android.widget.Toast;

import java.util.HashMap;
import java.util.Map;

public class SharedHelper {

    private Context mContext;

    public SharedHelper() {
    }

    public SharedHelper(Context mContext) {
        this.mContext = mContext;
    }

    //定义一个保存数据的方法
    public void save(String username, String passwd) {
        SharedPreferences sp = mContext.getSharedPreferences("mysp", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.putString("username", username);
        editor.putString("passwd", passwd);
        editor.commit();

    }

    //定义一个读取SP文件的方法
    public Map<String, String> read() {
        Map<String, String> data = new HashMap<String, String>();
        SharedPreferences sp = mContext.getSharedPreferences("mysp", Context.MODE_PRIVATE);
        data.put("username", sp.getString("username", ""));
        data.put("passwd", sp.getString("passwd", ""));
        return data;
    }
//清空SP
    public void clear(){
        SharedPreferences sp = mContext.getSharedPreferences("mysp", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.clear();
        editor.commit();
    }
}

LoginActivity

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

import java.util.Map;

public class LoginActivity extends AppCompatActivity {
    private EditText et_account, et_password;
    private Button btn_login,reg_login;
    private CheckBox cb;
    private SharedHelper sh;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login3);
        et_account = (EditText)findViewById(R.id.et_account);
        et_password = (EditText)findViewById(R.id.et_password);
        cb = (CheckBox)findViewById(R.id.cb);
        //判断SharedPreferences中是否保存name的值

        sh = new SharedHelper(LoginActivity.this);
        Map<String, String> data = sh.read();
        et_account.setText(data.get("username"));
        et_password.setText(data.get("passwd"));
        if(!et_account.getText().toString().isEmpty()){
            cb.setChecked(true);
        }

        btn_login = findViewById(R.id.btn_login);
        btn_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String username = et_account.getText().toString();
                String passwd = et_password.getText().toString();
                if (username.isEmpty() || passwd.isEmpty()) {
                    Toast.makeText(LoginActivity.this, "请输入完整账号密码", Toast.LENGTH_SHORT).show();
                } else {
                    if (cb.isChecked()) {
                        sh.save(username, passwd);
                    } else {
                        sh.clear();
                    }
                    Toast.makeText(LoginActivity.this, "登陆成功", Toast.LENGTH_SHORT).show();
                    Intent intent=new Intent(LoginActivity.this,MainActivity60.class);
                    startActivity(intent);
                }


            }
        });
    }
}

MainActivity60

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class MainActivity60 extends AppCompatActivity {
List<Friend> friends=new ArrayList<>();
ListView lv;
    myDapter myAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main60);
        if(friends.size()<1){
            friends.add(new Friend("1","张三","123123","男"));
            friends.add(new Friend("2","李四","321","男"));
            friends.add(new Friend("3","王五","43534","男"));
            friends.add(new Friend("4","喜羊羊","4364","男"));
            friends.add(new Friend("5","美羊羊","74568","女"));
            friends.add(new Friend("6","懒羊羊","76864","男"));
            friends.add(new Friend("7","沸羊羊","3234","男"));
            friends.add(new Friend("8","慢羊羊","5436","男"));
        }
        myAdapter=new myDapter();
        lv=findViewById(R.id.lv);
        lv.setAdapter(myAdapter);

    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable @org.jetbrains.annotations.Nullable Intent data) {
        //排序
        SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
        int sortBy = pref.getInt("sort", 1);
        //创建比较器
        Comparator<Friend> comparator = null;
        switch(sortBy){
            case 1:
                comparator = new SortById();
                break;
            case 2:
                comparator = new SortByName();
                break;
            case 3:
                comparator = new SortByPhone();
                break;
            case 4:
                comparator = new SortBySex();
                break;
        }

        Collections.sort(friends, comparator);
        myAdapter.notifyDataSetChanged();
        super.onActivityResult(requestCode, resultCode, data);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu,menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.menu_order:
                Intent intent1 = new Intent(MainActivity60.this,SettingActivity.class);
                startActivityForResult(intent1, 0);
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    class myDapter extends BaseAdapter{

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

        @Override
        public Object getItem(int position) {
            return friends.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view=View.inflate(MainActivity60.this,R.layout.frin_item,null);
            TextView id=view.findViewById(R.id.id);
            TextView name=view.findViewById(R.id.name);
            TextView sex=view.findViewById(R.id.sex);
            TextView phone=view.findViewById(R.id.phone);
            id.setText("ID:"+friends.get(position).getId());
            name.setText("姓名:"+friends.get(position).getName());
            sex.setText("性别:"+friends.get(position).getSex());
            phone.setText("电话:"+friends.get(position).getPhone());
            return view;
        }
    }
}

 还差一个用于选择排序的Activity,界面由RadioGroup以及RadioButton构成,在逻辑代码中则是在SP中设置选择的排序并返回主界面。

activity_setting.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    tools:context=".SettingActivity">

    <RadioGroup
        android:id="@+id/rgSortMethod"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="排序方式" />

        <RadioButton
            android:id="@+id/rdoSortById"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="按ID排序" />

        <RadioButton
            android:id="@+id/rdoSortByName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="按好友名字排序" />

        <RadioButton
            android:id="@+id/rdoSortByPhone"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="按电话号码排序" />

        <RadioButton
            android:id="@+id/rdoSortBySex"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="按性别排序" />
    </RadioGroup>

    <Button
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="确定" />
</LinearLayout>

 SettingActivity

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.RadioGroup;

public class SettingActivity extends AppCompatActivity {
    RadioGroup rgSortBy;
    SharedPreferences pref;
    int sortBy;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_setting);
        rgSortBy = (RadioGroup) findViewById(R.id.rgSortMethod);
        pref = PreferenceManager.getDefaultSharedPreferences(this);
         sortBy = pref.getInt("sort", 1);
        switch (sortBy) {
            case 1:
                rgSortBy.check(R.id.rdoSortById);
                break;
            case 2:
                rgSortBy.check(R.id.rdoSortByName);
                break;
            case 3:
                rgSortBy.check(R.id.rdoSortByPhone);
                break;
            case 4:
                rgSortBy.check(R.id.rdoSortBySex);
                break;

        }
        rgSortBy.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                switch (checkedId) {
                    case R.id.rdoSortById:
                        sortBy = 1;
                        break;
                    case R.id.rdoSortByName:
                        sortBy = 2;
                        break;
                    case R.id.rdoSortByPhone:
                        sortBy = 3;
                        break;
                    case R.id.rdoSortBySex:
                        sortBy = 4;
                        break;

                }
            }
        });
        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //保存排序方式
                pref.edit().putInt("sort", sortBy).commit();
                Intent intent = new Intent();
                Bundle bundle = new Bundle();
                bundle.putString("type", "order");
                intent.putExtras(bundle);
                intent.setClass(SettingActivity.this, MainActivity.class);
                setResult(RESULT_OK, intent);
                finish();
            }
        });
    }
}

另外,前面用到一个实体类,这里给出

Friend

public class Friend {
    private  String id;
    private String name;
    private String phone;
    private String sex;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Friend(String id, String name, String phone, String sex) {
        this.id = id;
        this.name = name;
        this.phone = phone;
        this.sex = sex;
    }
}

还有几个比较器:(结构都大致相同的)

SortById
import java.text.Collator;
import java.util.Comparator;
import java.util.Locale;

public class SortByName implements Comparator<Friend> {
    @Override
    public int compare(Friend f1, Friend f2) {
        Comparator comparator = Collator.getInstance(Locale.CHINESE); //这里是中文,如果不是中文,//里面的Locale.CHINESE可以去掉
        return comparator.compare(f1.getId(), f2.getId());
    }
}
SortByName
import java.text.Collator;
import java.util.Comparator;
import java.util.Locale;

public class SortByName implements Comparator<Friend> {
    @Override
    public int compare(Friend f1, Friend f2) {
        Comparator comparator = Collator.getInstance(Locale.CHINESE); //这里是中文,如果不是中文,//里面的Locale.CHINESE可以去掉
        return comparator.compare(f1.getName(), f2.getName());
    }
}
SortByPhone
import java.text.Collator;
import java.util.Comparator;
import java.util.Locale;

public class SortByPhone implements Comparator<Friend> {
    @Override
    public int compare(Friend f1, Friend f2) {
        Comparator comparator = Collator.getInstance(Locale.CHINESE); //这里是中文,如果不是中文,//里面的Locale.CHINESE可以去掉
        return comparator.compare(f1.getPhone(), f2.getPhone());
    }
}
SortBySex
import java.text.Collator;
import java.util.Comparator;
import java.util.Locale;

public class  SortBySex implements Comparator<Friend> {
    @Override
    public int compare(Friend f1, Friend f2) {
        Comparator comparator = Collator.getInstance(Locale.CHINESE); //这里是中文,如果不是中文,//里面的Locale.CHINESE可以去掉
        return comparator.compare(f1.getSex(), f2.getSex());
    }
}

猜你喜欢

转载自blog.csdn.net/m0_59558544/article/details/130617437