Android Studio beginner example: SharedPreferences login/registration module implementation

This experiment is followed by the previous experiment using SP to log in and remember the password. The main realization is that in addition to the last login, there will be a series of fake data on the main interface after login, which can be sorted and selected in the upper right corner. The following is the experimental result:

 Example: Sorting effect of friend names

The first is the login interface and the logic code, and remember the password in the logic code (after checking the selection box)

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>

 Jump to the main interface after successful login, the main interface consists of a ListView and a drawer Menu in the upper right corner

The following is the interface code of the main interface

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>

 Because ListView is used, an item layout code is required:

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>

 The code of the menu: (create the menu folder under res and create menu.xml in the folder)

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>

 Next is the logic code of the main interface, which needs to deal with several things: set friends to initialize data, set ListView adapter and display data, initialize Menu, click Menu to jump to the setting interface of selection sorting

It is worth noting that the adapter is written in MainActivity60 as an internal class

Here is the logic code:

The first is the logic code of the login interface (the content of the previous issue)

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;
        }
    }
}

 There is still an Activity for selection and sorting. The interface is composed of RadioGroup and RadioButton. In the logic code, the selection sorting is set in SP and returns to the main interface.

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();
            }
        });
    }
}

In addition, an entity class was used earlier, which is given here

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;
    }
}

There are also several comparators: (the structure is roughly the same)

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());
    }
}

Guess you like

Origin blog.csdn.net/m0_59558544/article/details/130617437