• kotlinx.android.synthetic.** 坑点


    Kotlin通过添加

       apply plugin: 'kotlin-android-extensions'
    

    可以直接使用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 = "完美的写法"
    
        }
    
    
      }
    
    

    就目前为止都是完美的用法,代码简洁的不要不要的。就网上目前情况看,一般的找不到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"
    }
    

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

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

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

    package cn.enjoytoday.test
    
    import 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_item
    DragTestActivity.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"
    
        }
    }
    
    
    

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

    Enjoytoday,EnjoyCoding

  • 相关阅读:
    Log4J输出日志到WEB工程目录的实现方法
    MyEclipse 10 中增加svn插件
    Web 项目添加log4j
    ruby on rails 之旅 第一章 ubuntu11.10安装
    ruby on rails 之旅 第一章 ubuntu12.04安装
    centos 6.3 server 安装mysql5
    技术实践第四期|解读移动开发者日常性能监控平台应用
    电脑一族预防颈椎劳损八法
    方便的使用单击和双击更新DataGrid中的数据的例子(转载)
    不重复随机数列生成算法
  • 原文地址:https://www.cnblogs.com/amiko/p/7906207.html
Copyright © 2020-2023  润新知