## 一.首先配置Kotlin环境 ##
1.在Android Studio 中 选择File-->Settings--->Pluguns 在进行收索Kotlin 进行安装,在重启Android Studio 即可
2.新建一个项目,在你新建的项目下的build.gradle 配置Kotlin的版本号
buildscript {
ext.kotlin_version = '1.0.0'
ext.kotlin_version = '1.1.2-4'
ext.support_version = '23.1.1'
ext.anko_version = '0.8.2'
repositories {
jcenter()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
3.在你新建的项目的module下的build.gradle去配置一些属性
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
在dependencies 配置
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
4. 这些都完成了之后 ,在Android Studio 选择Code-->Convert Java File to Kolin File 系统会自动把你的java代码转换成Kolitn代码
5. 测试 在你.xml 编写一个TextView
<TextView
android:id="@+id/tv_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
然后在你的Kolitn 代码中 可以直接得到你刚才编写TextView控件
根据id可以进行操作
tv_test.text="Hello Kolitn"
这时候会提示tv_test找不到 ,在你的代码中导入Kolitn包即可
import kotlinx.android.synthetic.main.activity_main.*
运行你的程序,界面上显示 Hello Kolitn证明你的Kolitn编译环境搭建完成
## 二.获取本地视频 ##
1.首先建一个been对象
class VideoBeen(name: String, duration: Long, size: Long, data: String, imageUrl: String, desc: String) : Serializable {
val name: String
val duration: Long
val size: Long
val data: String
val imageUrl: String
val desc: String
init {
this.name = name
this.duration = duration
this.size = size
this.data = data
this.imageUrl = imageUrl
this.desc = desc
}
}
说明:
(1)参数就不多说了,这个Kotlin建been对象和java建been对象是不同的,java需要写大量的get()和set()方法,而Kotlin却不用
(2) java实现接口用implement 继承用extends 而Kotlin继承和实现接口都用":"就行了,如果想实现多个接口,用","分开即可
eg:class MainActivity : 接口1, 接口2...
(3)声明字段类型 val name:String name是字段的名称 String是字段的类型
//用val或var声明变量,指明它们是不可变的或可变的
2.创建一个list
` var list = ArrayList<VideoBeen>()`
java 中创建list都是new 而Kolitn不需要new
3.得到本地视频并把对象赋值给list
fun initData() {
val contentResolver = this.getContentResolver()
val uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
val objects = arrayOf(MediaStore.Video.Media.DISPLAY_NAME, //在Sdcard显示的名称
MediaStore.Video.Media.DURATION, //视频的长度
MediaStore.Video.Media.SIZE, //视频文件大小
MediaStore.Video.Media.DATA//视频的绝对地址
)
val cursor = contentResolver.query(uri, objects, null, null, null)
if (cursor != null) {
while (cursor.moveToNext()) {
val name = cursor.getString(0)
val duration = cursor.getLong(1)
val size = cursor.getLong(2)
val data = cursor.getString(3)
val mediaItem = VideoBeen(name, duration, size, data, "", "");
//把视频添加到列表中
list.add(mediaItem)
}
cursor.close()
}
//Log.e("list", "list====" + list.size);
}
## 三.Kotiln怎么写adapter ##
1.在你module下的build.gradle添加recycleview包
compile 'com.android.support:recyclerview-v7:24.0.0'
2.在布局中
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/lv_video"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cacheColorHint="@android:color/transparent" />
<TextView
android:visibility="gone"
android:id="@+id/tv_nomedia"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="没有找到视频..."
android:textColor="@android:color/black"
android:textSize="18sp" />
<ProgressBar
android:id="@+id/pb_loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
/>
</RelativeLayout>
3.写adapter 先看代码
class VideoAdapter(val context: Context, val list: List<VideoBeen>, val inter: positioninterface.posi) : RecyclerView.Adapter<VideoAdapter.ViewHolder>() {
override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
val mediaItem = list.get(position)
holder!!.tv_name.text = mediaItem.name
val itemview = holder.rl
itemview.setOnClickListener {
inter.getposition(position);
}
val size = mediaItem.size;
holder!!.tv_size.text = Formatter.formatFileSize(context, size)
holder!!.tv_duration.text = mediaItem.desc
}
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
val view = View.inflate(context, R.layout.item_video_pager, null);
val viewHolder = ViewHolder(view)
return viewHolder;
}
override fun getItemCount(): Int {
return list.size;
}
class ViewHolder(itemView: View?) : RecyclerView.ViewHolder(itemView) {
var iv_icon: ImageView = itemView!!.findViewById(R.id.iv_icon) as ImageView;
var tv_name: TextView = itemView!!.findViewById(R.id.tv_name) as TextView;
var tv_duration: TextView = itemView!!.findViewById(R.id.tv_duration) as TextView;
var tv_size: TextView = itemView!!.findViewById(R.id.tv_size) as TextView;
var rl: RelativeLayout = itemView!!.findViewById(R.id.rl) as RelativeLayout;
}
}
说明:
(1)VideoAdapter()中的参数,val context: Context 上下文
val list: List<VideoBeen> 视频的集合 inter: positioninterface.posi 接口的实现
(2)继承RecyclerView.Adapter 刚才说过了Kolitn继承用“:”
(3)然后Alt+Enter,实现方法
(4)坑爹的ViewHolder 在adapter中还带自己写findviewbyid,
不用findviewbyid得到对象的话,一直抱空指针(但是会有人提出疑问,Kotlin不是可以根据id,来得到对象吗? 我这样测试了,压根不让你导包)如果有大神知道怎么优化这点,欢迎骚扰
(5) 怎么写布局,和实现接口的监听在这里就不说了(随后会把代码上传),说说怎么给对象赋值吧, java 代码holder..settext="" 而kotlin中
tv_size
就没有settext这个方法,而是 holder!!.tv_name.text="" 即可
话说这两个!!是什么东西
你把这个两个!!去掉的话,系统会提示你
Only sfe(?.) or non-null asserted(!!.) calls are allowed on a nullable receiver of type View?
简单的说这个对象可能为空或者是不安全的,在这里不允许在这个使用加上(?)或者(!!)才能使用
## 四给recycleview设置adapter ##
1.和java代码没什么区别 (就是声明对象不new)
private fun setadapter() {
val videoAdapter = VideoAdapter(this, list, this)
val mLayoutManager = LinearLayoutManager(this)
lv_video.setLayoutManager(mLayoutManager)
lv_video.adapter = videoAdapter;
}
## 五美化界面 ##
1.在系统需找本地视频的时候加一个提示
2.找不到视频,给用户一个提示
private fun setvisible(){
pb_loading.visibility=View.GONE
if(list.size<=0){
tv_nomedia.visibility=View.VISIBLE
}
}
3.实现接口的监听
public class positioninterface {
public interface posi {
public fun getposition(property: Int)
}
}
来判断用户点击的是哪个item
1.在Android Studio 中 选择File-->Settings--->Pluguns 在进行收索Kotlin 进行安装,在重启Android Studio 即可
2.新建一个项目,在你新建的项目下的build.gradle 配置Kotlin的版本号
buildscript {
ext.kotlin_version = '1.0.0'
ext.kotlin_version = '1.1.2-4'
ext.support_version = '23.1.1'
ext.anko_version = '0.8.2'
repositories {
jcenter()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
3.在你新建的项目的module下的build.gradle去配置一些属性
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
在dependencies 配置
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
4. 这些都完成了之后 ,在Android Studio 选择Code-->Convert Java File to Kolin File 系统会自动把你的java代码转换成Kolitn代码
5. 测试 在你.xml 编写一个TextView
<TextView
android:id="@+id/tv_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
然后在你的Kolitn 代码中 可以直接得到你刚才编写TextView控件
根据id可以进行操作
tv_test.text="Hello Kolitn"
这时候会提示tv_test找不到 ,在你的代码中导入Kolitn包即可
import kotlinx.android.synthetic.main.activity_main.*
运行你的程序,界面上显示 Hello Kolitn证明你的Kolitn编译环境搭建完成
## 二.获取本地视频 ##
1.首先建一个been对象
class VideoBeen(name: String, duration: Long, size: Long, data: String, imageUrl: String, desc: String) : Serializable {
val name: String
val duration: Long
val size: Long
val data: String
val imageUrl: String
val desc: String
init {
this.name = name
this.duration = duration
this.size = size
this.data = data
this.imageUrl = imageUrl
this.desc = desc
}
}
说明:
(1)参数就不多说了,这个Kotlin建been对象和java建been对象是不同的,java需要写大量的get()和set()方法,而Kotlin却不用
(2) java实现接口用implement 继承用extends 而Kotlin继承和实现接口都用":"就行了,如果想实现多个接口,用","分开即可
eg:class MainActivity : 接口1, 接口2...
(3)声明字段类型 val name:String name是字段的名称 String是字段的类型
//用val或var声明变量,指明它们是不可变的或可变的
2.创建一个list
` var list = ArrayList<VideoBeen>()`
java 中创建list都是new 而Kolitn不需要new
3.得到本地视频并把对象赋值给list
fun initData() {
val contentResolver = this.getContentResolver()
val uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
val objects = arrayOf(MediaStore.Video.Media.DISPLAY_NAME, //在Sdcard显示的名称
MediaStore.Video.Media.DURATION, //视频的长度
MediaStore.Video.Media.SIZE, //视频文件大小
MediaStore.Video.Media.DATA//视频的绝对地址
)
val cursor = contentResolver.query(uri, objects, null, null, null)
if (cursor != null) {
while (cursor.moveToNext()) {
val name = cursor.getString(0)
val duration = cursor.getLong(1)
val size = cursor.getLong(2)
val data = cursor.getString(3)
val mediaItem = VideoBeen(name, duration, size, data, "", "");
//把视频添加到列表中
list.add(mediaItem)
}
cursor.close()
}
//Log.e("list", "list====" + list.size);
}
## 三.Kotiln怎么写adapter ##
1.在你module下的build.gradle添加recycleview包
compile 'com.android.support:recyclerview-v7:24.0.0'
2.在布局中
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/lv_video"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cacheColorHint="@android:color/transparent" />
<TextView
android:visibility="gone"
android:id="@+id/tv_nomedia"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="没有找到视频..."
android:textColor="@android:color/black"
android:textSize="18sp" />
<ProgressBar
android:id="@+id/pb_loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
/>
</RelativeLayout>
3.写adapter 先看代码
class VideoAdapter(val context: Context, val list: List<VideoBeen>, val inter: positioninterface.posi) : RecyclerView.Adapter<VideoAdapter.ViewHolder>() {
override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
val mediaItem = list.get(position)
holder!!.tv_name.text = mediaItem.name
val itemview = holder.rl
itemview.setOnClickListener {
inter.getposition(position);
}
val size = mediaItem.size;
holder!!.tv_size.text = Formatter.formatFileSize(context, size)
holder!!.tv_duration.text = mediaItem.desc
}
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
val view = View.inflate(context, R.layout.item_video_pager, null);
val viewHolder = ViewHolder(view)
return viewHolder;
}
override fun getItemCount(): Int {
return list.size;
}
class ViewHolder(itemView: View?) : RecyclerView.ViewHolder(itemView) {
var iv_icon: ImageView = itemView!!.findViewById(R.id.iv_icon) as ImageView;
var tv_name: TextView = itemView!!.findViewById(R.id.tv_name) as TextView;
var tv_duration: TextView = itemView!!.findViewById(R.id.tv_duration) as TextView;
var tv_size: TextView = itemView!!.findViewById(R.id.tv_size) as TextView;
var rl: RelativeLayout = itemView!!.findViewById(R.id.rl) as RelativeLayout;
}
}
说明:
(1)VideoAdapter()中的参数,val context: Context 上下文
val list: List<VideoBeen> 视频的集合 inter: positioninterface.posi 接口的实现
(2)继承RecyclerView.Adapter 刚才说过了Kolitn继承用“:”
(3)然后Alt+Enter,实现方法
(4)坑爹的ViewHolder 在adapter中还带自己写findviewbyid,
不用findviewbyid得到对象的话,一直抱空指针(但是会有人提出疑问,Kotlin不是可以根据id,来得到对象吗? 我这样测试了,压根不让你导包)如果有大神知道怎么优化这点,欢迎骚扰
(5) 怎么写布局,和实现接口的监听在这里就不说了(随后会把代码上传),说说怎么给对象赋值吧, java 代码holder..settext="" 而kotlin中
tv_size
就没有settext这个方法,而是 holder!!.tv_name.text="" 即可
话说这两个!!是什么东西
你把这个两个!!去掉的话,系统会提示你
Only sfe(?.) or non-null asserted(!!.) calls are allowed on a nullable receiver of type View?
简单的说这个对象可能为空或者是不安全的,在这里不允许在这个使用加上(?)或者(!!)才能使用
## 四给recycleview设置adapter ##
1.和java代码没什么区别 (就是声明对象不new)
private fun setadapter() {
val videoAdapter = VideoAdapter(this, list, this)
val mLayoutManager = LinearLayoutManager(this)
lv_video.setLayoutManager(mLayoutManager)
lv_video.adapter = videoAdapter;
}
## 五美化界面 ##
1.在系统需找本地视频的时候加一个提示
2.找不到视频,给用户一个提示
private fun setvisible(){
pb_loading.visibility=View.GONE
if(list.size<=0){
tv_nomedia.visibility=View.VISIBLE
}
}
3.实现接口的监听
public class positioninterface {
public interface posi {
public fun getposition(property: Int)
}
}
来判断用户点击的是哪个item
到这里就可以把本地视频给展示出来了
使用 Kotlin 读取本地视频并使用Vitamio框架编写万能播放器进行播放(二)地址
http://blog.youkuaiyun.com/o_xiaojian/article/details/72957254
链接:http://pan.baidu.com/s/1kVuoUpx 密码:9rmo