kotlin Context使用详解

在activity级下使用this表示context

kotlin中取消了xxxActivity.this的用法,所以我们可以在activity下新建一个Context属性——instance指向它本身。然后在其他地方使用。如果使用的地方是在activity这一级则可以直接使用this指向它本身

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_share_temp)
    share_imgbtn.setOnClickListener(this)
    share_qq.setOnClickListener(this)
    share_wechat.setOnClickListener(this)
    share_sms.setOnClickListener(this)
  }

在内部类里面是用外部类的实例对象表示context

如果是在内部类里面使用,则可以为activity写一个实例,然后在内部类里面使用

class ShareTempActivity : AppCompatActivity(), View.OnClickListener {
  val instance by lazy { this } //这里使用了委托,表示只有使用到instance才会执行该段代码
  val TAG:String = "ShareTempActivity"
  override fun onClick(v: View?) {
    //TODO("to do something") To change body of created functions use File | Settings | File Templates.
  }
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_share_temp)
    share_imgbtn.setOnClickListener(instance)
    share_qq.setOnClickListener(instance)
    share_wechat.setOnClickListener(instance)
    share_sms.setOnClickListener(instance)
  }

  inner class MainShareBoardListener : ShareBoardlistener{
    override fun onclick(p0: SnsPlatform?, p1: SHARE_MEDIA?) {
      //TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
      Log.i(TAG,p1.toString())
      Toast.makeText(instance,"",Toast.LENGTH_SHORT).show()//传递实例
    }
  }
}

使用kotlin的标签语法从内部类使用外部类的实例表示context

还可以使用kotlin的标签,高级语法使用,在内部类里面或者当前activity的上下文

class ShareTempActivity : AppCompatActivity(), View.OnClickListener {
  val instance by lazy { this }
  val TAG:String = "ShareTempActivity"
  override fun onClick(v: View?) {
    //TODO("to do something") To change body of created functions use File | Settings | File Templates.
  }
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_share_temp)
    share_imgbtn.setOnClickListener(instance)
    share_qq.setOnClickListener(instance)
    share_wechat.setOnClickListener(instance)
    share_sms.setOnClickListener(instance)
  }

  inner class MainShareBoardListener : ShareBoardlistener{
    override fun onclick(p0: SnsPlatform?, p1: SHARE_MEDIA?) {
      //TODO("not implemented")
      Log.i(TAG,p1.toString())
      Toast.makeText(this@ShareTempActivity,"",Toast.LENGTH_SHORT).show()//kotlin语法
    }
  }
}

补充知识:当你发现kotlin中viewmodel里无法获得context时

你可以继承 AndroidViewModel的方式来获得

kotlin Context使用详解

kotlin Context使用详解

以上这篇kotlin Context使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

时间: 2020-03-25

关于Kotlin写界面时诸多控件的点击事件

界面中控件较多的话,每个控件都设置setOnClickListener(this)是很麻烦的,为此抽出了一个Context的扩展类: fun Context.setViewClick(listener: View.OnClickListener, vararg views: View) { for (it in views) { it.setOnClickListener(listener) } } 即只需要将Activity或Fragment实现View.OnClickListener接口,然

使用kotlin实现MVP的方式(简单好用)

kotlin怎么好用就不多说了,总之我用了感觉非常舒服,今天说一下用kotlin搭建一个MVP框架. 先定义抽象类IPresenter,IPresenter持有软引用定义的mView,防止内存泄漏,mView类型必须是实现了IView接口的实例,然后定义生命周期方法,open并且不是抽象方法,让子类有选择的去实现生命周期. package com.khaless.demo.mvp import android.content.Intent import android.os.Bundle imp

Kotlin 使用高阶函数实现回调方式

lambda 和 高阶函数 之前学习了 lambda 和高阶函数,然后在 android 开发中对 onClick 事件进行监听是一个很常用的功能,kotlin 的常规实现如下: rootView.setOnClickListener { view -> println("点击了这个ID=${view.id}的view") } 然后在开发中不可避免的我们也要写一些自定义监听之类的代码.这个时候如果还用 java 的思想去实现的话就有点舍近求远了. java 思想实现 在 java

玩转Kotlin 彻底弄懂Lambda和高阶函数

