kotlinx.android.synthetic.** 用法与总结

2020-11-16 22:56:25

参考地址  kotlinx.android.synthetic.** 坑点


看着听高大上的样子,哎,谁有精力记住这么多库,哎。 

记下来再说吧

Kotlin通过添加

   apply plugin: 'kotlin-android-extensions'12

可以直接使用layout id 名称获取当前view对象,详细使用如下:

//layout<?xml version="1.0" encoding="utf-8"?><FrameLayout    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:background="@color/colorPrimary"
    android:id="@+id/root_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >


    <TextView        android:text="Hello World"
        android:id="@+id/hello_world"
        android:text="@string/time_span"
        style="@style/basicTextStyle" /></FrameLayout>//kotlin 代码

package cn.enjoytoday.test

//这是重点,需要手动添加或者android studio提示添加
import kotlinx.android.synthetic.main.activity_drag_test.*

class DragTestActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
         setContentView(R.layout.activity_drag_test)
         hello_world.text = "完美的写法"

    }


  }12345678910111213141516171819202122232425262728293031323334353637383940

就目前为止都是完美的用法,代码简洁的不要不要的。就网上目前情况看,一般的找不到view无法直接通过id代替对象操作使用大多是由于未能成功导入kotlin-android-extensions插件或者直接没有添加,添加方式如下:

apply plugin: 'com.android.application'//如下两个插件缺一个不可,kotlin-android为基本支持android 开发插件,kotlin-android-extensions就是省去我们频繁找id的插件了
apply plugin: 'kotlin-android'        apply plugin: 'kotlin-android-extensions'buildscript {
    ext.kotlin_version = '1.1.4-3'
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

    }
}


dependencies {

      compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"}12345678910111213141516171819202122232425

但,这不是终点。真正的槽点在于,即使你以上配置完全正确还是有可能出现找不到的错误,这个错误的产生源于三方的aar导入,存在你使用的layout是导入的三方的aar中的。这里需要注意的是kotlin-android-extensions插件给我们自动寻址的id都是基于我们当前apk资源下的,即是:Resource指向的包。也就是java中比较常见的如下:

 import cn.enjoytoday.test.R.*; //当前应用资源,kotlin-android-extensions寻址对象
 import cn.enjoytoday.external.R.*; //引入的三方包的资源123

这个时候,我们只能乖乖自己找id了,如下:

package cn.enjoytoday.testimport kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.activity_list_item.*  //android资源

class DragTestActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        hello_world.text = "完美的写法"

        val view= View.inflate(this,android.R.layout.activity_list_item,null)
        layout.addView(view)

        view.text1.text ="text"

    }
}

//会报错如下:DragTestActivity.kt: (7, 39): Unresolved reference: activity_list_itemDragTestActivity.kt: (19, 14): Unresolved reference: text1

//修改后
import kotlinx.android.synthetic.main.activity_main.*

class DragTestActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        hello_world.text = "完美的写法"

        val view= View.inflate(this,android.R.layout.activity_list_item,null)
        layout.addView(view)

        val text1=view.findViewById(android.R.id.text1) as TextView
         text1.text ="Test"

    }
}123456789101112131415161718192021222324252627282930313233343536373839404142434445

图就不贴了,一般来说这种方法会比较少,但不是不可能,尤其三方依赖越来越多。希望以后kotlin-android-extensions可以更加智能吧.

Enjoytoday,EnjoyCoding


  • 2019-12-14 21:04:05

    聊聊keep-alive组件的使用及其实现原理

    keep-alive是Vue.js的一个内置组件。它能够不活动的组件实例保存在内存中,而不是直接将其销毁,它是一个抽象组件,不会被渲染到真实DOM中,也不会出现在父组件链中。 它提供了include与exclude两个属性,允许组件有条件地进行缓存。

  • 2019-12-14 21:06:58

    vue----keep-alive缓存,activated,deactivated两个生命周期函数,,meta实现缓存

    如果没有缓存,每点击一次导航,内容区就会创建一个组件,该组件会经历整个生命周期,每点击一次,就会创建一个组件,比较浪费性能, 这时,我们就要考虑到是否能将点击过的已创建的组件进行缓存,当再次点击已访问过的组件时,这时,就会从缓存中获取该组件,而不会重新创建,

  • 2019-12-17 11:56:05

    ffmpeg concat video and mix audio,ffmpeg简单快速的合并视频

    在ffmpeg中,官网给出两种连接媒体文件(音频、视频、etc..)的解决方案。 the concat "demuxer" the concat "protocol" 对比而言, demuxer更加灵活一些,需要媒体文件是属于相同的编解码器,但是可以属于不同的容器格式(mp3,wav, mp4, mov, etc..). 而protocol只适用于少数集中容器格式。

  • 2019-12-17 11:58:55

    FFmpeg文章目录

    seek ffmpeg # How to seek in mp4/mkv/ts/flv ffmpeg # flags &= ~AVSEEK_FLAG_BACKWARD ffmpeg # AVSEEK_FLAG concat ffmpeg # concat 连接两个视频 ffmpeg # -f concat -i mylist.txt ffmpeg # concat详解+音画同步策略 截图

  • 2019-12-18 23:26:00

    FFMPEG命令记录

    ffmpeg,拼接两个音频,剪切音频片段,多个音频混音,剪切一段MP4并转换成gif,改变音量大小,音频淡入淡出,音频格式处理

  • 2019-12-19 00:04:44

    ffmpeg concat video and mix audio

    在ffmpeg中,官网给出两种连接媒体文件(音频、视频、etc..)的解决方案。 the concat "demuxer" the concat "protocol" 对比而言, demuxer更加灵活一些,需要媒体文件是属于相同的编解码器,但是可以属于不同的容器格式(mp3,wav, mp4, mov, etc..). 而protocol只适用于少数集中容器格式。