龙空技术网

使用Kotlin实战一个BaseActivity并制作一个登录页

基础编程 37

前言:

现在大家对“java编写登录界面代码”可能比较着重,朋友们都需要分析一些“java编写登录界面代码”的相关文章。那么小编也在网络上汇集了一些关于“java编写登录界面代码””的相关文章,希望姐妹们能喜欢,朋友们一起来了解一下吧!

一、内容提要

在正常的Android项目开发过程中,会用到许多公共的部分。例如:自己封装或总结的基础类库以及Base*相关的内容,如BaseActivity、BaseApplication等。子类通过继承Base类可以继承父类的一些公用的特性以及行为。例如:接下来我们要介绍的BaseActivity就统一封装了导航栏(ActionBar)以及统一的布局容器,子类Activity通过继承BaseActiivty直接集成ActionBar无需自己写公共布局,只需要集中精力写子Activity的个性化布局即可。下面通过实战来说说具体应该怎样干。

ps:今天还会说到封装框架比较常用的一个设计模式:模板方法模式

二、实战部分

制作的登录页的效果图

相关类及布局文件介绍:

1.BaseActivity.kt 所有Activity的父类,其继承自FragmentActivity

2.base_layout.xml 其是BaseActivity的布局文件

3.LoginActivity.kt 登录页面Activity,其继承BaseActivity

4.login_layout.xml 登录页面的布局文件

BaseActivity.kt

/** * 所有Activity的基类 * 此处定义一个抽象类 * create by yangwei * on 2020/7/21 16:11 */abstract class BaseActivity : FragmentActivity() {    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.base_layout)        //将子布局添加到容器        //此处的getLayoutId()的初始化会延迟的子类,即LoginActivity中      	//此处用到的实际模式是模板方法模式(下文会讲到这个模式)        fl_content.addView(LayoutInflater.from(this).inflate(getLayoutId(), null))      	//initViews()方法也是在BaseActivity中延时加载,其在子类中取代了onCreate的位置      	//子类中的初始化都需要在这个方法中进行。        initViews()    }		    /**     * 获取左边ImageView     */    fun getLeftIcon(): ImageView {      //有些大致了解过android开发的小伙伴可能观察到了,在BaseActiivty中我们并没有对控件      //进行初始化,但是我们用的时候却可以使用?这要得益于google提供的插件,ktx,只要我们的      //build.gradle中引入了就无需进行findViewById就可以得到控件实例。其基本上完全取代了      //ButterKnife的地位,对缩减Android的代码量非常有帮助        return action_left_icon    }    /**     * 设置左边图标资源     */    fun setLeftIcon(icon: Int) {        action_left_icon.setImageResource(icon)    }    /**     * 获取左边TextView     */    fun getLeftText(): TextView {        return action_left_text    }    /**     * 设置左边文本     */    fun setLeftText(value: String) {      	//我们如何给一个value设置默认值呢?如果再java中我们可以想到的方案是三元运算符,但是在kotlin      	//中我们只需要使用?:后面加内容即可,语法上确实简介了些。主要是kotlin的语法糖比java要      //多一些        action_left_text.text = value ?: ""    }    /**     * 获取标题TextView     */    fun getCenterText(): TextView {        return action_center_text    }    /**     * 设置标题     */    fun setCenterText(value: String) {      //给TextView设置text的时候,java是通过setText来设置的,而kotlin为了兼容java也可以      //使用setText,但是ide会推荐你直接使用text属性,就像下面的代码一样。        action_center_text.text = value    }    /**     * 获取右边ImageView     */    fun getRightIcon(): ImageView {        return action_right_icon    }    /**     * 设置右边图标资源     */    fun setRightIcon(icon: Int) {        action_right_icon.setImageResource(icon)    }    /**     * 获取右边TextView     */    fun getRightText(): TextView {        return action_right_text    }    /**     * 设置右边文案     */    fun setRightText(value: String) {        action_right_text.text = value    }    /**     * 控制左边按钮的显示隐藏     */    fun visibleLeftLayout(bool: Boolean) {        if (bool) action_left_linear.visibility = View.VISIBLE else action_left_linear.visibility =            View.INVISIBLE    }    /**     * 控制右边的按钮的显示隐藏     */    fun visibleRightLayout(bool: Boolean) {      	//这里注意一下kotlin中的if else和java中的不一样,kotlin中的if else是表达式形式的      //它的作用不仅仅条件语句,还可以是表达式,这个后面项目中遇到了详细介绍下        if (bool) action_right_linear.visibility =            View.VISIBLE else action_right_linear.visibility =            View.INVISIBLE    }    /**     * 初始化View,延时到子类中进行初始化,使用的模板方法模式     */    abstract fun initViews()    /**     * 获取布局的Id     */    abstract fun getLayoutId(): Int}  

2.base_layout.xml

 <!--布局比较简单,不做额外介绍了--><?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=";    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <!--actionbar-->    <include layout="@layout/actionbar_layout" />    <!--  承载子布局的容器  -->    <!--此容器承载的是子类的布局,父类布局把样式定义好,子类只用管自己的布局就行了-->    <FrameLayout        android:id="@+id/fl_content"        android:layout_width="match_parent"        android:layout_height="match_parent" /></LinearLayout>
