百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Android实战项目真枪实弹第四炮

bigegpt 2024-08-21 12:01 2 浏览

【威哥说】跟大家汇报一下哈,磨砺营的小伙伴们下周开始将进入最后的项目阶段,冲刺阶段来了,大家已经提前进入了状态,每天晚上自觉学习到十二点,甚至深夜,疲惫对于我们来说已然是自轻松面对,做最好的自己,请期待我们的项目展示吧,加油。

【正文】

大家好,今天我们继续Android项目实战的第四节,本节会带大家完成几乎每个项目都会有的登录注册模块,上节我们已经给大家封装好了数据库的架构,本节我们就来使用它来保存和读取数据,一句代码搞定,非常简单。

首先登录模块,这里我们需要用到自定以edittext,原生效果实在不给力,虽然我们的Demo比较简单,但是效果还是要有的,也给大家引入自定义View的实例。

public class MyEditText extends EditText {

private Drawable mDrawable;

private Context mContext;

//画笔

private Paint mPaint;

private int color;

private boolean hasFocus = false;

public MyEditText(Context context) {

super(context);

mContext = context;

initView();

}

public MyEditText(Context context, AttributeSet attrs) {

super(context, attrs);

mContext = context;

initView();

}

private void initView() {

mDrawable = getResources().getDrawable(R.mipmap.sign_check2x);

//开始画线

mPaint = new Paint();

mPaint.setStrokeWidth(3.0f);

color = Color.parseColor("#bfbfbf");

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

mPaint.setColor(color);

int x = this.getScrollX();

int w = this.getMeasuredWidth();

canvas.drawLine(0,this.getHeight() - 1,w+x,this.getHeight() - 1,mPaint);

}

@Override

protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {

super.onFocusChanged(focused, direction, previouslyFocusedRect);

this.hasFocus = focused;

if (focused){

setColor(Color.parseColor("#00C17C"));

}else {

setColor(Color.parseColor("#bfbfbf"));

}

}

private void setColor(int i) {

this.color = i;

this.setTextColor(color);

invalidate();

}

public void setImageVisible(boolean isVisible){

if (isVisible){

setCompoundDrawablesWithIntrinsicBounds(null,null,mDrawable,null);

}else {

setCompoundDrawablesWithIntrinsicBounds(null,null,null,null);

}

}

@Override

protected void finalize() throws Throwable {

super.finalize();

}

}

然后开始布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context="com.moliying.androidlifehelper.activity.LoginActivity">

<ImageView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:src="@mipmap/ic_launcher"

android:layout_gravity="center"

/>

<TextView

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="磨砺营IT教育"

android:textSize="50sp"

android:gravity="center"

android:textColor="#00c117"

/>

<com.moliying.androidlifehelper.view.MyEditText

android:id="@+id/user_name_login_et"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:hint="输入用户名"

android:background="@null"

android:layout_marginLeft="10dp"

android:layout_marginTop="10dp"

android:layout_marginRight="10dp"

android:padding="10dp"

android:singleLine="true"

android:textCursorDrawable="@drawable/edittext_cursor"

/>

<com.moliying.androidlifehelper.view.MyEditText

android:id="@+id/pass_word_login_et"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:hint="请输入密码"

android:background="@null"

android:layout_marginLeft="10dp"

android:layout_marginTop="10dp"

android:layout_marginRight="10dp"

android:padding="10dp"

android:singleLine="true"

android:textCursorDrawable="@drawable/edittext_cursor"

android:password="true"

/>

<Button

android:id="@+id/login_btn"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="登录"

android:padding="5dp"

android:textSize="20sp"

android:background="@drawable/login_btn_selector"

android:layout_marginLeft="10dp"

android:layout_marginRight="10dp"

android:layout_marginTop="20dp"

/>

<TextView

android:id="@+id/regist_tv"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center"

android:text="注册"

android:layout_marginTop="15dp"

android:textSize="20sp"

android:clickable="true"

/>

</LinearLayout>

下面是activity代码的实现,先把代码贴出来,然后再讲解:

