登录界面

先设置密码登录与验证码登录两个选项,用两边各一个1重量的view达到居中的效果,参考:
*已弃用

java设置字体大小
setTextsize默认sp单位,输入纯数字,源码
public void setTextSize(float size) {setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
要输入dp单位需要改为bt_forgetpassword.setTextSize(TypedValue.COMPLEX_UNIT_DIP,10);
参考:https://www.cnblogs.com/duanweishi/p/4449588.html
java转变输入框输入格式
setInputType(int type):
setInputType(InputType.TYPE_CLASS_NUMBER) 改为数字输入

注意:通过代码给InputType赋值时,不是设置TYPE_XXX_VARIATION_YYY,而是要设置TYPE_CLASS_XXX | TYPE_XXXX_VARAITION_YYY
setRawInputType(int type):改变键盘的显示,比如数字键盘,字符键盘,但是这个方法不改变你原有的设置的字符限制。
参考:https://www.lmlphp.com/user/57942/article/item/625968/
是否显示部件
setVisibility(View.VISIBLE) 显示
setVisibility(View.INVISIBLE) 隐藏
setVisibility(View.GONE) 消失
xml控件的命名:https://blog.csdn.net/qq_51985653/article/details/113741561
改变按钮无法点击时的背景颜色
android:backgroundTint="@color/teal_700"
bt_login.setBackgroundTintList(ContextCompat.getColorStateList(this,R.color.teal_700));

监控两个输入框,当都不为空时按钮亮起(TextWatcher)

单选按钮
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId){
//选择密码登录
case R.id.rb_password:
et_password2.setText("");
tv_password.setText("密 码:");
et_password2.setHint("请输入密码");
bt_forgetpassword.setText("忘记密码");
bt_forgetpassword.setTextSize(TypedValue.COMPLEX_UNIT_DIP,10);
et_password2.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD);
ck_remember.setVisibility(View.VISIBLE);
break;
//选择验证码登录
case R.id.rb_verifycode:
et_password2.setText("");
tv_password.setText("验证码:");
et_password2.setHint("请输入验证码");
bt_forgetpassword.setText("获得验证码");
bt_forgetpassword.setTextSize(8);
et_password2.setInputType(InputType.TYPE_CLASS_NUMBER);
ck_remember.setVisibility(View.INVISIBLE);
break;
}
}
对三个按钮的设置
@Override
public void onClick(View v) {
String phone = et_phone.getText().toString();
if(phone.length()!=11) {
Toast.makeText(this, "请输入正确的手机号", Toast.LENGTH_LONG).show();
return;
}
switch (v.getId()) {
case R.id.bt_login:
playSound(1);
if(rb_password.isChecked()){
if(!mPassword.equals(et_password2.getText().toString())){
Toast.makeText(this,"用户名或密码错误",Toast.LENGTH_LONG).show();
et_password2.setText("");
return;
}
//成功登录
else{
loginSuccess();
Toast.makeText(this,"登录成功",Toast.LENGTH_LONG).show();
}
} else if (rb_verifycode.isChecked()) {
if (verifycode_isclick){
if (!verifyCode.equals(et_password2.getText().toString())) {
Toast.makeText(this, "验证码错误", Toast.LENGTH_LONG).show();
et_password2.setText("");
return;
} else {
loginSuccess();
Toast.makeText(this, "登录成功", Toast.LENGTH_LONG).show();
}
}
else {
Toast.makeText(this,"请获取验证码",Toast.LENGTH_LONG).show();
}
}
break;
case R.id.bt_forgetpassword:
playSound(2);
if (rb_password.isChecked()) {
//携带手机号码跳转找回密码界面
Intent intent = new Intent(this, LoginForgetActivity.class);
intent.putExtra("phone", phone);
register.launch(intent);
} else if (rb_verifycode.isChecked()) {
//生成六位验证码
verifycode_isclick = true;
verifyCode = String.format("%04d", new Random().nextInt(9999));
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("请记住验证码");
builder.setMessage("手机号" + phone + ",本次验证码是" + verifyCode + ",请输入验证码");
builder.setPositiveButton("好的", null);
AlertDialog dialog = builder.create();
dialog.show();
}
break;
}
}
registerForActivityResult()方法的简单理解和使用
https://blog.csdn.net/weixin_50822129/article/details/127644130
把另一个页面的数据传到本页面上
本页面:
register = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if(result.getResultCode() == Activity.RESULT_OK) {
mPassword = result.getData().getStringExtra("newpassword");
}
}
});
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_forgetpassword:
if (rb_password.isChecked()) {
//携带手机号码跳转找回密码界面
Intent intent = new Intent(this, LoginForgetActivity.class);
intent.putExtra("phone", phone);
register.launch(intent);
}
break;
}
}
另一个页面
phone = getIntent().getStringExtra("phone");
switch (v.getId()){
case R.id.bt_newpassword:
if(verifycode_isclick) {
if(verifyCode.equals(et_verifycode.getText().toString())) {
Intent intent = new Intent(this, LoginMainActivity.class);
intent.putExtra("newpassword",newpassword);
setResult(RESULT_OK,intent);
finish();
}
break;
}
提示窗口

→

登录成功,弹框,跳转
private void loginSuccess() {
String desc = String.format("用户%s,欢迎回来",et_phone.getText().toString());
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(desc);
builder.setPositiveButton("确定", (dialog, which) -> {
Intent intent = new Intent(this,DatePick.class);
startActivity(intent);
});
AlertDialog dialog = builder.create();
dialog.show();
}
另一个页面

package com.example.chapter05;
import...
public class LoginForgetActivity extends AppCompatActivity implements View.OnClickListener, View.OnFocusChangeListener {
private EditText et_newpassword;
private EditText et_newpassword2;
private EditText et_verifycode;
private Button bt_verifycode;
private Button bt_newpassword;
private boolean verifycode_isclick;
private String verifyCode;
private String phone;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login_forget);
//从上个页面获得手机号
phone = getIntent().getStringExtra("phone");
et_newpassword = findViewById(R.id.et_newpassword);
et_newpassword2 = findViewById(R.id.et_newpassword2);
et_verifycode = findViewById(R.id.et_verifycode);
bt_verifycode = findViewById(R.id.bt_verifycode);
bt_newpassword = findViewById(R.id.bt_newpassword);
bt_verifycode.setOnClickListener(this);
bt_newpassword.setOnClickListener(this);
et_newpassword.setOnFocusChangeListener(this);
et_newpassword2.setOnFocusChangeListener(this);
et_verifycode.setOnFocusChangeListener(this);
verifycode_isclick = false;
TextWatcher textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
bt_newpassword.setEnabled(!TextUtils.isEmpty(et_newpassword.getText())&&!TextUtils.isEmpty(et_newpassword2.getText())&&!TextUtils.isEmpty(et_verifycode.getText()));
}
@Override
public void afterTextChanged(Editable s) {
}
};
et_newpassword.addTextChangedListener(textWatcher);
et_newpassword2.addTextChangedListener(textWatcher);
et_verifycode.addTextChangedListener(textWatcher);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.bt_verifycode:
verifycode_isclick = true;
verifyCode = String.format("%04d", new Random().nextInt(9999));
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("请记住验证码");
builder.setMessage("手机号" + phone + ",本次验证码是" + verifyCode + ",请输入验证码");
builder.setPositiveButton("好的", null);
AlertDialog dialog = builder.create();
dialog.show();
break;
case R.id.bt_newpassword:
String newpassword = et_newpassword.getText().toString();
String newpassword2 = et_newpassword2.getText().toString();
if(!newpassword.equals(newpassword2)){
Toast.makeText(this,"两次输入的密码需一致",Toast.LENGTH_LONG).show();
return;
}
if(verifycode_isclick) {
if(verifyCode.equals(et_verifycode.getText().toString())) {
Intent intent = new Intent(this, LoginMainActivity.class);
intent.putExtra("newpassword",newpassword);
setResult(RESULT_OK,intent);
finish();
}
else Toast.makeText(this,"验证码错误",Toast.LENGTH_LONG).show();
}
else Toast.makeText(this,"请发送验证码",Toast.LENGTH_LONG).show();
break;
}
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(!hasFocus){
InputMethodManager manager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
if(manager!=null)
manager.hideSoftInputFromWindow(v.getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
}
}
}
实现记住密码功能
preferences = getSharedPreferences("config", Context.MODE_PRIVATE);
reload();
private void reload() {
String phone = preferences.getString("phone","");
String password = preferences.getString("password","");
Boolean isremember = preferences.getBoolean("isremember",false);
if(isremember){
et_phone.setText(phone);
et_password2.setText(password);
ck_remember.setChecked(true);
}
}
private void loginSuccess() {
String desc = String.format("用户%s,欢迎回来",et_phone.getText().toString());
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(desc);
builder.setPositiveButton("确定", (dialog, which) -> {
Intent intent = new Intent(this,DatePick.class);
startActivity(intent);
});
AlertDialog dialog = builder.create();
dialog.show();
if(ck_remember.isChecked()) {
SharedPreferences.Editor editor = preferences.edit();
editor.putString("phone",et_phone.getText().toString());
editor.putString("password",et_password2.getText().toString());
editor.putBoolean("isremember",ck_remember.isChecked());
editor.commit();
}
}