Lambda是什么 简单来讲,Lambda是一种函数的表示方式(言外之意也就是说一个Lambda表达式等于一个函数).更确切的说:Lambda是一个未声明的函数,会以表达式的形式传递 为什么要用Lambda 设想一下,在Android中实现一个View的点击事件,可以使用如下实现: View view = findViewById(R.id.textView); view.setOnClickListener(new View.OnClickListener() { @Override publ

详解Kotlin 高阶函数 与 Lambda 表达式

详解Kotlin 高阶函数 与 Lambda 表达式 高阶函数(higher-order function)是一种特殊的函数, 它接受函数作为参数, 或者返回一个函数. 这种函数的一个很好的例子就是 lock() 函数, 它的参数是一个锁对象(lock object), 以及另一个函数, 它首先获取锁, 运行对象函数, 然后再释放锁: fun <T> lock(lock: Lock, body: () -> T): T { lock.lock() try { return body()

详谈Python高阶函数与函数装饰器(推荐)

一.上节回顾 Python2与Python3字符编码问题,不管你是初学者还是已经对Python的项目了如指掌了,都会犯一些编码上面的错误.我在这里简单归纳Python3和Python2各自的区别. 首先是Python3-->代码文件都是用utf-8来解释的.将代码和文件读到内存中就变成了Unicode,这也就是为什么Python只有encode没有decode了,因为内存中都将字符编码变成了Unicode,而Unicode是万国码,可以"翻译"所以格式编码的格式.Python3中

Javascript 是你的高阶函数(高级应用)

在通常的编程语言中,函数的参数只能是基本类型或者对象引用,返回值也只是基本数据类型或对象引用.但在Javascript中函数作为一等公民,既可以当做参数传递,也可以被当做返回值返回.所谓高阶函数就是可以把函数作为参数,或者是将函数作为返回值的函数.这两种情形在实际开发中有很多应用场景,本文是我在工作学习中遇到的几种应用场景的总结. 回调函数 代码复用是衡量一个应用程序的重要标准之一.通过将变化的业务逻辑抽离封装在回调函数中能够有效的提高代码复用率.比如ES5中为数组增加的forEach方法,遍历

Javascript 高阶函数使用介绍

高阶函数(higher-order function)-如果一个函数接收的参数为或返回的值为函数,那么我们可以将这个函数称为高阶函数.众所周知,JavaScript是一种弱类型的语言:JavaScript的函数既不对输入的参数,也不对函数的输出值作强定义和类型检查,那么函数可以成为参数,也可以成为输出值,这就体现了JavaScript对高阶函数的原生支持. 一.参数为函数的高阶函数: function funcTest(f){ //简易判断一下实参是否为函数 if((typeof f)=="fu

Javascript中的高阶函数介绍

这是一个有趣的东西,这或许也在说明Javascript对象的强大.我们要做的就是在上一篇说到的那样,输出一个Hello,World,而输入的东西是print('Hello')('World'),而这就是所谓的高阶函数. 高阶函数 高阶看上去就像是一种先进的编程技术的一个深奥术语,一开始我看到的时候我也这样认为的. Javascript的高阶函数 然而,高阶函数只是将函数作为参数或返回值的函数.以上面的Hello,World作为一个简单的例子. 复制代码 代码如下: var Moqi = func

JavaScript高阶函数_动力节点Java学院整理

高阶函数英文叫Higher-order function.那么什么是高阶函数? JavaScript的函数其实都指向某个变量.既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数. 一个最简单的高阶函数: function add(x, y, f) { return f(x) + f(y); } 当我们调用add(-5, 6, Math.abs)时,参数x,y和f分别接收-5,6和函数Math.abs,根据函数定义,我们可以推导计算过程为

javascript之典型高阶函数应用介绍二

前言 在前一篇文章javascript之典型高阶函数中主要实现了几个典型的functional函数.文章最后也提出了疑问,为啥那样的实现与F#之类的函数式语言"不太一样"呢?今天来试试更"函数式"的实现. 另一种实现 同样地,尝试对之前实现的函数做一些改动,把for循环去掉.如何去掉呢?这里先要引入一个集合的归纳法定义: 一个集合要么是空集,要么是一个数与一个集合组成的数对从定义可以看到,每一个集合都可以看作为一个数和一个集合的对.例如:{1,2,4,5} 可以认为

C#中的高阶函数介绍

介绍 我们都知道函数是程序中的基本模块,代码段.那高阶函数呢?听起来很好理解吧,就是函数的高阶(级)版本.它怎么高阶了呢?我们来看下它的基本定义: 1:函数自身接受一个或多个函数作为输入 2:函数自身能输出一个函数.  //函数生产函数   满足其中一个就可以称为高阶函数.高阶函数在函数式编程中大量应用.c#在3.0推出Lambda表达式后,也开始慢慢使用了.   目录 1:接受函数 2:输出函数 3:Currying(科里化) 一.接受函数 为了方便理解,都用了自定义. 代码中TakeWhil

javascript之典型高阶函数应用介绍

缘由 虽然以前也使用过javascript语言,但终究是为了配合后端写的一些零零散散的"代码段",更不能说是javascript项目了.很荣幸的是上个月刚到公司正好碰上项目开始推倒重写,我们team从头开始做架构和实现,目的很清楚,为了改进和超越前面的版本.这是个真正意义上的javascript"项目",当然服务端不是我们team来负责啦.这也是我真正开始全职使用javascript来编程.由于之前在学校对形式化方法这门课程比较感兴趣,而javascript又是函数