kotlin自定义项目中公用View

        随着kotlin的推广,越来越多的kotlin文档可以在网上看到,今天就为大家分享一个基本的kotlin自定义view,首先Android studio配置kotlin的开发环境我就不细说了,因为网上类似这种文章太多了,随便一篇都可以帮你搞定。

        开发中对于一些经常用到的控件,都可以考虑封装成一个基本的view,然后在使用的时候直接使用,不需要再一个个控件的组装,不仅节省了开发的时间,代码看起来也会更调理些,下面分享一下我平常封装view的方法,其实在我的第一篇博客里已经有使用,那个自定义的OperateView就是一个View的封装,在那块的使用时为了后续的逻辑处理方便,今天用kotlin的形式来简单封装一下公用View。如果没有看过OperateView的童鞋,可以抽时间看看吐舌头

     可换行的AutoBreakViewGroup扩展

         下面直接上代码:

import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.FrameLayout
import kotlinx.android.synthetic.main.view_add_delete.view.*


/**
 * Created by bobo on 2017/11/29.
 */
open class AddAndDeleteView(context: Context) : FrameLayout(context) {
    init {
        init(context)
    }

    constructor(context: Context,attributes: AttributeSet):this(context){
        init(context,attributes)
    }
    fun init(context: Context,attributes: AttributeSet?=null){
        LayoutInflater.from(context).inflate(R.layout.view_add_delete,this,true)
        initEvent()
    }
    fun initEvent(){
        bt_add.setOnClickListener{
            if(miClickCallBack!=null){
                miClickCallBack.add()
            }
        }
        bt_delete.setOnClickListener{
            if(miClickCallBack!=null){
                miClickCallBack.delete()
            }
        }
    }
    lateinit var miClickCallBack:IClickCallBack
    fun initICallBack(iClickCallBack:IClickCallBack){
        miClickCallBack=iClickCallBack
    }
    interface IClickCallBack{
        fun add()
        fun delete()
    }
}

        首先自定义一个View然后继承于FrameLayout,构造方法的选择:一般在代码中使用的话,我是只重写第一个构造方法,但是如果在xml布局中写的话必须要重写第二个构造方法。如果没有重写的话会报一个android.view.InflateException错误,当你看到这个错误的时候说明就是你xml布局出错了。因为安卓系统解析xml文件的时候,会默认调用第二个构造方法。切记,切记,切记重要的事情说三遍。

        kotlin中可以省去findViewById方法的关键代码import kotlinx.android.synthetic.main.你的布局文件名.*,然后在代码中就不用在写无聊的findViewById()方法,直接控件id.就可以调用。 这个确实比以前的java方便了不少。另外对于bt_add.setOnClickListener{}这种写法,其实是一种叫Lambda表达式和扩展函数结合的写法,如果感兴趣大家也可以去学学,挺方便的。定义一个IClickCallBack接口是为了方便使用接口回调来处理一些自定义View中的点击事件处理逻辑。好了,整体的思路和代码就是这些,最后再来个调用的代码,就结束了,如果也有在使用kotlin开发的童鞋,可以和我一起讨论遇到的问题和难点,我也是新手,呵呵,期待一起进步微笑

bt_click.setOnClickListener{
    zdyView= object : AddAndDeleteView(this@TestActivity){}
    zdyView.initICallBack(object : AddAndDeleteView.IClickCallBack{
    override fun delete() {
        toast("您点击了删除")
    }

        override fun add(){
            toast("您点击了添加")
        }
})
    container.addView(zdyView)

}
          一个简单的点击事件,然后实例化自定义的view,实例化接口对象,实现里面的方法,处理逻辑。完成

当你尝试启动 Nginx 时,如果看到错误信息 `nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)`,这意味着端口 80 已经被其他程序占用。以下是关于这个问题的详细介绍及解决办法: ### 1. 错误含义 Nginx 需要绑定到指定的 IP 地址和端口号(通常是 80 端口),以便能够接受来自外部网络的 HTTP 请求。然而,当另一个服务已经在使用相同的地址和端口时,就会导致这个 "Address already in use" 的错误。 --- ### 2. 解决步骤 #### 步骤一:查找已占用端口的服务 你需要确定哪个程序正在使用 80 端口。可以在终端输入以下命令检查: ```bash netstat -tulnp | grep :80 ``` 或者使用更现代的替代工具: ```bash ss -tuln | grep :80 lsof -i :80 ``` 上述命令会显示类似如下的结果: ``` tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/httpd ``` 其中最后一列展示了进程 ID (`PID`) 和对应的程序名 (`httpd`, Apache Web Server)。 #### 步骤二:停止冲突服务 如果你确认那个占用了 80 端口的服务不需要运行,可以直接将其停止。例如对于 Apache 来说, ```bash sudo systemctl stop httpd # CentOS/RHEL 系统 # 或者 sudo service apache2 stop # Ubuntu/Debian 系统 ``` 然后再次尝试启动 Nginx。 #### 步骤三:更改 Nginx 使用的端口 如果你想保留原有的服务继续在 80 端口运行,可以选择让 Nginx 改为监听其他的非标准端口。编辑 Nginx 配置文件(通常位于 `/etc/nginx/nginx.conf` 或 `/usr/local/nginx/conf/nginx.conf`)找到类似下面的一段,并修改端口号: ```nginx server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } } ``` 改为比如 `listen 8080;` ,保存后重新加载配置: ```bash /usr/local/nginx/sbin/nginx -s reload ``` --- ### 3. 总结 这个错误是因为有多个应用试图在同一时间监听同一个 TCP/IP 地址+端口组合所引起的。按照以上指导可以轻松定位问题根源并采取相应措施予以修复。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值