使用Kotlin实现Android简单Demo,对比JAVA实现分析具体语法不同之处(二)
来源:互联网 发布:淘宝宝宝棉绸布料 编辑:程序博客网 时间:2024/06/11 13:32
使用Kotlin实现Android简单Demo,对比JAVA实现分析具体语法不同之处(二)
写在之前,上篇简单的实现了Kotlin工程文件的创建,并记录了默认生成代码与JAVA实现的差别,本篇就整个Demo的编码列举出与JAVA语法的不同之处。
实现的Demo效果如下,头部轮播图+RecyclerView
项目地址:git@github.com:M075097/kotlin_android_demo.git
一.页面布局,依然使用XML方式布局(代码布局分离个人感觉比较好一点),代码如下
activity_main.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="vertical"> <!-- 头部标题栏titlebar--> <RelativeLayout android:id="@+id/linearlayout_topbar_kotlindemo" android:layout_width="match_parent" android:layout_height="40dp" android:background="@color/colorPrimary"> <ImageView android:id="@+id/imageview_topbar_back" android:layout_width="20dp" android:layout_height="20dp" android:layout_centerVertical="true" android:layout_marginLeft="10dp" android:src="@drawable/ic_back"/> <TextView android:id="@+id/textview_first" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="Demo展示页面"/> </RelativeLayout> <android.support.v4.view.ViewPager android:id="@+id/viewpager_kotlindemo" android:layout_width="match_parent" android:layout_height="120dp"/> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview_kotlindemo" android:layout_width="match_parent" android:layout_height="match_parent"/></LinearLayout>
二.MainActivity.kt代码如下
package com.yunzhongjun.weiyang.kotlindemoimport android.os.Bundleimport android.support.v4.view.ViewPagerimport android.support.v7.app.AppCompatActivityimport android.support.v7.widget.LinearLayoutManagerimport android.support.v7.widget.RecyclerViewimport android.view.Viewimport android.widget.ImageViewimport android.widget.TextViewimport com.yunzhongjun.weiyang.kotlindemo.data.BaseItemDataimport com.yunzhongjun.weiyang.kotlindemo.data.ItemNormalDataimport com.yunzhongjun.weiyang.kotlindemo.data.ItemTitleData//继承自父类AppCompatActivity 实现接口 View.OnClickListener 对比JAVA实现为 class MainActivity extends AppCompatActivity implements View.OnClickListener{}class MainActivity : AppCompatActivity(), View.OnClickListener {var textView: TextView? = null//变量声明---需要初始化,想要初始化为null 则必须使用A?类型var mRecyclerView: RecyclerView? = nullvar mViewPager: ViewPager? = nullvar backButton: ImageView? = null//var mDataList: List<BaseItemData>? = null;var mDataList: MutableList<BaseItemData>? = null;//Kotlin中的ArrayList声明之后,不能再增删元素,需要使用MutableList代替。泛型使用和JAVA类似var adapter: MyRecyclerViewAdapter? = nulloverride fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)//调用父类中被覆写的方法,和JAVA中一样 setContentView(R.layout.activity_main) initData() initView()}//方法声明private fun initData() { var titleData: ItemTitleData? = null var normalData: ItemNormalData? = null mDataList = mutableListOf<BaseItemData>() for (i in 1..4) {// for循环 titleData = ItemTitleData() titleData.title = "分类标题" + i mDataList!!.add(titleData)//直接使用mDataList.add()时,报错,原因是mDataList声明的类型为A?的类型,要想使用,需要 A? as A 之后使用或者在确认为非空之后直接使用A?的实例a!! Kotlin 会把A?智能转换A for (j in 1..5) { normalData = ItemNormalData(); normalData.itemDes = "类型" + i + "下:" + "条目" + j normalData.itemIconPath = null; mDataList!!.add(normalData) } }}private fun initView() { textView = findViewById(R.id.textview_first) as TextView //强转类型,对比JAVA的(AA)A 实现 Kotlin直接使用 AA as A mRecyclerView = findViewById(R.id.recyclerview_kotlindemo) as RecyclerView mViewPager = findViewById(R.id.viewpager_kotlindemo) as ViewPager backButton = findViewById(R.id.imageview_topbar_back) as ImageView backButton?.setOnClickListener(this) var str: String = "Kotlin Demo 页面" textView?.setText(str)//T此处必须有?号因为A?和A不是同一种类型 //init ViewPager var viewPagerAdapter:MyViewPagerAdapter = MyViewPagerAdapter(3);//新建对象 不需要使用new 类比JAVA 语法:MyViewPagerAdapter viewPagerAdapter = new MyViewPagerAdapter(3); mViewPager?.adapter = viewPagerAdapter //对象中原有的set/get方法只要符合标准的setter和getter命名规则 则可以直接使用A.property 赋值 其底层依然是调用setter和getter方法 //init RecyclerView var layoutManager: LinearLayoutManager = LinearLayoutManager(this) mRecyclerView?.layoutManager = layoutManager; adapter = MyRecyclerViewAdapter(mDataList) //adapter?.setDataList(mDataList) mRecyclerView?.adapter = adapter}//接口方法覆写override fun onClick(v: View?) { when (v?.id) { R.id.imageview_topbar_back -> { this.finish() } else -> { //TODO nothing } } //when 语法实现类比于JAVA中的 /* switch(v.getId()){ case R.id.imageview_topbar_back: break; default: break; }*/}}
对比以上具体代码可以看到的Kotlin与JAVA代码差别有以下区别
- 1.类继承和实现接口的语法不同,Kotlin中不需要使用extends和implements 来区分声明,统一使用”:”声明
Kotlin继承父类和实现接口如下:
class MainActivity : AppCompatActivity(), View.OnClickListener { //code what you want! }
Java实现如下:
class MainActivity extends AppCompatActivity implements View.OnClickListener{ //code what you want!}
2.继承父类时如果父类没有显式的构造类(constructor)的实现,则需要在父类名后面加上()以表明使用其默认空参的构造函数
代码如下
class MainActivity : AppCompatActivity()//此处需要有()
3.变量声明方式不同,变量用var关键字,常量使用val关键字,以Android中的TextView的声明为例
Kotlin中的TextView变量声明如下:
var textView: TextView? = null//变量声明---需要初始化,想要初始化为null 则必须使用A?类型若直接使用则可以如下(不需要加?标识)var textView1:TextView = findViewById(R.id.textview_first) as TextView
对比Java中的如下:
TextView textView;
4.方法(函数)的声明不同
Kotlin中 格式如下private fun functionName(a:A,b:B):C{}
* Kotlin中使用fun关键字声明,* 方法参数为(变量名:变量类型)* 若参数为多个则中间用“,”分开* 返回值类型声明则在方法体前和参数之后加上":"进行明* Kotlin中方法也可以使用private,public声明
对比JAVA 中的格式为 :private C functionName(A a,B b){}
5.List使用不同 以ArrayList为例,Kotlin中区分了可变的和不可变的集合,以便准确控制集合什么时候可以更改什么时候不可以更改。进而可以控制不必要的bug生成及编写出一个稳定性更高的API 参考链接https://stackoverflow.com/questions/37913252/kotlins-list-missing-add-remove-etc
Kotlin具体使用中如做如下集合的声明
var mDataList: List<>? = ArrayList<>();
则在使用中mDataList?.add()中会报如下错误
smartcast is not impossible,beacuse “mDataList” is mutable property that could have been changed by this time
####因此此处需要使用Kotlin中提供的集合类型MutableList,声明如下
var mDataList: MutableList<BaseItemData>? = null;//代码摘自MainActivity.kt
初始化如下
mDataList = mutableListOf<BaseItemData>()//代码摘自MainActivity.kt
使用如下
mDataList?.add(normalData)//代码摘自MainActivity.kt
6.for循环使用不同
Kotlin中的使用代码如下
for (j in 1..5) {//此处1..5 相当于数组[1,2,3,4,5]
//do what you want
}
对比JAVA中的一种写法如下int[] aa = new int[]{1,2,3,4,5};
for(int i:aa){
//do what you want
}7.强转类型使用不同,以TextView的强转对比如下
Kotlin中的强转如下
//findViewById()默认返回为View类型,要想被声明为TextView类型的textView接收 需要做以下强转textView = findViewById(R.id.textview_first) as TextView //强转类型,对比JAVA的(AA)A 实现 Kotlin直接使用 AA as A
对比JAVA实现如下
textView = (TextView)findViewById(R.id.textview_first);
- 8.对象实例化差别,就该Demo中自定义的MyViewPagerAdapter实例化对比
Kotlin中对象实例化如下,最大的不同是不需使用关键字“new”
var viewPagerAdapter:MyViewPagerAdapter = MyViewPagerAdapter(3)
JAVA中的对象实例化为
MyViewPagerAdapter viewPagerAdapter = new MyViewPagerAdapter(3);
- 9.原有对象中符合setter和getter命名规则方法的使用的区别–以原生ViewPager设置Adapter的方法(该方法符合setter和getter规则)对比
Kotlin工程中设置Adapter,可以直接使用类似js中的属性赋值的方式对其进行设置
mViewPager?.adapter = viewPagerAdapter
JAVA中的使用如下
mViewPager.setAdapter(viewPagerAdapter);
- 10.switch 语法差别
Kotlin中使用when实现类似JAVA中的switch语法结构,具体以MainActivity.kt中onclick(View view){}中的实现对比
when (v?.id) { R.id.imageview_topbar_back -> { this.finish() } else -> {//相当于switch中的default //TODO nothing } }
JAVA中的是实现如下
switch(v.getId()){ case R.id.imageview_topbar_back: break; default: break; }
三.ViewPager使用的MyViewPagerAdapter定义代码如下
MyViewPagerAdapter.kt
package com.yunzhongjun.weiyang.kotlindemoimport android.support.v4.view.PagerAdapterimport android.view.Viewimport android.view.ViewGroupimport android.widget.ImageView/** * Created by weiyang on 2017/7/11 0011. */class MyViewPagerAdapter(pageCount: Int) : PagerAdapter() {private var pageCount: Intinit { this.pageCount = pageCount;}override fun isViewFromObject(view: View?, `object`: Any?): Boolean { return view == `object`;}override fun getCount(): Int { return pageCount}override fun destroyItem(container: ViewGroup?, position: Int, `object`: Any?) { container?.removeView(`object` as View) //super.destroyItem(container, position, `object`)}override fun instantiateItem(container: ViewGroup?, position: Int): Any { var imageView: ImageView? = ImageView(container?.context); var resId: Int when (position) { 0 -> { resId = R.drawable.image_2 } 1 -> { resId = R.drawable.image_3 } 2 -> { resId = R.drawable.image_4 } else -> { resId = R.drawable.image_aa } } imageView?.setImageDrawable(container?.context?.resources?.getDrawable(resId)) var layoutParams: ViewGroup.LayoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) imageView?.layoutParams = layoutParams imageView?.scaleType =ImageView.ScaleType.CENTER_CROP container?.addView(imageView) return imageView!!}}
对比JAVA实现可以看到该类实现的构造方法与JAVA不同
- 构造函数实现的差别如下,Kotlin中class声明时在类名后的()内可以跟上默认的构造函数,但是该默认的构造函数的其他操作需要放到 init{}中进行,该构造函数称为主构造函数
具体详细的关于Kotlin中Class的主构造函数和次构造函数参考http://www.runoob.com/kotlin/kotlin-class-object.html
Kotlin实现如下
class MyViewPagerAdapter(pageCount: Int) : PagerAdapter() { private var pageCount: Int init { this.pageCount = pageCount; } //其他覆写的方法 //...}
JAVA实现如下
public class MyViewPagerAdapter extends PagerAdapter{ private int pageCount; public MyViewPagerAdapter(int pageCount){ //super();//隐藏的调用父类的默认构造函数 this.pageCount = pageCount; }}
四.其他该Demo中能够直接参考的Kotlin和JAVA语法不同的地方
- 1.静态方法的实现(具体参考该Demo中的BaseItemData.kt)
- JAVA中使用static关键字声明
- Kotlin中则需要使用 companion object {} 包括相关方法
- 2.枚举类的实现
具体代码如下:BaseItemData.kt
package com.yunzhongjun.weiyang.kotlindemo.data/** * Created by weiyang on 2017/7/11 0011. */abstract class BaseItemData {abstract fun getItemType(): ItemType enum class ItemType(typeValue: Int) { TypeNormal(0), TypeTitle(1), Unsupport(2); var typeValue: Int init { this.typeValue = typeValue; } companion object { //类比JAVA中的静态方法 fun getTypeValue(typeValue: Int): ItemType { for (value in values()) { if (value.typeValue == typeValue) { return value; } } return Unsupport; } }}}
- 3 当一个实例使用类似A?声明后(A为具体的类名),若要调用部分属性时可能会报错,显示类型为nullable,则此时可以在确认其不为null时使用断言A!!把A?转换为A
对应示意代码如下
var a:A? = nulla!!.property//相关属性调用
- 使用Kotlin实现Android简单Demo,对比JAVA实现分析具体语法不同之处(二)
- 使用Kotlin实现Android简单Demo,对比JAVA实现分析具体语法不同之处(一)
- LitePal的简单使用(kotlin实现)
- 【FirstKotlinApp】使用Kotlin实现简单的Banner广告条(二):Indicator指示器实现
- Java中TreeMap具体实现Demo
- android抽屉实现不同之处
- Kotlin学习笔记(二):Kotlin与Java对比
- Kotlin笔记(二) : Kotlin与Java对比
- Kotlin for Android(二)Kotlin基础语法
- Kotlin语法(二)
- RMI的简单解读和具体实现Demo
- 分布式数据库的具体实现与对比分析
- 分布式数据库的具体实现与对比分析
- 分布式数据库的具体实现与对比分析
- 分布式数据库的具体实现与对比分析
- 分布式数据库的具体实现与对比分析
- Android GoogleMap suggestion AutoComplete (二)具体实现
- Replugin Demo的简单使用与分析(二)
- Tensorflow中的变量初始化函数
- GPS的决斗Dueling GPS's
- 多线程的两种方式
- Android 双缓冲画图板,有实现Menu菜单部分
- Informatica批量修改session数据库连接
- 使用Kotlin实现Android简单Demo,对比JAVA实现分析具体语法不同之处(二)
- javaScript---定时函数
- Spring中Bean的配置
- Metal学习
- @AttributeOverrides和 @AttributeOverride
- Java基础篇分支判断与循环
- 国际化语言工具类ResourceBundleUtils .java
- 仿美团外卖源码加自己做了个模拟数据加载的效果
- 【软件安全】cwe-89 SQL Injection(三)