<?xml version="1.0" encoding="utf-8"?><!--   公共导航栏部分--><RelativeLayout xmlns:android=";    android:layout_width="match_parent"    android:layout_height="50dp">    <!--        左边图标和文案-->    <LinearLayout        android:id="@+id/action_left_linear"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerVertical="true"        android:layout_marginStart="20dp"        android:gravity="center_vertical"        android:orientation="horizontal">        <ImageView            android:id="@+id/action_left_icon"            android:layout_width="wrap_content"            android:layout_height="wrap_content" />        <TextView            android:id="@+id/action_left_text"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:textColor="@color/color_333333"            android:layout_marginStart="5dp"            android:textSize="16sp" />    </LinearLayout>    <!--        中间标题部分-->    <TextView        android:id="@+id/action_center_text"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerInParent="true"        android:textColor="@color/color_333333"        android:textSize="18sp" />    <!--        右边图标和文案-->    <LinearLayout        android:id="@+id/action_right_linear"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentRight="true"        android:layout_centerVertical="true"        android:layout_marginEnd="20dp"        android:gravity="center_vertical"        android:orientation="horizontal">        <ImageView            android:id="@+id/action_right_icon"            android:layout_width="wrap_content"            android:layout_height="wrap_content" />        <TextView            android:id="@+id/action_right_text"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginStart="5dp"            android:textColor="@color/color_333333"            android:textSize="16sp" />    </LinearLayout></RelativeLayout>

3.LoginActivity.kt

/** * 登录页面,集成BaseActivity * create by yangwei * on 2020/7/21 16:37 */class LoginActivity : BaseActivity() {    //初始化子布局    override fun getLayoutId(): Int {        return R.layout.login_layout    }    //初始化View    override fun initViews() {        setCenterText("登录")        login_btn_submit.setOnClickListener {            if (checkInput()) {                val intent: Intent = Intent()                intent.setClass(LoginActivity@ this, MainActivity::class.java)                startActivity(intent)            }        }    }		//这里重点说一下kotlin的函数,在kotlin中函数的定义为:func 函数名():返回值  	//kotlin中定义函数的关键字是fun,其返回值类型的定义位置和java正好相反,它是在方法最后  	//定义的。而且在kotlin中函数是头等公民,而且支持高阶函数。而java是在1.8以后开始支持函数式  	//接口,高阶函数也是通过函数接口来完成的。这些东西在后面实战的时候再一一讲解吧    private fun checkInput(): Boolean {      	//此处利用string字符串的isNullOrEmpty来判断非空,可以说是类库封装的语法糖      	//除此之外还有isNull,isEmpty等方法,大家可以私下去尝试下,这里就不一一演示了        if (login_et_username.text.isNullOrEmpty()) {            Toast.makeText(this, "用户名不能为空", Toast.LENGTH_LONG).show()            return false        }        if (login_et_password.text.isNullOrEmpty()) {            Toast.makeText(this, "密码不能为空", Toast.LENGTH_LONG).show()            return false        }        return true    }}

androidmanifest.xml变更截图

4.login_layout.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android=";    android:layout_width="match_parent"    android:layout_height="match_parent">    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_marginTop="20dp"        android:orientation="vertical">        <!--用户名-->        <EditText            android:id="@+id/login_et_username"            android:layout_width="match_parent"            android:layout_height="40dp"            android:layout_marginStart="50dp"            android:layout_marginEnd="50dp"            android:background="@color/light_white"            android:hint="请输入用户名"            android:inputType="text"            android:maxLength="16"            android:paddingStart="3dp" />        <!--密码-->        <EditText            android:id="@+id/login_et_password"            android:layout_width="match_parent"            android:layout_height="40dp"            android:layout_marginStart="50dp"            android:layout_marginTop="20dp"            android:layout_marginEnd="50dp"            android:background="@color/light_white"            android:hint="请输入密码"            android:inputType="textPassword"            android:maxLength="16"            android:paddingStart="3dp" />        <!--登录按钮-->        <Button            android:id="@+id/login_btn_submit"            android:layout_width="match_parent"            android:layout_height="47dp"            android:layout_marginStart="50dp"            android:layout_marginTop="30dp"            android:layout_marginEnd="50dp"            android:background="@color/theme"            android:text="登录"            android:textColor="@color/white"            android:textSize="18sp" />    </LinearLayout></RelativeLayout>

项目目录结构

三、注意事项

以上就是通过定义一个BaseActivity并让LoginActivity集成的全部过程。这个BaseActivity主要就是解决一个问题,给子类布局提供一个规范。而这个规范是通过模板方法模式来实现的。

模板方法模式:定义一个算法中的操作框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤

此处的BaseActivity就是定义算法框架的,而延迟到子类中实现的步骤是initViews()和getLayoutId()两个方法。

四、结束语

以上就是今天的全部内容了,代码光看是不行的,各位同学可以参照例子手动写一写,可以加深一些印象。

下一节会通过kotlin实现一个底部导航栏:主页、车、我的。

标签: #java编写登录界面代码