public class LoginActivity extends BaseActivity implements View.OnClickListener {

//^([\\S\\s]){2,16}

private MyEditText usernameEditText;

private MyEditText passwordEditText;

private Button loginButton;

private TextView registTextView;

private boolean isName;

private boolean isPassword;

private TextWatcher watcher = 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) {

//用户名限制到2到16位

if (usernameEditText.getText().toString().trim().matches("^([\\S\\s]){2,16}")) {

usernameEditText.setImageVisible(true);

isName = true;

} else {

usernameEditText.setImageVisible(false);

isName = false;

}

//密码限制到6到16位

if (passwordEditText.getText().toString().trim().matches("^([\\S\\s]){6,16}")) {

passwordEditText.setImageVisible(true);

isPassword = true;

} else {

passwordEditText.setImageVisible(false);

isPassword = false;

}

}

@Override

public void afterTextChanged(Editable s) {

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_login);

initView();

}

private void initView() {

usernameEditText = (MyEditText) findViewById(R.id.user_name_login_et);

passwordEditText = (MyEditText) findViewById(R.id.pass_word_login_et);

loginButton = (Button) findViewById(R.id.login_btn);

registTextView = (TextView) findViewById(R.id.regist_tv);

//加入点击监听

loginButton.setOnClickListener(this);

registTextView.setOnClickListener(this);

//加入观察者

usernameEditText.addTextChangedListener(watcher);

passwordEditText.addTextChangedListener(watcher);

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.login_btn:

submitLogin();

break;

case R.id.regist_tv:

startActivity(new Intent(LoginActivity.this, RegistActivity.class));

finish();

break;

}

}

/**

* 提交登录信息

*/

private void submitLogin() {

String username = usernameEditText.getText().toString().trim();

String password = passwordEditText.getText().toString().trim();

if (isName && isPassword) {

//查询数据库

UserModelBean userModelBean = LocalDataModel.getInstance().selectUser(username);

if (userModelBean == null) {

Toast.makeText(this, "您输入的姓名或密码有误,请重新输入", Toast.LENGTH_SHORT).show();

return;

}

if ((username.equals(userModelBean.getUsername())) && (password.equals(userModelBean.getPassword()))) {

new SharedXmlUtil(this).write(Const.LOGINUSERNAME, username);

startActivity(new Intent(LoginActivity.this, MainActivity.class));

finish();

} else {

Toast.makeText(this, "您输入的密码有误,请重新输入", Toast.LENGTH_SHORT).show();

}

}

}

}

这里主要给edittext设置一个TextWatcher,动态监听,使用正则来判断是否符合规范。放置两个成员的标记,保存状态。这样,在点击按钮事件里面直接判断标记,登录是否成功,然后再进行相应的操作。这里可以看到,保存数据库仅仅用一行代码,这里不明白的参看第三节的封装。

注册模块的UI和逻辑基本和登录一样,这里不再贴出代码,唯一不同就是按钮事件有点区别,注册是保存数据库,如下:

private void submitRegist() {

String username = usernameEditText.getText().toString().trim();

String password = passwordEditText.getText().toString().trim();

if (isName && isPassword){

//保存数据库

UserModelBean user = new UserModelBean();

user.setUsername(username);

user.setPassword(password);

LocalDataModel.getInstance().saveUser(user);

new SharedXmlUtil(this).write(Const.LOGINUSERNAME, username);

startActivity(new Intent(RegistActivity.this, MainActivity.class));

finish();

}

}

Ok,现在大家可以把注册和登录模块完成了,下节课咱们讲解首页的实现,本节课今天就到这里,下节再见!感谢大家的关注!不要忘了赞赏啊!!!

本文出自微信公众号mjw-java,更多内容关注微信公众号或访问www.moliying.com

相关推荐

悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)

新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...

高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源

凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...

微服务架构实战:商家管理后台与sso设计,SSO客户端设计

SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...

还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑

在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...

Seata源码—6.Seata AT模式的数据源代理二

大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...

30分钟了解K8S(30分钟了解微积分)

微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...

SpringBoot条件化配置(@Conditional)全面解析与实战指南

一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...

一招解决所有依赖冲突(克服依赖)

背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...

你读过Mybatis的源码?说说它用到了几种设计模式

学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...

golang对接阿里云私有Bucket上传图片、授权访问图片

1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...

spring中的资源的加载(spring加载原理)

最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...

Android资源使用(android资源文件)

Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...

如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)

深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...

@Autowired与@Resource原理知识点详解

springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...

java的redis连接工具篇(java redis client)

在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...